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

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...

ebs17

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

database

#17
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

sascha

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?

database

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?

sascha

#20
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... :)

database

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  ::)


bahasu

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]
Servus

sascha

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 If

Das Problem ist, dass SelStart funktioniert nicht, wenn der Text mehr als 32k ist.
Wie kann man dieses Problem lösen?

bahasu

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
Servus

sascha

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...

database

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.  ;)