Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Word-Dokument in StringList laden (https://www.delphipraxis.net/27349-word-dokument-stringlist-laden.html)

Matze 12. Aug 2004 17:56

Re: Word-Dokument in StringList laden
 
Ich pushe jetzt das letzte Mal, ich denke, das hat sonst auch keinen Sinn mehr.

Ich würde mich freuen, wenn jemand eine Lösung für mein Problem weiß, ich komme auf keinen grünen Zweig...

Dani 12. Aug 2004 18:14

Re: Word-Dokument in StringList laden
 
Zitat:

Ich habe ein Programm geschrieben, das mir Dateien nach bestimmten WÖrtern durchsucht (so mal ganz grob). Und ich lade alle Dateien in eine StringList, deshalb sollte es mit jeder Datei gehen...
Dafür würd ich jetzt nen TFileStream nehmen :gruebel:
könnte z.B. so aussehen

Delphi-Quellcode:
function ScanFileForString(aFile, SearchString: String; IgnoreCase: Boolean=true;
                           MaxBytesScanned: Int64 = 2097152): Boolean;
const
 MAX_BUFFER_SIZE = 20480; //20 kb
var
 Buffer: String;
 FS: TFileStream;
 BytesRead: Integer;
 i, match: Integer;
 BufferSize, StrLength: Integer;
begin
 Result := false;
 If (SearchString='') then exit;
 If IgnoreCase then SearchString := ANSIUppercase(SearchString);

 //Datei öffnen... falls das nicht klappt gibts hier ne Exception
 //daher die Funktion besser im try..except Schutzblock aufrufen!
 FS := TFileStream.Create(aFile, fmOpenRead or fmShareDenyWrite);

 try
  BufferSize := 0;
  StrLength := Length(SearchString);
  //Ermitteln wie groß der Puffer sein muss. Er soll ca. 20 kb groß sein,
  //wenn nicht die ganze Datei reinpasst
  If FS.Size <= MAX_BUFFER_SIZE then
   BufferSize := FS.Size
    else BufferSize := (MAX_BUFFER_SIZE div StrLength) * StrLength;
  SetLength(Buffer, BufferSize);


  Repeat //Höchstens MaxBytesScanned Bytes untersuchen oder bis EOF

  BytesRead := FS.Read(Buffer[1], BufferSize);
  If BytesRead = 0 then exit;
  If IgnoreCase then Buffer := ANSIUppercase(Buffer);

  for i:=1 to BytesRead do
   begin
    match := 0;
    If (BufferSize-(i-1) >= StrLength) then
    while (Buffer[i+match] = SearchString[match+1]) do
     begin
      inc(match);
      If match = StrLength then
       begin
        Result := true;
        exit;
       end;
     end;
   end;

  Until (FS.Position >= MaxBytesScanned) or (FS.Position = FS.Size);
 finally
  FS.Free;
  SetLength(Buffer, 0);
 end;
end;

Niko 12. Aug 2004 18:19

Re: Word-Dokument in StringList laden
 
Hi,

nach der von Dir genannten Zeichnkette folgen in einer Word-Datei mehrere Nullzeichen und diese interpretiert die StringList offensichtlich als Dateiende.

Statt einer StringList würde ich für deinen Zweck eher einen FileStream empfehlen, in dem du dann suchen kannst.

Matze 15. Aug 2004 10:08

Re: Word-Dokument in StringList laden
 
Vielen Dank für den Code, Dani. :)

Werde ich in den nächsten Tagen mal ausprobieren.


@Niko: Danke, du bestätigst das mit TFileStream. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:33 Uhr.
Seite 2 von 2     12   

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