Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [TStringList] Problem mit einer Datei (bricht zu früh ab) (https://www.delphipraxis.net/77244-%5Btstringlist%5D-problem-mit-einer-datei-bricht-zu-frueh-ab.html)

Zacherl 16. Sep 2006 21:08

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Dein String wird aber wohl nicht richtig gesetzt. Vermutlich wird auf String[0] zugegriffen. Daher die AV beim Lesen des Strings. Das array[0..10000] besitzt ja aber den Null-Index, weshalb ein Zugriff darauf ja dann keine Probleme geben sollte.

xZise 16. Sep 2006 21:12

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Also mit "0" gehts nicht...

PS: @ dein Beitrag im Forum, kommt mir sehr bekannt vor: DSDT

Zacherl 16. Sep 2006 21:13

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Zitat:

Zitat von xZise
Also mit "0" gehts nicht...

PS: @ dein Beitrag im Forum, kommt mir sehr bekannt vor: DSDT

Schade ... ja, ist mir bekannt :wink: Ein Hinweis darauf ist auch im Forum zu finden ...

xZise 16. Sep 2006 21:19

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Ich habe das jetzt so gemacht, wie ein anderer Beitrag aus der DSDT (http://www.dsdt.info/tipps/?id=218&search=filestream) aber auch das funktioniert nicht :(

Gibt es eine möglichkeit deinen Code so zu verändern, dass er nach einem Wort sucht und wie oft es schon vorkommen sollte? (Also z.B. wenn du "ABCDEABCDE" hast, dass er die Position des ersten Cs und des 2. Cs angibt?)

Zacherl 16. Sep 2006 21:24

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Du könntest die Ergebnisse alle in eine StringList schreiben, dann den entprechenden Text aus dem Buffer entfernen und weitersuchen ... wie genau das geht, weiß ich aber auch nicht.

xZise 16. Sep 2006 21:35

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Okay... Ich habe es jetzt so gelöst (und meinen Bedürfnissen angepasst):
Delphi-Quellcode:
function FindInFile(const FileName : string; SearchWord : string) : TIntArray;
var
  fs    : TFileStream;
  Buffer : array [1..10000] of Char;
  Size  : Integer;
  idx   : Integer;
  i     : Integer;
begin
  SetLength(Result, 0);
  idx := 1;
  fs := TFileStream.Create(FileName, fmopenreadwrite or fmsharedenynone);
  try
    Repeat
      Application.ProcessMessages;
      Size := (Fs.Size - Fs.Position);
      if Size > 10000 then
        Size := 10000;
      Fs.ReadBuffer(Buffer, Size);
      for i := 1 to Size do
      begin
        if (Buffer[i] = SearchWord[idx]) then
          Inc(idx)
        else
          idx := 1;
        if (idx = Length(SearchWord)) then
        begin
          SetLength(Result, Length(Result) + 1);
          Result[High(Result)] := (fs.Position - Size) + i - idx + 1;
          idx := 1;
        end;
      end;
    until fs.Position >= fs.Size;
  finally
   fs.Free;
  end;
end;
TIntArray ist ein Integerarray!
Das größere Problem ist jetzt, dass ich auch noch den Wert benötige. Ich suche ja nach "<dep file="" und müsste nun an den Zwischenraum kommen (bis zum "/>)... Mal sehen, wie ich das mache!

Zacherl 16. Sep 2006 21:35

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Pos und Copy sollten da helfen.

Florian

xZise 16. Sep 2006 22:01

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Lol?
Kann es sein, dass er ein array of Char als String behandelt, wenn er einen String erwartet?

Zacherl 16. Sep 2006 22:15

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Jepp. Ein String ist eigentlich auch nur ein array of Char. Halt nur normalerweise nicht nullterminiert.

xZise 16. Sep 2006 22:23

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
So... Ich habe das jetzt noch weiter umgewandelt und dabei stoße ich auf ein Problem:

Delphi-Quellcode:
function GetSigns(const FileName : string) : TStrArray;
var
  fs    : TFileStream;
  Buffer : array [1..10000] of Char;
  Size  : Integer;
//  idx   : Integer;
  i     : Integer;
  BufferPos, StartPos : Integer;
  a : string;
begin
  SetLength(Result, 0);
//  idx := 1;
  fs := TFileStream.Create(FileName, fmopenreadwrite or fmsharedenynone);
  try
    repeat
      Application.ProcessMessages;
      Size := (Fs.Size - Fs.Position);
      if Size > 10000 then
        Size := 10000;
      Fs.ReadBuffer(Buffer, Size);
      for i := 1 to Size do
      begin
        if Length(Result) = 0 then
          StartPos := 1;
        BufferPos := PosEx('<dep file="', Buffer, StartPos + 1);
        StartPos := BufferPos + 1;
        if (BufferPos > 0) then begin
          SetLength(Result, Length(Result) + 1);
          Result[High(Result)] := Copy(Buffer, BufferPos + 11, BufferPos + PosEx('"/>', Buffer, BufferPos));
        end;
      end;
    until fs.Position >= fs.Size;
  finally
   fs.Free;
  end;
end;
Und zwar funktioniert das Copy irgendwie net:
Code:
---------------------------
Autolocer
---------------------------
Any\Advertisement\SignRight.bik"/><dep file="Any\Advertisement\SignUp.bik"/><dep file="Any\Advertisement\SignWarning.bik"/><dep file="Any\Advertisement\SignWrongWay.bik"/><dep file="Any\Advertisement\TMSmallExit.bik"/><dep file="Any\Advertisement\Dynamic Ad1.dds"/><dep file="Any\Advertisement\Dynamic Ad2.dds"/><dep file="Any\Advertisement\Dynamic Ad3.dds"/><dep file="Any\Advertisement\pfeil_links.bik"/><dep file="Any\Advertisement\SignLeft.bik"/><dep file="Any\Advertisement\SignDown.bik"/><dep file="Any\Advertisement\PressForward.bik"/><dep file="Any\Advertisement\GamesserverAnim.bik"/><dep file="Any\Advertisement\Gamesserver.dds"/><dep file="Any\Advertisement\FullSpeed.bik"/></deps></header>
---------------------------
OK  
---------------------------
Das erhalte ich für Result[0] bei der anfangs erwähnten datei!

(PS: TStrArray = Stringarray)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:28 Uhr.
Seite 2 von 3     12 3      

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