Hallo Stefan,

ich erlaube mir mal ein paar Gedanken, quasi als Anregung ...

Stefan Weigel schrieb:
> Dafür, dass es offenbar jetzt noch keine Lösung gibt, habe ich erst
> mal ein  :-(.

Ich würde überlegen Deinen Nutzern ein angepasste Oberfläche zur
Verfügung zu stellen, da wäre das kein unlösbares Problem, wenn Du es
selbst programmierst, da du eine Schleife einbauen kannst.(*)
Obwohl ich eigentlich nicht für Undo wäre sondern vielmehr für Rücknahme
der Aktionen des Makros, was im Zweifel mehr/anders sein kann als das
was vom Undo erfasst wird, aber auch wegen der begrenzten Anzahl der
Undo-Schritte auf unbekannten Systemen.
Insgesamt könntest Du auch versuchen eine Lösung erstellen die besser
auf Deine konkreten Bedürfnisse passt als es die Umsetzung des issues
können wird, wenn Du nämlich sämtliche Makros so ausführst wie
untenstehend beschrieben und statt nur den Startpunkt auch den Endpunkt
'markierst'.
Dann kannst Du prinzipiell (mittels Listener) erkennen wann ein
manuelles Undo des Nutzers dazu führt das eine Aktion rückgenommen wird
die einen Start- oder Endpunkt Deines Makros kennzeichnet und kannst mit
einer Abfrage reagieren und falls der Nutzer will dann alle Schritte die
Dein Makro bewirkt hat rückgängig machen, entweder durch einfaches
Wiederholen von Undo, oder durch wirkliche Rücknahme der Makroaktionen.
Dieser Vorschlag wäre also für den Nutzer äußerst bequem und erforderte
kein Umdenken, er drückt nur Undo wie gewohnt und stößt er auf ein Makro
kommt Dein Meldungsfenster und er kann sofort das gesamte Makro
zurücknehmen oder schrittweise fortfahren.
Das einzige Problem ist das ich derzeitig nicht weiß ob und wie gezielt
zu erkennen ist das der Nutzer das Undo-Ereignis auslöst, mir scheint
aber das müßte möglich sein.


Ansonsten habe ich den issue gelesen und halte das für garnicht so
einfach, weil:
ein 'Undo für Makros' ist inhaltlich etwas Anderes als ein 'Undo für die
in der Undo-Liste vermerkten Aktionen' die ein Makro bewirkt hat.

Oder anders gesagt:
der Nutzer wird bei einem Undo erwarten das wenn er bis zu einem
bestimmten Punkt zurückgeht, der vor Start des Makros lag, das dann die
Situation so ist wie sie wäre wenn das Makro niemals gestartet worden
wäre, da kommt man aber nicht zwangsläufig hin wenn man nur die
Undo-Einträge zurücknimmt.




Gruß
Jörg


(*)
Nein, das ist garnicht so kompliziert, Du brauchst nur als ersten
Schritt des ursprünglichen Makros eine definierte Änderung im Dokument
durchzuführen, diese im zweiten Schritt wieder aufzuheben und kannst
dann für eine selbstprogrammierte Undo-Aktion, das Undo in einer
Schleife solange laufen lassen bis Du auf die Änderung stößt und dann
noch einen Schritt weiter zurückgehen. (Voraussetzung es sind genügend
Undo-Schritte unter Extras-Optionen eingestellt)
Du müßtest eine 'zuverlässige' Aktion wählen, aber als rein gedankliche
Demo für ein Calcdokument reicht beispielsweise:

ursprüngliches Makro:

Sub Main()
ThisComponent.Sheets(0).getCellRangeByName("IV65536").String = "BlaBla"
ThisComponent.Sheets(0).getCellRangeByName("IV65536").String = ""
'weiterer Code
'...
End Sub

Makro zum Undo:

'...
dim document   as object
dim dispatcher as object
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
Do While ThisComponent.Sheets(0).getCellRangeByName("IV65536").String <>
"BlaBla"
   dispatcher.executeDispatch(document, ".uno:Undo", "", 0, Array())
Loop
'ersten Schritt des Ausgangsmakros rückgängig machen
dispatcher.executeDispatch(document, ".uno:Undo", "", 0, Array())

Das Ganze hat natürlich oben genannte Nachteile des (reinen) Undo.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Antwort per Email an