INFO: Writer Suchen und Ersetzen in Selektion

Alles zur Programmierung im LibreOffice.
Antworten
DavidG
Beiträge: 114
Registriert: Do 22. Mär 2018, 21:41

INFO: Writer Suchen und Ersetzen in Selektion

Beitrag von DavidG » Sa 7. Jul 2018, 21:41

Hallo,

nach einiger Suche habe ich im englischen Forum eine Lösung
zu diesem Thema gefunden, wie man in einem markierten Textbereich Zeichen
mittels eines Arrays auszuwechseln kann.

Code: Alles auswählen

REM Suchen und Ersetzen in einem markiertem Bereich
REM Quelle: forum.openoffice.org/en/forum/viewtopic.php?f=20&t=39966#p183751
Sub Replace2()
Dim oDoc,oText,oVC,oStart,oEnd,oFind,FandR
oDoc = ThisComponent : oText = oDoc.Text
oVC = oDoc.CurrentController.getViewCursor
    aFind = Array("A", "B","C" ,"D")
    aReplace = Array("1", "2", "3", "4")
   aRayCount = 0
   While aRayCount <= uBound(aFind)
      oStart = oText.createTextCursorByRange(oVC.Start)
      If Not oVC.isCollapsed then oEnd = oText.createTextCursorByRange(oVC.End)
         FandR = oDoc.createReplaceDescriptor
         With FandR
            .SearchString = aFind(aRayCount)
            .ReplaceString = aReplace(aRayCount)
            .SearchWords = false
         End With
      If isEmpty(oEnd) then 'Do whole document.
           oDoc.replaceAll(FandR)
      Else 'Do selection.
           Do
               oFind = oDoc.FindNext(oStart.End,FandR)
               If isNull(oFind) then Exit Do
               If oText.compareRegionEnds(oFind,oEnd) < 0 then Exit Do
               oFind.setString(FandR.ReplaceString)
               oFind = oDoc.FindNext(oFind.End,FandR)
          Loop
      EndIf
   aRayCount = aRayCount + 1
    Wend      
End Sub
Gruß

David
___________________
WIN 10 PRO
LO 6.0.4.2 32-Bit



balu
Beiträge: 285
Registriert: Mi 1. Jun 2011, 16:21

Re: INFO: Writer Suchen und Ersetzen in Selektion

Beitrag von balu » So 8. Jul 2018, 03:06

Moin moin David,

freu dich blos nicht zu früh!

Du kennst und hast das Buch von Thomas Krummbein und übersiehst gleich zu Anfang diese gefährliche Zeile?

Code: Alles auswählen

Dim oDoc,oText,oVC,oStart,oEnd,oFind,FandR
Ich hoffe doch das Du das so nicht übernommen hast. Denn einerseits sind alle Variablen automatisch mit den Typ VARIANT deklariert worden, und anderseits fehlt da nicht noch eine Variable?
aFind sehe ich dort nicht, sie ist also nicht deklariert.

Also ich würde diese Zeile so interpretieren, das eigentlich bis auf die letzte alle vom Typ OBJECT sein sollen, siehe den Vorbuchstebe das kleine o.


Bitte gewöhne dir am besten folgende Methode an, da diese nicht nur für mehr Übersichtlichkeit sorgt, sondern auch Fehler vermeiden kann.

1.
Es können durchaus mehrere Variablen vom verschiedenen Typ in ein und dergleichen Zeile stehen. Dann aber bitte IMMER mit ihrem dazugehörigen Typ. Das ist so gesehen sogar Gesetzt. Und wir wissen was passiert wenn man Gesetze nicht beachtet, man wird bestraft. :?

2.
Nimm am besten für jeden Variablentyp eine eigene Zeile. Besonders dann, wenn sie zu lang wird.

3.
Arrays vom Typ VARIANT müsen nicht zwingend als solche deklariert werden, das geschieht automatisch.

Hier mal die eben angemäääckerte Zeile so wie ich sie mindestens schreiben würde.

Code: Alles auswählen

Dim oDoc as Object, oText as Object, oVC as Object, oStart as Object
Dim oEnd as Object, oFind as Object, oFandR as Object
Dim aFind
Wobei ich FandR als oFandR deklariert habe, weil es sich ja beim createReplaceDescriptor um ein Object handelt.

Achtet man nicht von vorneherein auf solche elementar wichtigen Details, dann kann das über kurz oder lang sehr schnell unangenehm werden, und zwar richtig unangenehm. Das kann von einer Fehlermeldung bis hin zu falschen Rechenergebnissen führen die man nicht sofort auf die schnelle identifizieren kann. Und wer weiss, vielleicht werden in deinem Fall sogar falsche Buchstaben/Zeichen getauscht. Und dann guckst Du ziemlich blöde drein :shock:



Gruß
balu

DavidG
Beiträge: 114
Registriert: Do 22. Mär 2018, 21:41

Re: INFO: Writer Suchen und Ersetzen in Selektion

Beitrag von DavidG » So 8. Jul 2018, 12:58

Hallo Balu,

ich gebe Dir in allen Punkten recht und in meinen Codes
deklarierre ich korrekt und ausführlich.
Auch "Option Explicit" verwende ich (bis auf ein paar Ausnahmen) eigentlich grundsätzlich.

Habe den Code 1:1 aus dem englischen Forum kopiert und mit Erfolg ausprobiert.

Bin gerade dabei, den Code zu überarbeiten und habe die Absicht diesen hier in
ausreichend kommentierter Form vorzustellen.

Gruß

David
___________________
WIN 10 PRO
LO 6.0.4.2 32-Bit

balu
Beiträge: 285
Registriert: Mi 1. Jun 2011, 16:21

Re: INFO: Writer Suchen und Ersetzen in Selektion

Beitrag von balu » So 8. Jul 2018, 16:06

Hallo David,
ich gebe Dir in allen Punkten recht
Danke :-)

und in meinen Codes deklarierre ich korrekt und ausführlich.
Na dann schwingen wir ja auf der selben Wellenlänge.


Auch "Option Explicit" verwende ich (bis auf ein paar Ausnahmen) eigentlich grundsätzlich.
Und schon sind wir wieder etwas entzweit, aber nur etwas. Oder sind wir gar nicht so verschieden?
Diese Option ist wohl ganz gut und schön, aber sie kann auch fürchterlich nerven. Ich weiss schon gar nicht mehr wann ich zu letzt damit gearbeitet habe. Aber für Anfänger in der Programmierung ist sie schon eine große Hilfe, weil sie einem dazu zwingt mehr sorgfallt in die Programmierung zu legen.

In meiner Online-Hilfe gibt es ja dazu ein Beispiel an Hand einer Schleife. Also eine For..Next. Und in diesem Zusammenhang habe ich mir auch etwas angewöhnt, was vielleicht nicht viele, oder alle machen. Da wird dann meistens nach folgendem Schema gearbeitet.

Code: Alles auswählen

For i = 0 to ...
...
next i
Und wenn dann ein paar Zeilen weiter wieder eine Schleife kommt, dann wird die neue genau so wieder geschrieben.

Ich sag ja nicht, das dies nicht funktioniert. Aber wenn man sich angewöhnt immer die gleiche, ich sags mal so; Temporäre Variable, benutzt, dann wird man sehr schnell bei mehrfach verschachtelten Schleifen den Überblick verlieren.

Deshalb habe ich mir angewöhnt dieser Variablen bei jeder neuen Schleife einen anderen Namen zu geben. Mal ist sie auf den ersten Blick selbstredend, und mal ist sie nur ein kryptisches Kürzel, kommt auf die Situation drauf an. Aber sie unterscheiden sich halt doch. Und bei mehrfach Verschachtelte Schleifen kann das nur von Vorteil sein, den Unterschied schnell zu erkennen.

Aber nun gut, das ist jetzt nur ein weiterer Informationsaustausch.

Habe den Code 1:1 aus dem englischen Forum kopiert und mit Erfolg ausprobiert.

Bin gerade dabei, den Code zu überarbeiten
Das ist ja sehr viel Wert, wenn man etwas greifbares zum Testen hat, um ihn auch selber anpassen zu können.

und habe die Absicht diesen hier in
ausreichend kommentierter Form vorzustellen.
Na das ist doch echt Klasse von dir. *Groß-Lob*
Auch wenn es nur ein kleiner und kurzer Code ist, so ist er dann aber nicht minder Hilfreich. Manchmal heisst es ja nicht umsonst: "In der Kürze liegt die Würze" :-D

Ach übrigens.
Ich kenne das Buch nicht. Aber dafür kenne ich den Autor, aus einem anderem Forum wo er lange sehr aktiv tätig war. Und von daher kann ich persönlich sagen, das er echt Ahnung hat.

Selber arbeite ich fast ausschließlich nur mit Makros in Calc, und kenne mich also nicht so mit Makros für den Writer aus. Diese Lücke muss ich aber später auch mal etwas kleiner machen, da mir so ein paar Projekte im Kopfe rumgeistern die sich nur mit Hilfe von "Writer-Makros" schließen lassen obwohl es primär um "Calc-Makros" geht. Aber das ist ein ganz anderes Thema.


Wir werden uns bestimmt über deine Überarbeitete Version freuen. :)



Gruß
balu

DavidG
Beiträge: 114
Registriert: Do 22. Mär 2018, 21:41

Re: INFO: Writer Suchen und Ersetzen in Selektion

Beitrag von DavidG » So 8. Jul 2018, 21:23

Hallo Leserinnen und Leser,

wie ich Balu bereits mitteilte habe ich den zuvor geposteten Code
überarbeitet und gleich zum Ausprobieren in eine Datei gepackt.
Getestet habe ich den Code unter LO 6.0.4.2 und AOO 4.1.5.
Hinweis:
Ich habe den Code nur in kleineren Dokumenten ausprobiert.
Es kann bei umfangreicheren Dokumenten sein, das die Ausführung
zu stoppen scheint. Diese liegt dann daran, dass die Schleife zum Suchen und Ersetzen mehrfach
durchlaufen wird. Also entsprechend zeitaufwendig ist.
Nur Geduld und eine zuvor gespeicherte Sicherungskopie kann auch nicht schaden!

Was kann dieser Code:
  1. Er sucht innerhalb eines markierten Textbereiches nach Treffern, welche in einem im Code angegeben Sucharray (mFind) gespeichert sind. Im Beispielcode sind es die Buchstaben A, B, C, D
    Es wird zwischen Groß- und Kleinschreibung unterschieden. Möchte man dieses abstellen, dann muss im Suchobjekt (oFandR) der Befehl .SearchCaseSensitive=True, auf .SearchCaseSensitive=False gesetzt werden:

    Codeausschnitt zur Objektvariablen oFandR:

    Code: Alles auswählen

    With oFandR
    	.SearchString = mFind(nRayCount)		' Suchstring per Übergabe aus Such-Array (mFind)
    	.ReplaceString = mReplace(nRayCount)		' Ersetzungsstring per Übergabe aus Ersetzungs-Array (mReplace)
    	.SearchWords = false' Wörter suchen, NEIN
    	.SearchCaseSensitive=True		' Unterscheidung Groß- und Kleinschreibung = True
    End With 


    Wurde ein Treffer gefunden, wird dieser durch den Inhalt des „Ersetzungs-Arrays“ (mReplace) ersetzt. Im Beispielcode sind es die Ziffern 1,2,3,4.
    Daraus folgt, dass die Großbuchstaben wie folgt ersetzt werden:
    A → 1
    B → 2
    C → 3
    D → 4
    Das Such-Array, als auch das Ersetzungs-Array können beliebig erweitert werden. Es ist aber darauf zu achten, dass beide Array die gleiche Anzahl von Feldern enthalten. Die Zählung der Felder beginnt immer bei 0.
    mFind(0) = „A“
    mReplace(0)=“1“
    mFind(1) = „B“
    mReplace(1)=“2“

    Feld 0 wird mit Inhalt von Feld 0 ersetzt.
    Feld 1 wird mit Inhalt von Feld 1 ersetzt.
    usw.
    Dieses ergibt sich aus dem Schleifendurchlauf im Code.
  2. Sollte einmal kein Textbereich markiert sein, erfolgt eine Abfrage in Form einer Messagebox (OK/ Abbrechen). Hier gibt es dann die Möglichkeit zu entscheiden, ob die Ersetzung auf das gesamten Dokument angewendet werden soll.
    OK = Es wird im gesamten Dokument gesucht und ersetzt
    ABBRECHEN= Das Programm wird beendet

Alles weitere ist den Kommentaren im Code zu entnehmen.

@Balu
Balu hat geschrieben:Aber für Anfänger in der Programmierung ist sie schon eine große Hilfe, weil sie einem dazu zwingt mehr sorgfallt in die Programmierung zu legen.
a) Nun, ein Anfänger bin ich nicht, aber ich lerne gerne dazu.
b) Quick 'n dirty kann jeder. Doch spätesten wenn man mit Dialoge und über mehrere Module hinweg arbeitet, dann
ist Sorgfalt, selbstredende Variablen, korrekte Deklaration, usw. nahezu zwingend erforderlich. Oder man ist ein Supergenie
in Sachen Programmierung. Ein Genie bin ich nicht, sondern Autodidakt und ich weiß mir zu helfen.
Z.B.
Das Thema "Option Explicit" wird immer wieder diskutiert. Aus meiner Sicht soll es jeder so halten wie er es möchte.
Es ist zwar nervig wenn bei Ausführung immer wieder eine Fehlermeldung aufpoppt, noch nerviger finde ich es nach einem
Fehler u.U. über mehrere Module hinweg zu suchen und ggf. den Wald vor lauter Bäumen nicht mehr sieht.
"Option Explicit" würde in diesem Fall unmittelbar die Zeile anzeigen, wo der Fehler verborgen ist.
Oftmals nur ein dummer Schreibfehler, eine falsche Deklaration oder ähnliches.
Deshalb nutze ich die Option "Option Explicit" gern, weil letztendlich hilfreich.
Naja, jedem das Seine... :)
Balu hat geschrieben:In meiner Online-Hilfe gibt es ja dazu ein Beispiel
Wo finde ich diese Hilfe?
Selbstverständlich kann man die gleichen Zähler-Variablen in aufeinanderfolgenden Schleifen verwenden.
Man muss sie nur an der entsprechenden Stelle richtig initialisieren.
Balu hat geschrieben:Ich kenne das Buch nicht. Aber dafür kenne ich den Autor, aus einem anderem Forum wo er lange sehr aktiv tätig war. Und von daher kann ich persönlich sagen, das er echt Ahnung hat.
Ja, von Thomas, als auch von Dir habe ich schon sehr viel gelernt und bin Euch sehr dankbar. :)
Balu hat geschrieben:Selber arbeite ich fast ausschließlich nur mit Makros in Calc, und kenne mich also nicht so mit Makros für den Writer aus.
Dann ist dies das Richtige für Dich, zumindest in Teilen: ;)
Suchen und Ersetzen mit Auswahl.odt
(14.5 KiB) 5-mal heruntergeladen

Viele Grüße und Vergnügen

David
___________________
WIN 10 PRO
LO 6.0.4.2 32-Bit

balu
Beiträge: 285
Registriert: Mi 1. Jun 2011, 16:21

Re: INFO: Writer Suchen und Ersetzen in Selektion

Beitrag von balu » So 8. Jul 2018, 23:15

Hallo David,
a) Nun, ein Anfänger bin ich nicht, aber ich lerne gerne dazu.
In sachen Makroprogrammierung unter LO, bist Du das schon. Was jetzt aber nicht negativ oder böse gemeint ist.

b) Quick 'n dirty kann jeder.
Korrekt.

Doch spätesten wenn man mit Dialoge und über mehrere Module hinweg arbeitet, dann
ist Sorgfalt, selbstredende Variablen, korrekte Deklaration, usw. nahezu zwingend erforderlich.
Wie? Hast Du schon Erfahrungen damit gesammelt? :o
Genau das habe ich schon mehrfach gemacht, viele Module + Dialoge. Und grad bei Dialogen die mittels der IDE gezeichnet werden, lauern an ganz anderen Stellen wieder Stolperfallen.

Das Thema "Option Explicit" wird immer wieder diskutiert. Aus meiner Sicht soll es jeder so halten wie er es möchte.
Korrekt.

Wo finde ich diese Hilfe?
Schon mal die Taste F1 probiert?

Ach ja, Sorry. Hab ja vergessen das in LO wohl die Online-Hilfe nachträglich von Hand gedownloaded und anschließend instaliert werden muss. Oder haben sie das mittlerweile geändert. Denn meine letzte LO Version ist die 5.1.5.2, und von daher nicht mehr auf dem laufendem.

Ja, von Thomas, als auch von Dir habe ich schon sehr viel gelernt und bin Euch sehr dankbar. :)
Danke schön für die Blumen. Aber so viel habe ich hier doch noch gar nicht geschrieben.

Dann ist dies das Richtige für Dich, zumindest in Teilen: ;)
Nun ja, etwas schon. Aber ich plante etwas, was sich in einer ganz anderen Größendimension bewegt. Eilt nicht, und ist auch nich weiter wichtig.


Zu deinem Code.
Thema Messagebox.
Du hast den dementsprechendem Wiki-Artikel ja selber dort verlinkt. Warum machst du dir das denn so schwer z.B. mit

Code: Alles auswählen

nBox1 = MB_OKCANCEL + MB_DEFBUTTON2 + MB_ICONEXCLAMATION
Im Wiki steht doch wie es kürzer geht. Das würde in diesem Fall heißen.

Code: Alles auswählen

nBox1 = 305
Lobend muss ich anerkennen, das Du deine Info-Quellen gleich mit reingepackt hast.

Getestet habe ich den Code unter LO 6.0.4.2 und AOO 4.1.5.
Gut so.

Aber!
Ich weiss jetzt nicht wie sich das mit "Writer-Makros" verhällt, aber bei "Calc-Makros" weiss ich das wohl schon ehern.
LO geht stellenweise ganz andere Wege bei "Calc-Makros", als es AOO macht. Und von daher sind dort komplikationen nicht ausgeschlossen, was ich schon mehrfach leidvoll erleben musste :twisted: . Es ist wohl so gesehen löblich von dir, das Du mit AOO gegentestest, aber ich kann dir nicht garantieren das Du damit auf Dauer glücklich mit wirst. Und da wir uns ja hier in einem LO-Forum befinden würde ich dir empfehlen dich nur auf LO zu konzentrieren.


Hab jetzt Feierabend.



Gruß
balu

DavidG
Beiträge: 114
Registriert: Do 22. Mär 2018, 21:41

Re: INFO: Writer Suchen und Ersetzen in Selektion

Beitrag von DavidG » Mo 9. Jul 2018, 00:05

Hallo Balu,

hier muss ich nochmal nachhaken:
Balu hat geschrieben:In sachen Makroprogrammierung unter LO, bist Du das schon. Was jetzt aber nicht negativ oder böse gemeint ist.
Ich bin DIr auf keinen Fall böse, aber was macht mein Anfängerstadium aus? :roll:
Balu hat geschrieben:In meiner Online-Hilfe gibt es ja dazu ein Beispiel an Hand einer Schleife
Mit F1, habe ich kein Problem, nur mit dem Anykey :mrgreen:
Nun ja, ich hatte das Zitat so verstanden, als hättest Du eine eigene Webpage mit einer Online-Hilfe.
Balu hat geschrieben:Danke schön für die Blumen. Aber so viel habe ich hier doch noch gar nicht geschrieben.
Ich bin nicht ausschließlich hier ein Leser.
Bevor ich mich mit LO anfreunden konnte, arbeitete ich nur mit AOO.
Balu hat geschrieben:Du hast den dementsprechendem Wiki-Artikel ja selber dort verlinkt. Warum machst du dir das denn so schwer z.B. mit
Es ist ein Beispiel! Sonst benutze ich nur die addierten Integer-Konstanten. Wer mehr wissen möchte schaut halt unter dem Link nach.

Das sich LO und AOO in mehreren Bereichen, nicht nur oberflächlich, sondern auch in der API auseinander
bewegen habe ich nicht nur gelesen, sondern auch schon erlebt.
Dies ist sicherlich auch ein Grund dafür, dass man für LO die MRI Version 1.3.3 nutzen muss.
usw.

Gruß

David
___________________
WIN 10 PRO
LO 6.0.4.2 32-Bit



Antworten

Wer ist online?

Mitglieder in diesem Forum: Werner99 und 2 Gäste