In Word-Datei suchen



  • Hallo,

    nachdem das Öffnen, Drucken, Speichern einer Word-Datei nun kein Problem mehr ist, stehe ich vorm nächsten - wenn auch kleinen - Hindernis.
    Zur Suche in einem Word-Dokument habe ich folgenden Delphi-Code gefunden, der auch größtenteils selbsterklärend ist.

    var DocWord:_document;
    NomFichier:OLEVariant;
    MaZone,MaRecherche:Range;
    Param1, Param2, Param3, Param4, Param5, Param6 : OLEVariant;
    begin
        WordApplication1.Connect;
        WordApplication1.Visible:=True;
        NomFichier:='d:\essai.doc';
        DocWord:=WordApplication1.Documents.Open(NomFichier,EmptyParam,
                         EmptyParam,EmptyParam,EmptyParam,EmptyParam,
                         EmptyParam,EmptyParam,EmptyParam,EmptyParam);
        Param1:=0;
        MaZone:=DocWord.Range(Param1,Param1);
        Param1:='UnMot';
        Param2:=False;
        Param3:=True;
        Param4:=wdFindStop;
        Param5:=wdCharacter;
        Param6:=1;
        // !
        with MaZone.Find do
        //
        begin
           while Execute(Param1,Param2,Param2,Param2,Param2,
                      Param2,Param3,Param4,emptyparam,emptyparam,emptyparam)=true do
           begin;
               MaRecherche:= Parent as Range;
               MaRecherche.Font.colorindex:=5;
           end;
        end;
    end;
    

    Allerdings finde ich bisher keine Hilfe, um den folgenden Ausdruck zu übersetzen:

    with MaZone.Find do
    

    Gruß
    Leo



  • Hallo

    das ist ein Konstrukt, das nicht in C++ so übernommen werden kann.
    Das heißt das du das ausschreiben must :

    MaZone->Find->Execute(...
    

    bis bald
    akari



  • Hi,

    ich bekomme leider nur Zugriffsverletzungen in der Execute-Zeile. Die Anzahl der übergebenen Parameter scheint nicht zu stimmen. Sonderbar: in fast jedem Beispiel, das ich dazu finde, ist die Anzahl unterschiedlich.

    Akari, in einem anderen Thread (http://www.c-plusplus.net/forum/viewtopic-var-t-is-111207-and-highlight-is-wordapplication.html)
    schreibst Du:

    ... wenn Du unbedingt den Ole-Server benutzen möchtest, ...

    Wie sähe denn eine andere Möglichkeit aus?

    Gruß
    Leo



  • Hallo

    ich hab so ein Find->Execute in meinen Programm erfolgreich verwendet

    WordApp->Selection->Find->Execute(
          OleVariant(StringToOleStr(<AnsiString-Wert>)), // FindText : Der zu suchende Text
          OleVariant(true), // MatchCase : ob Groß/Kleinschreibung beachtet werden soll
          OleVariant(false), // MatchWholeWord : ob nur nach ganzen Worten gesucht werden soll
          OleVariant(false), // MatchWildcards : ob ein Suchoperator verwendet werden soll
          OleVariant(false), // MatchSoundsLike : ob nach ähnlich lautenden Worten gesucht werden soll
          OleVariant(false), // MatchAllWordForms : ob alle Formen des Suchtextes gesucht werden soll
          OleVariant(true), // Forward : ob vorwärts gesucht werden soll
          OleVariant(wdFindContinue), // Wrap : Verhalten bei Erreichen des Suchbereichs-Endes
            // wdFindAsk : Abfrage, ob Suche im restlichen Dokument fortgesetzt werden soll
            // wdFindContinue : automatisch Suche fortsetzen
            // wdFindStop : Suche beenden
          OleVariant(false), // Format : ob nach einer Formatierung gesucht werden soll
          OleVariant(StringToOleStr("")), // ReplaceWith : der einzusetzende Text
          OleVariant(wdReplaceOne), // Replace : gibt die Anzahl der Ersetzungen an
            // wdReplaceAll : alle Fundstellen ersetzen
            // wdReplaceNone : keine ersetzen
            // wdReplaceOne : die erste Fundstelle ersetzen
          OleVariant(false), // MatchKashida : ob in einem arabischen Text nach übereinstimmenden Kashidas gesucht werden soll
          OleVariant(false), // MatchDiacritics : ob in einen Text mit Schreibrichtung rechts nach links nach diakritische Zeichen gesucht werden soll
          OleVariant(false), // MatchAlefHamza : ob in einem arabischen Text nach übereinstimmenden Alef Hamzas gesucht werden soll
          OleVariant(false)); // MatchControl : ob in einen Text mit Schreibrichtung rechts nach links und mit übereinstimmenden bidirektionalen Steuerzeichen gesucht werden soll
    

    Wie sähe denn eine andere Möglichkeit aus?

    Kein Word und kein OLE-Server verwenden. Ich bin erstmal auf RTF umgestiegen, und hab ein entsprechendes externes Control zugelegt.
    Aber auch XML/HTML ist ein Blick wert,

    bis bald
    akari



  • Danke für Deinen Beispielcode, aber ich bekomme nach wie vor ein Zugriffsverletzung in folgender Zeile:

    WordApp->Selection->Find->Execute(
          OleVariant(StringToOleStr("Müller")), // FindText : Der zu suchende 
          (...)
    

    Ne Idee?

    Gruß
    Leo



  • Hallo

    kann an dem Umlaut liegen... ansonsten weiß ich auch nicht weiter. Das ist der Grund warum ich die OLE-Server sein gelassen hab...

    bis bald
    akari


Anmelden zum Antworten