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!
Hi,
ZitatAber Ich möchte auch den Cursor folgt "Undo / Redo".
??? ??? ???
Was möchtest du?
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...
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.
???
Ich habe ein Beispiel gemacht...
[Anhang gelöscht durch Administrator]
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.
Noch ein Versuch...
[Anhang gelöscht durch Administrator]
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.
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!
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.
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
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...
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 (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.
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 (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.
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]
Zitat von: database am Juli 30, 2011, 17:42:32
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.
Ja, für den Fall ...
"Markieren eines Textes und Löschen" Undo / Redo wie gewünscht funktionieren.
Aber im zweiten Fall, wird der Code nicht korrekt funktionieren.
Der Cursor geht vor der gewünschten Position aus. Auch machen Sie Undo/Redo, dann noch Undo/Redo mehrere Male. Der Cursor wird weiter und weiter weg.
Ausserdem wird der Cursor ausgeführt, wenn Sie in den endgültigen Text in der Mitte oder am Anfang des Textes ein paar Buchstaben löschen, und dann mit Hilfe von Undo wiederherstellen...
In Word und anderen Texteditoren wird jeweils die Zeilen- und die Spaltenposition des Cursors erfasst und i.d.R. auch angezeigt. Somit lässt sich diese auch speichern und wiederherstellen.
Für eine Textbox sowie auch für einen simplen String (Inhalt der Textbox) gibt es eine solche Möglichkeit nicht.
ZitatMir ist es notwendig der Cursor genau dasselbe, wie auch im Programm "Word" funktionierte.
Da man in Umgebungen, wo Access verwendet wir, mit hoher Wahrscheinlichkeit Word vorhanden ist, lautet mein Tipp dann regelmäßig, das Original zu verwenden statt das Original nachzubauen. Da kann man dann gleich die vielen anderen Möglichkeiten verwenden, die man auch kennt und irgendwann haben will. An der Stelle ist selbst ein RTF-Steuerelement ein verzichtbarer Kompromiss.
Falls einem wichtig ist, das Dokument innerhalb eines Accessformulares zu sehen und zu steuern, könnte man auf den DSO Framer zurückgreifen. Richtig ist, dass man dazu einiges an VBA braucht.
MfGA
ebs
Hallo,
ZitatJa, für den Fall ...
Na, das ist ja schon mal ein sehr guter Ansatz.
ZitatAber im zweiten Fall, wird der Code nicht korrekt funktionieren
Im zweiten Fall gibt es verschiedene Möglichkeiten wie der Text geändertwerden KÖNNTE.
Demnach ändern sich auch die Möglichkeiten der Wiederherstellung.
ZitatDer Cursor geht vor der gewünschten Position aus ...
Hast du gelesen und auch verstanden, was ich hier geschrieben habe?
Zitat
Für andere Spezialfälle (Markieren eines Textes und überschreiben, etc.)
musst du den Code halt noch entsprechend anpassen.
Wenn zumindest einer der Anwendungsfälle wie gewünscht funktioniert, habe ich dir einen Weg gezeigt wie
DU weitermachen
KÖNNTEST.
Zitatleider bin ich keine grosse Expertin
Niemand erwartet hier Fragen nur von grossen Experten - so ist es nicht weiter schlimm, wenn man um Rat und Hilfe fragt. ;)
ABER ich glaube nicht, dass ich mich hinsetze und
deine Aufgabenstellung vollständig löse - und das ist eine Tatsache.
Du kannst hier so weit es geht Rat und Hilfe erwarten und wirst sie in der Regel auch bekommen - fertige Lösungen habe
ich zumindest keine im Sonderangebot.
Das heißt mehr oder weniger dass du ganz viel
Eigeninitiative an den Tag legen darfst, wenn du zu einem fertigen Ergebnis kommen willst.
Wie auch ebs17 schon angedeutet hat handelt es sich bei Access um kein Textverarbeitungsprogramm und du wirst IMMER Kompromisse eingehen müssen,
wenn du in einer Datenbankanwendung Eigenschaften und Funktionalitäten einer Textverarbeitung verwenden willst.
Geht es für dich um die reine Programmiererei der Redo/Undo - Funktionalität bin ich davon überzeugt, dass
VBA für DEINE Zwecke eher ungeeignet sein wird.
Schönen Sonntag
HTH
Zitat von: database am Juli 31, 2011, 09:10:34
Wenn zumindest einer der Anwendungsfälle wie gewünscht funktioniert, habe ich dir einen Weg gezeigt wie DU weitermachen KÖNNTEST.
Hallo.
Vielen Dank.
Natürlich werde ich versuchen, Ihre Idee zu verwenden.
Aber wie ich verstehe, ist dies nicht der einfachste Weg...
Was denken Sie, wenn man die Position des Cursors auch über ein Array irgendwie aufsparen kann?
Ist es möglich?
Hallo,
ZitatVielen Dank
Bitte, keine Ursache!
ZitatAber wie ich verstehe, ist dies nicht der einfachste Weg...
Na so schwierig ist das aber auch wieder nicht ...!
"...auch über ein Array irgendwie aufsparen kann..."
Ja, die Werte, die mit Me!Text0.SelStart .... Me!Text0.SelLength ... gelesen werden können in ein Array geschrieben und von dort auch wieder gelesen werden.
Dabei kann es sich auch um ein mehrdimensionales Array handeln.
Ich habe sie der Einfachheit wegen in eine globale Variable gespeichert.
Mir ist einfach der Sinn und Zwecke dieser ganzen Aktion nicht klar.
Willst du eine Textverarbeitung in VBA schreiben oder was soll denn das Ganze werden?
Zitat von: database am Juli 31, 2011, 13:55:08
Willst du eine Textverarbeitung in VBA schreiben oder was soll denn das Ganze werden?
Hallo,
nein, will ich keine Textverabeitung in VBA schreiben, aber warum die einfachen Funktionen wie Undo/Redo in solches einfache Memo-Feld nicht zu ergänzen?
Natürlich, wäre es angenehm auch die Schrift usw zu ändern., aber dann muss man ein RTF-Control statt der Memobox verwenden.
Vielleicht in der Zukunft werde ich versuchen, mit diesem Control zu arbeiten.
Interessanterweise eine Begrenzung der Anzahl der Buchstaben in diesem RTF-Control?
Ich habe shon versucht die Position des Cursors auch über ein Array aufzusparen.
Es funktioniert!
Es ist nur notwendig. alle möglichen Fälle berücksichtigen...
Vielen, vielen Dank für Ihre Geduld... :)
Hallo,
"eine Begrenzung der Anzahl der Buchstaben in diesem RTF-Control"
ist mir nicht bekannt
ZitatEs ist nur notwendig. alle möglichen Fälle berücksichtigen...
Das habe ich geschrieben - ob nun mit oder ohne Array... ;)
Trotz Allem - wozu dieser Aufwand, Textverarbeitung sollte in einem Textprogramm passieren und nicht in einer Datenbankanwendung ::)
Hallo,
muß es unbedingt ein memo-Feld sein?
Oder ist auch ein ole-Feld denkbar?
Dann könntest Du den Word Text dort rein setzen und via Formular darin bearbeiten, wobei Dir alle Word-Optionen offenstehen: u.a. auch undo
Beispiel im Anhang
Harald
[Anhang gelöscht durch Administrator]
Zitat von: database am August 01, 2011, 14:19:02
ZitatEs ist nur notwendig. alle möglichen Fälle berücksichtigen...
Das habe ich geschrieben - ob nun mit oder ohne Array... ;)
Hallo,
Jetzt ist alles gut funktioniert.
Aber es gibt einen Fall, wo der Cursor nicht an der richtigen Stelle bleibt, wo "Undo" geschehen hat..
Wenn der Text mehr als 32k, ist der Code
Me.Text0.SelStart = arrCurs(PointerC) nicht funktioniert:
Private Sub Undo_Click()
If Pointer = 0 Then
Beep
Else
Pointer = Pointer - 1
PointerC = PointerC - 1
Undoing = True
Me.Text0 = arrText(Pointer)
Me.Text0.SelStart = arrCurs(PointerC)
Undoing = False
End IfDas Problem ist, dass
SelStart funktioniert nicht, wenn der Text mehr als 32k ist.
Wie kann man dieses Problem lösen?
Zitat von: sascha am August 02, 2011, 17:09:12
Wenn der Text mehr als 32k, ist der Code Me.Text0.SelStart = arrCurs(PointerC) nicht funktioniert:
Hi
Damit hast Du bestätigt, was microsoft schreibt:
"The SelStart property uses an
Integer in the range 0 to the total number of characters in a text box or text box portion of a combo box."
Zu finden auf: http://msdn.microsoft.com/en-us/library/aa196578(v=office.11).aspx
Harald
Zitat von: bahasu am August 02, 2011, 17:56:19
"The SelStart property uses an Integer in the range 0 to the total number of characters in a text box or text box portion of a combo box."
Hallo,
vielen Dank.
Aber ich wusste davon.
Deshalb fragte ich Peter, ob es möglich ist, für diesen Fall eine andere Lösung zu finden...
Hallo,
Zitat... für diesen Fall eine andere Lösung zu finden ...
Ich fürchte fast - nein
... und weise gleichzeitig nochmals darauf hin, dass VBA für die vollständige Lösung solcher Programmieraufgaben kaum die geignetste Sprache ist. ;)