Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Undo / Redo und Cursor

Begonnen von sascha, Juli 29, 2011, 18:06:36

⏪ vorheriges - nächstes ⏩

sascha

Hallo.

Ich versuche, die Fähigkeit, "undo / redo" im Memotextfeld umzusetzen.

Das ist der Code:

Private Sub Form_Load()

Me.Text0.SetFocus
Me.Text0.SelStart = 0

ReDim arrText(0)
arrText(0) = Me.Text0
Pointer = 0

End Sub

''''''''''''''


Private Sub Text0_Change()

If Undoing Then Exit Sub

Pointer = Pointer + 1

If Pointer > UBound(arrText) Then
  ReDim Preserve arrText(Pointer)
End If

arrText(Pointer) = Me.Text0.Text

End Sub

''''''''''''''


Private Sub Undo_Click()

If Pointer = 0 Then
  Beep

Else

  Pointer = Pointer - 1
  Undoing = True
  Me.Text0 = arrText(Pointer)
  Undoing = False
End If

End Sub

''''''''''''''


Private Sub Redo_Click()

If Pointer = UBound(arrText) Then
  Beep
Else
  Pointer = Pointer + 1
  Undoing = True
  Me.Text0 = arrText(Pointer)
  Undoing = False
End If

End Sub


Der Code funktioniert.
Aber Ich möchte auch den Cursor folgt  "Undo / Redo".
Leider weiss ich nicht, wie man es machen kann...

Ich brauche Hilfe.

Vielen Dank im Voraus!

database

Hi,

ZitatAber Ich möchte auch den Cursor folgt  "Undo / Redo".
??? ??? ???

Was möchtest du?

sascha

Ich möchte, dass der Cursor nach dem Druck des Knopfes "Undo/Redo" neben Buchstaben war, die als nächstes für "Undo/Redo" wird...


MzKlMu

#3
Hallo,
ZitatIch möchte, dass der Cursor nach dem Druck des Knopfes "Undo/Redo" neben Buchstaben war, die als nächstes für "Undo/Redo" wird...
Das ist für mich noch unverständlicher.  ???

Überhaupt ist mir das ganze Vorhaben ein Rätsel.
ZitatIch versuche, die Fähigkeit, "undo / redo" im Memotextfeld umzusetzen.
???
Gruß Klaus

sascha

Ich habe ein Beispiel gemacht...

[Anhang gelöscht durch Administrator]

MzKlMu

Hallo,
bei so wenig Informationsbereitschaft bin ich nicht bereit zu helfen.
Ich habe es trotz Beispeil nicht begriffen, was Du vorhast.
ZitatIch möchte, dass der Cursor nach dem Druck des Knopfes "Undo/Redo" neben Buchstaben war, die als nächstes für "Undo/Redo" wird...
Vieleicht versteht ja jemand anders den Satz.

Das Beispiel läuft übrigens nicht, bringt schon beim Start eine Fehlermeldung.
Gruß Klaus

sascha

Noch ein Versuch...

[Anhang gelöscht durch Administrator]

MzKlMu

Hallo,
und wieder keine weiteren Erläuterungen, ich steige aus ich sehe mir noch nicht mal die DB an.
Mir ist ein solches Verhalten unbegreiflich wenn man Hilfe haben will.
Gruß Klaus

database

Hi,

habe mir dein Beispiel mal kurz angesehen...

Ohne zu wissen, was du damit machen willst ist es - wie auch schon MzKlMu angemerkt hat - unmöglich irgendwas auszusagen.
Nur soviel vielleicht:

Wenn du einen Buttonklick als Auslöser haben willst solltest du auch einen Button verwenden und kein Labelfeld.
Wenn du durchgehend eine Variable in deinem Formular verwenden möchtest muss diese Variable (dein Array) global deklariert werden sonst 'stirbt' sie beim Verlassen der Deklarationsroutine.

Erklär mal was der ganze Codesalat bewirken soll, was du tun willst und was das Programm leisten soll

Deine Aussagen im Telegrammstil in höllischer Grammatik ist für uns UNVERSTÄNDLICH

Somit bin ich bei MzKlMu!


sascha

Das ist aber komisch...

Schauen Sie bitte an, wie der Knopf "Undo"  im Programm "Word" funktioniert.
 
Auch schauen Sie bitte an, wo sich der Cursor nach 'Undo' befindet.
 
Mir ist es notwendig der Cursor genau dasselbe, wie auch im Programm "Word" funktionierte.

Jetzt läuft in meinem Beispiel der Cursor in den Anfang des Textes fort, statt an jener Stelle zu bleiben, wo "Undo" geschehen hat.

MzKlMu

#10
Hallo,
ergänze wie folgt (nach Undoing):
 Undoing = False
 Me.Text0.SelStart = Len(Me.Text0.Text)  '<<<<<<<<

In den beiden Prozeduren.
Und nimm Befehlsschaltflächen statt der Bezeichnungsfelder, wie bereits erwähnt.

PS:
Deinen neuen Erläuterungen entnehme ich, dass Deutsch nicht Deine Muttersprache ist. Das ist nun nichts ehrenrühriges und stört mich auch nicht.
Nur solltest Du das auch hier mitteilen, damit man nicht so harsch reagiert.  ;D
Gruß Klaus

sascha

Vielen Dank... :)

Aber
Me.Text0.SelStart = Len(Me.Text0.Text)

Es hilft nicht, wenn "Undo" in der Mitte des Teхtеs passiert.

Außerdem wird dieser Code nicht funktionieren, wenn der Text mehr als 32k ist...

database

Hallo,

ich glaube, dass die Lösung über ein Array nicht unbedingt zielführend ist.

Sieh mal hier rein:

http://www.freevbcode.com/ShowCode.asp?ID=6561

Das ist ein Beispiel für eine RichText-Box unter VB5 / VB6.

Der Code sollte sich jedoch adaptieren und in eine Access-Form einbinden lassen.

Eventuell musst du ein RTF-Control statt der Memobox verwenden.


sascha

Zitat von: database am Juli 30, 2011, 12:56:38
Hallo,

ich glaube, dass die Lösung über ein Array nicht unbedingt zielführend ist.

Sieh mal hier rein:

http://www.freevbcode.com/ShowCode.asp?ID=6561

Hallo,

leider bin ich keine grosse Expertin.
Diese Lösung berücksichtigt die Position des Cursors?
Ich bin auch nicht sicher, dass "Undo/Redo" funktionieren wird, wenn der Text mehr als 32k ist. (Function Len).

Meine Lösung über ein Array funktioniert gut auch wenn der Text mehr als 32k ist.
Es gibt nur einzige Problem mit dem Cursor.

database

#14
Hallo,

hab' einmal ein wenig herumgebastelt an deinem Projekt. ::)

Für die Fälle ...

Markieren eines Textes und Löschen
Eingeben von Text an einer beliebigen Textstelle und Löschen

.... sollte Undo / Redo wie gewünscht funktionieren.

Für andere Spezialfälle (Markieren eines Textes und überschreiben, etc.)
musst du den Code halt noch entsprechend anpassen.

Die Problematik bei der Aufgabenstellung ist die, dass immer die Startposition des Cursors VOR einer Änderung und der Umfang der Änderung festzustellen ist.
Dieses wird mit  ...  Textfeld.SelStart  ....   und   Textfeld.SelLength ... ausgelesen.
Wurde die Änderung durchgeführt und klickt man auf UNDO, dann muss der Text wiederhergestellt und der gelöschte und wieder hergestellte Bereich wiederum markiert werden (wie bei Word)
Bei Redo muss der Cursor am Ende der Änderung stehen und blinken.

Änderungen habe ich im Modul und in den Formularcodes durchgeführt.
Ausserdem habe ich diese leidigen Labelfelder durch Buttons ersetzt.  ;)

HTH

[Anhang gelöscht durch Administrator]