Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi StringList => LoadFromFile liest Datei nur zum Teil ein (https://www.delphipraxis.net/195050-stringlist-%3D-loadfromfile-liest-datei-nur-zum-teil-ein.html)

HolgerX 30. Jan 2018 04:23

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Hmm..

Mal eine Frage:
Könnte es sein, dass der Text in der TStringList richtig ist, jedoch bei der Ausgabe im Memo am #0 abgeschnitten wird?
Ich habe in einer StringList so oft Files mit #0 geladen und bearbeitet.. Alles ohne Probleme.
Jedoch bei der Anzeige im Memo ist am #0 ende.

himitsu 30. Jan 2018 08:28

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Nein, LoadFromStream und LoadFromFile behandeln auch extra die 0 und schneiden schon ab.
EXTRA = absichtlich eingebaut

Es gibt auch einen Unterschied zwischen den vielen TStrings.
Bei TStringList können während ihrer Nutzung sogar #0 und Zeilenumbrüche innerhalb eines "Strings" enthalten sein, da dort intern und in den Property/Methoden des TStrings der Delphi-"String" genutzt wird, welcher es erlaubt.
Bei TMemoStrings und Anderen ist das nicht möglich.

HolgerX 30. Jan 2018 12:43

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Hmm..

Dass war der Grund meiner Frage..
Ich habe bisher TStringList zum Laden von Text-Dateien verwendet und da hat es mit #0 kein Abschneiden gegeben.

LoadFromStream und LoadFromFile mach jeweils keinen Unterschied, da ja LoadFromFile einen FileStream erzeugt und mit diesem dann an LoadFromStream aufruft.
(Zumindest bei D6 ;) )

Unter D6 verwendet das LoadFromStream von TStringList auch nur die Funktionen von TStrings und ist somit identisch zu TMemoStrings. Die TStringList hat keine eigene LoadFrom.. Funktionen.

Das bei einem Memo bei #0 abgeschnitten wird, hat eher den Hintergrund, dass der Text per SendMessage (WM_SETTEXT) an das Memo.Handle (= Windows Edit) geschickt wird, und dort halt ein String ohne Längenangabe versendet wird, welcher dann wie ein PChar verwendet wird und bei dem ist an #0 ende.. ;)

Würde man somit auf Memo.Lines direkt zugreifen, könne nach einem LoadFrom.. dort doch der komplette Test stehen, nur wird dieser nicht im Memo angezeigt.

(Oder so ähnlich...)

ich vermute, dass sich mit Umstellung auf Unicode hier etwas verändert hat..

himitsu 30. Jan 2018 12:50

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Seit Delphi 2009 gibt es im LoadFrom... auch noch die Behandlung des Encodings.
Und da kommt es auch drauf an, wie TEncoding mit #0 umgeht.

Nach dem Laden und Decodieren der Datei/Stream kommt der Text dann in TStrings.SetTextStr rein und siehe da, eine Abbruchbehandlung für #0, da das Ganze als PChar behandelt wird. :stupid:
Delphi-Quellcode:
procedure TStrings.SetTextStr(const Value: string);
var
  P, Start, LB: PChar;
  S: string;
  LineBreakLen: Integer;
begin
  BeginUpdate;
  try
    Clear;
    P := Pointer(Value);
    if P <> nil then
      if CompareStr(LineBreak, sLineBreak) = 0 then
      begin
        // This is a lot faster than using StrPos/AnsiStrPos when
        // LineBreak is the default (#13#10)
        while P^ <> #0 do
        begin
          Start := P;
          while not (P^ in [#0, #10, #13]) do Inc(P);
          SetString(S, Start, P - Start);
          Add(S);
          if P^ = #13 then Inc(P);
          if P^ = #10 then Inc(P);
        end;
      end
      else
      begin
        LineBreakLen := Length(LineBreak);
        while P^ <> #0 do
        begin
          Start := P;
          LB := AnsiStrPos(P, PChar(LineBreak));
          while (P^ <> #0) and (P <> LB) do Inc(P);
          SetString(S, Start, P - Start);
          Add(S);
          if P = LB then
            Inc(P, LineBreakLen);
        end;
      end;
  finally
    EndUpdate;
  end;
end;

juergen 30. Jan 2018 18:37

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
@Holger,

Zitat:

Zitat von HolgerX (Beitrag 1392500)
Hmm..

Mal eine Frage:
Könnte es sein, dass der Text in der TStringList richtig ist, jedoch bei der Ausgabe im Memo am #0 abgeschnitten wird?
Ich habe in einer StringList so oft Files mit #0 geladen und bearbeitet.. Alles ohne Probleme.
Jedoch bei der Anzeige im Memo ist am #0 ende.


Ich habe die Datei aus Post #4 nur per LoadFromFile() in eine TStringList geladen und *direkt* wieder über SaveToFile() als Datei ausgegeben. Also kein Memo dazwischen.
himitsu hat ja gezeigt wo die Abbruch-Bedingung steht.

Danke für die Infos!

Ist schon verrückt was einem alles als zu bearbeitende Dateien "untergejubelt" wird... :shock:

p80286 31. Jan 2018 09:36

AW: StringList => LoadFromFile liest Datei nur zum Teil ein
 
Wenn Du eh nur kopieren willst, warum nutzt Du dafür einen Interpreter (TStringlist) ?

Nutz Tfilestream/Blockread/blockwrite oder das OS.

Gruß
K-H


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