![]() |
Word Zugriff per Ole -- zunehmend langsamer
Hallo,
ich habe mir gerade als aktuelles projekt vorgenommen, eine lokale Datenbank zu erstellen, die sämtliche in einem (natürlich auch mehrere) Worddokument vorkommenen Wörter aufnimmt, damit man anschließend über eine Wortsuche schneller die betreffenden Dokumente aufgelistet bekommt, als es z.B. die bordeigene Suche von Windows schafft. Nun aber zu meinem "Problem": Ich verbinde mich mit einem Worddokument und gehe dann alle Wörter in dem Dokument durch um diese dann später mal zu verarbeiten, allerdings ist es so, dass die Verarbeitungsgeschwindigkeit der Wörter zunehemnd abnimmt, je weiter sich die Routine dem Dokumentende nähert. Hier mal mein bisheriger "Versuchscode":
Delphi-Quellcode:
Jetzt also die Gretchenfrage, ist mein Vorhaben so überhaupt sinnvoll realisierbar,
procedure TForm1.bt_OpenWordDocClick(Sender: TObject);
Var V :OleVariant; Docs, ItemIndex: OleVariant; ConFirmConversions, OpenReadOnly :OleVariant; LinesCount : Integer; Zl : TStringList; begin If OpenDialog1.execute Then Begin Screen.Cursor := crHourGlass; Zl := TStringList.Create; If CheckBox2.Checked Then Zl.Sorted := True; If Not CheckBox1.Checked Then Zl.Duplicates := dupIgnore; Memo1.Lines.Clear; EditDocFile.Text := OpenDialog1.FileName; ProgressBar1.Visible:= True; try ItemIndex := 1; try Wordapplication.Visible := False; Wordapplication.Connect; except MessageDlg('Word ist nicht auf diesem Rechner installiert', mtError, [mbOk], 0); Abort; end; Docs := (EditDocFile.Text); ConFirmConversions:= False; OpenReadOnly := True; WordApplication.Documents.Open(Docs,ConFirmConversions,OpenReadOnly,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,EmptyParam); WordDocument.ConnectTo(WordApplication.Documents.Item(ItemIndex)); ProgressBar1.Max := WordDocument.Words.Count; // Alle Wörter durchgehen For LinesCount := 1 To WordDocument.Words.Count Do Begin ProgressBar1.Position := LinesCount; V:=WordDocument.Words.Item(LinesCount).Text; V:= trim(V); If Length(V) > 1 Then Zl.Add(V); End; except on E: Exception do begin ShowMessage(E.Message); WordApplication.Disconnect; end; end; ProgressBar1.Visible := False; // WordApplication.Disconnect; Memo1.Lines.Assign(Zl); Zl.Free; Screen.Cursor:= crDefault; end; end; oder ist der Zugriff per Ole 'n schlechter Ansatz? Ich bin für alle Vorschläge offen. Moin |
Re: Word Zugriff per Ole -- zunehmend langsamer
Wie viel Worde sind denn Aufgenommen?
Ich tipp viel mehr darauf das die Option dupIgnore die Stringlist bei >> 1000 Einträgen sehr langsam macht. AFAIK ist da nicht gerade der schnellste Algorithmus implementiert. |
Re: Word Zugriff per Ole -- zunehmend langsamer
Wenns eine Stringliste sein muss - THashedStringList aus der unit IniFiles dürfte etwas zügiger funktionieren. Allerdings ist eine Stringlist an sich keine besonders performante Lösung... denk vielleicht alternativ mal lieber über einen Baum nach.
|
Re: Word Zugriff per Ole -- zunehmend langsamer
Zitat:
Zitat:
Moin |
Re: Word Zugriff per Ole -- zunehmend langsamer
Zitat:
Hmmm, Baum, da bin ich leicht überfordert, hättest Du mal einen Ansatz bzw. ein wenig Code für mich? Moin |
Re: Word Zugriff per Ole -- zunehmend langsamer
Hallo,
wenn mich meine Erinnerung nicht täuscht werden hier min 1 oder 2 Interfaces (bei jedem Aufruf innerhalb der Schleife) angefordert.
Delphi-Quellcode:
Versuch mal das Interface auf WordDocument.Words oder wenn es geht auf WordDocument.Words.Item vor
WordDocument.Words.Item(LinesCount).Text;
dem Aufruf der Schleife zu holen. So dass innerhalb der Schleife nur noch
Delphi-Quellcode:
steht
For LinesCount := 1 To WordDocument.Words.Count Do
Begin ProgressBar1.Position := LinesCount; V:=Item(LinesCount).Text; Vor einigen Jahren habe ich malen gelesen, dass das wiederholte Anfordern von Interfaces Resourcen verbraucht. |
Re: Word Zugriff per Ole -- zunehmend langsamer
Hmmm, finde ich nicht wirklich performanter
Delphi-Quellcode:
// Alle Wörter durchgehen
MyWords := WordDocument.Words; For LinesCount := 1 To MyWords.Count Do Begin ProgressBar1.Position := LinesCount; V:=MyWords.Item(LinesCount).Text; V:= trim(V); If Length(V) > 1 Then Zl.Add(V); |
Re: Word Zugriff per Ole -- zunehmend langsamer
Kannst du ein paar € ausgeben? Falls ja: Mit
![]() |
Re: Word Zugriff per Ole -- zunehmend langsamer
Ich lade gerade mal eine Trial-Version herunter, vielleicht kann ich mit der ja genaueres erfahren.
Moin |
Re: Word Zugriff per Ole -- zunehmend langsamer
Zitat:
Ich weis auch momentan noch nicht, ob nicht die Übergabegeschwindigkeit von Word der wahre Pferdefuß ist. Moin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz