Delphi-PRAXiS

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)

xZise 16. Sep 2006 19:57


[TStringList] Problem mit einer Datei (bricht zu früh ab)
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich habe folgende Datei (aus dem Editor kopiert):

GBX BUCR 0 $½  0 $) 0 $† 0 $ 0 $ę
’’’’’’’’’’’’’’’’‚  € 7PUDKCVe4OE64UDv8LH9tfCgBa @ Stadium € xZise
hjjghhgklk €? @ Day @ @ Nadeo  ā <header type="challenge" version="TMc.5" exever="0.1.7.5"><ident uid="7PUDKCVe4OE64UDv8LH9tfCgBa" name="hjjghhgklk" author="xZise"/><desc envir="Stadium" mood="Day" type="Race" nblaps="0" price="386" /><times bronze="-1" silver="-1" gold="-1" authortime="-1" authorscore="0"/><deps><dep file="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> | 2 
0 $ ’) 0 $ @ Ą$ l  ŽŹśJ ĄOĄ $h* Ą $)ˆ é -] Ķ^ `ź¤l
 0 $PIKSš€?y ĶP} )< J Ü® mĶ|qĄp}\^ €@ 7PUDKCVe4OE64UDv8LH9tfCgBaD @ StadiumY€d
xZise
ThjjghhgklkQ@cDayM$@xdNadeo Tģ I a+` @(t PlatformWallPub2 € ]@h  $ \1mP Any\Advertisement\SignRight.bii h
€7S+@(@œ *A7BUp45(4I +y!74Warning4I(H@,I"8HrongWay4M(Lh9 ˜TMSmallExi5(HN*4ä Dynamic Ad1.ddsp?,i(I t I24I
(HlU ą(•34I (I .”|,M(µ t Lpfeil_links41(I
.I7ƒLef5%(= <Down4}(=.<4 PressForward4M(M.M%3Ģ GamesserverAnim4Y(Y.X4 )X4y(I.H4ĄFullSpee0č^@0p LoopStart„,|l—Č“RoadMainSlopeStrat”  ' @0NTov
C@DD I @|Š GrassClip 
Ą? !0,É"Łę$Ž %øĢ\( &0 $’’’’ŽŹś


Aus dieser Datei wollte ich die Pfade herausfiltern:
<dep file="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"/>


Dazu habe ich mir folgenden Code geschrieben:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  slTrack : TStringList;
begin
  if odTrack.Execute then begin
    slTrack := TStringList.Create;
    slTrack.LoadFromFile(odTrack.FileName);
    {...}
  end;
end;
Ergebnis ist:
Zitat:

slTrack[0] = 'GBX'#6
slTrack[1] = Delphi exception EStringListError at $629F949
Ich habe die Datei mal angehängt, damit ihr sie euch mal angucken könnt!

mkinzler 16. Sep 2006 19:59

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Es scheint so als ob .loadFromFile ein EOF erkennt.

xZise 16. Sep 2006 20:07

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Könntest du sagen was ein EOF ist?

(Ich tippe mal auf "End of File"...)

mkinzler 16. Sep 2006 20:08

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

Zitat von xZise
Könntest du sagen was ein EOF ist?

(Ich tippe mal auf "End of File"...)

Ja.

xZise 16. Sep 2006 20:16

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Und wie kann ich es denn öfnfnen, wie der Editor? Der hat es ja immerhin geschafft :D

mkinzler 16. Sep 2006 20:19

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Versuch mal die datei als Binärdatei zu behandeln und lade sie per Stream oder in einen Buffer.

Zacherl 16. Sep 2006 20:20

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Genau ... eine Binärdatei sollte man nicht als Strings laden. Ein File oder MemoryStream dürfte das Richtige sein.

Florian

xZise 16. Sep 2006 20:55

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Okay... Ich habe es so gemacht, bekomme aber eine nette AV. (Habe bisher noch nicht mit Streams gearbeitet)

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  fsStream : TFileStream;
  Text : string;
begin
  if odTrack.Execute then begin
    fsStream := TFileStream.Create(odTrack.FileName, fmOpenRead or fmShareDenyWrite);
    try
      fsStream.Seek(1, soFromBeginning);
      fsStream.Read(Text, fsStream.Size - 1);
      Showmessage(Text[1]);
    finally
      fsStream.Free;
    end;
  end;
end;

Zacherl 16. Sep 2006 20:58

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Das ist ja auch wieder nicht Sinn der Sache, wenn du den Buffer doch wieder in einen String lädst :wink:
Diese Funktion sollte dir helfen: http://www.florianbernd.pytalhost.de...pid=30#post_30 (ist zwar nicht ganz das, was du suchst, aber damit kann man was basteln)

Florian

xZise 16. Sep 2006 21:03

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Ich verstehe aber irgendwie nicht den unterschied zwischen einen "array [0..10000] of Char" und einem "string"...

Weil, wie man der Datei entnehmen kann, gibt es das Suchwort öfters...

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)

mkinzler 16. Sep 2006 22:25

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

Zitat von Florian Bernd
Jepp. Ein String ist eigentlich auch nur ein array of Char. Halt nur normalerweise nicht nullterminiert.

Ein ShortString nicht, aber ein AnsiString schon.

Zacherl 16. Sep 2006 22:28

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

Zitat von mkinzler
Zitat:

Zitat von Florian Bernd
Jepp. Ein String ist eigentlich auch nur ein array of Char. Halt nur normalerweise nicht nullterminiert.

Ein ShortString nicht, aber ein AnsiString schon.

Schon klar, aber eine Deklaration von var s: string; ist ja automatisch ein ShortString begrenzt auf 255 Zeichen ...

mkinzler 16. Sep 2006 22:29

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

Schon klar, aber eine Deklaration von var s: string; ist ja automatisch ein ShortString begrenzt auf 255 Zeichen ...
IMHO seit D5 nicht mehr.

Zacherl 16. Sep 2006 22:31

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

Zitat von mkinzler
Zitat:

Schon klar, aber eine Deklaration von var s: string; ist ja automatisch ein ShortString begrenzt auf 255 Zeichen ...
IMHO seit D5 nicht mehr.

Mhh stimmt. Ich meinte eigentlich auch nur, dass z.B. str := '{über 255 Zeichen großer Text}' nicht geht ... aber wir werden OT.

xZise 16. Sep 2006 22:32

Re: [TStringList] Problem mit einer Datei (bricht zu früh ab
 
Ähm... Könntet ihr bitte sagen, wo das Problem bei meinem Code liegt :P Das mit Buffer und String Chars etc. interessiert mich im Monent nicht :P


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:27 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