PDA

View Full Version : سوال: undo



ali-software
سه شنبه 31 شهریور 1388, 14:21 عصر
سلام دوستان . چطور می تونم در یک تکست باکس به وسیله ی یک کامند دکمه ی undo رو به وجود بیارم.لطفا کامل توضیح بدید.

xxxxx_xxxxx
سه شنبه 31 شهریور 1388, 14:51 عصر
http://barnamenevis.org/forum/showpost.php?p=575907&postcount=238

ali-software
سه شنبه 31 شهریور 1388, 16:02 عصر
میشه یک توضیح بدید.از راه دیگری نمیشه این کار رو انجام داد.لطفا کمک کنید.

xxxxx_xxxxx
سه شنبه 31 شهریور 1388, 19:34 عصر
خب راه استاندارد همین هست که خود سیستم عامل هم همین کارو میکنه. یعنی با تابع SendMessage و ثابت EM_UNDO که برای همین کار هست.

حالا اگر شما می خواید از یک روش دیگه این کارو بکنید کار خودتون رو سخت می کنید. مثلاً میتونید تو رویداد Change تکست باکس تغییرات رو تو یک متغییر ذخیره کنید. و بعد موقع Undo کردن اون تغییرات رو برگردونید.

pcdownload.bloghaa.com
سه شنبه 31 شهریور 1388, 19:48 عصر
اصلا هم اینطور نیست کافیست کمی فکر کنید
راحت ترین روش کد زیر است:

Private Sub Command1_Click()
Text1.SetFocus
SendKeys "^{z}"
End Sub

MohammadGh2011
جمعه 13 آبان 1390, 11:45 صبح
سلام عليکم
خوب کدهايي که اين دوستان قرار دادند فقط براي يک بار ميشه Undo رو انجام داد.
يعني عمل آخري که ما روي تکست باکس انجام داديم رو برميگردونه.
اگه بخوايم تا اون جايي که ما از اول اين تکست باکس رو برگردونيم به حالت اول بايد چه کاري رو انجام بديم؟

محسن واژدی
جمعه 13 آبان 1390, 13:39 عصر
سلام
کد زیر عمل undo/redo را تا بینهایت انجام میدهد اما خیلی تست نشده، ولی خب، میتوانید از آن به عنوان الگوی پایه استفاده کنید
برای بررسی، یک TextBox و دوتا commandbutton با نام های Text1,Command1 و Command2 بر روی فرم ایجا کنید، سپس دستورات زیر را در فرم فرم کپی کنید:

Option Explicit
Dim UndoRedo$()
Dim lUdo%
Dim prev_txt$
Private Sub Command1_Click()
lUdo% = lUdo% - 1
If lUdo% >= 0 Then
Text1 = UndoRedo$(lUdo%)
Text1.SetFocus
Else
lUdo% = 0
End If

End Sub


Private Sub Command2_Click()
lUdo% = lUdo% + 1
If lUdo% <= UBound(UndoRedo$) Then
Text1 = UndoRedo$(lUdo%)
Text1.SetFocus
Else
lUdo% = UBound(UndoRedo$)
End If
End Sub


Private Sub Form_Load()
Command1.Caption = "Undo"
Command2.Caption = "Redo"
Undo 46
End Sub

Private Sub Text1_KeyPress(KeyAscii As Integer)
Undo KeyAscii
End Sub

Sub Undo(KeyAscii%)
Dim sv_chng As Boolean
If lUdo% = 0 Then
ReDim UndoRedo$(0)
End If
If KeyAscii = 46 Or KeyAscii = 8 Or Mid(Text1, 1, Len(prev_txt$)) <> prev_txt$ Then
sv_chng = True
If UBound(UndoRedo$) > lUdo% And lUdo% > 0 Then
Dim i%
For i% = lUdo% + 1 To UBound(UndoRedo$)
UndoRedo$(i%) = Empty
Next i%
End If
lUdo% = lUdo% + 1
ReDim Preserve UndoRedo$(lUdo%)
Caption = "New write..." & " : " & lUdo%
ElseIf Len(prev_txt$) <> Len(Text1) Then
sv_chng = True
Caption = "Rewrite..." & " : " & lUdo%
End If
If sv_chng Then

'If prev_txt$ <> Text1 Then
prev_txt$ = Text1
UndoRedo$(UBound(UndoRedo$)) = Text1
'End If
End If
End Sub

Private Sub Text1_KeyUp(KeyCode As Integer, Shift As Integer)
Undo KeyCode
End Sub



موفق باشید

MohammadGh2011
جمعه 13 آبان 1390, 15:04 عصر
سلام

عمل undo/redo را تا بینهایت انجام میدهد اما خیلی تست نشده
ممنونم
يه جورايي کار ميکنه.!

mr-adler
جمعه 13 آبان 1390, 17:29 عصر
سلام
اگه منظور از undo پاک کردن اخرین حرف نوشته شدست بنده یه ماشین حساب ساده طراحی کرده بودم و کد دکمه undo رو به صورت زیر نوشته بودم:

On Error Resume Next
textlen = Len(Text1.Text)
Text1.Text = Mid(Text1.Text, 1, textlen - 1)

MohammadGh2011
جمعه 13 آبان 1390, 18:16 عصر
سلام
اگه منظور از undo پاک کردن اخرین حرف نوشته شدست بنده یه ماشین حساب ساده طراحی کرده بودم و کد دکمه undo رو به صورت زیر نوشته بودم:
سلام عليکم
خير به اين صورت که فرموديد نميخواهم.اگه به عنوان تاپيک توجه ميکرديد ميفهميديد که من چي ميخوام
کد آقاي واژدي همون طوريه که ميخواستم.اگه موقع استفاده از کد ايشون در برنامم به خطايي برخورد کردم .سوالم رو همين جا ميپرسم.


موفق باشيد

mr-adler
جمعه 13 آبان 1390, 19:15 عصر
خير به اين صورت که فرموديد نميخواهم.اگه به عنوان تاپيک توجه ميکرديد ميفهميديد که من چي ميخوام
:خجالت: توجه کردم اما متاسفانه معنی کلمه undo رو نمیدونستم . گویا میشه همون ctrl+z خودمون:لبخند:
راستی کدی که تو پست 9 نوشتم مربوط به backspace بود:خجالت:
عذر میخوام اگه (معنای کلمه + منظورتو) رو متوجه نشدم و اشتباه نوشتم...:خجالت::قلب:

MohammadGh2011
جمعه 13 آبان 1390, 22:41 عصر
سلام عليکم

توجه کردم اما متاسفانه معنی کلمه undo رو نمیدونستم . گویا میشه همون ctrl+z خودمون
بله همين طوره.

عذر میخوام اگه (معنای کلمه + منظورتو) رو متوجه نشدم و اشتباه نوشتم...
خواهش ميکنم جناب mr-adler