Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi TStrings maximale Länge (https://www.delphipraxis.net/171653-tstrings-maximale-laenge.html)

Tommy99 17. Nov 2012 10:49

Delphi-Version: 2010

TStrings maximale Länge
 
Hallo,

versuche einen Dateiinhalt in einen TStrings zu laden (TStringTest.Add(Dateiinhalt))

Die entsprechende Zeilenlänge ist auf 35 Zeichen begrenzt.

Die Zeilen aus der Datei werden nur bis maximal 153 Zeilen an den TStrings angefügt.

Die restlichen Zeilen werden ignoriert. Kann mir jemand weiterhelfen, woher dieses Problem kommt, bzw., ob ich es umgehen kann.

Danke und Grüße

DeddyH 17. Nov 2012 10:50

AW: TStrings maximale Länge
 
Ist evtl. ein #0 in der Datei enthalten?

Tommy99 17. Nov 2012 10:51

AW: TStrings maximale Länge
 
Nein, es handelt sich um einen reinen Textfile (Namen von Banken in Deutschland)

Sir Rufo 17. Nov 2012 11:10

AW: TStrings maximale Länge
 
Zitat:

Zitat von Tommy99 (Beitrag 1191652)
Nein, es handelt sich um einen reinen Textfile (Namen von Banken in Deutschland)

Das sagt nichts darüber aus, ob du dich davon überzeugt hast, dass kein #0 in der Datei vorkommt.
Oder ist das bei der Erstellung von einer Banknamen Datei per se ausgeschlossen?
Ich denke das BS/OS kann das nicht erkennen :mrgreen:

mkinzler 17. Nov 2012 11:21

AW: TStrings maximale Länge
 
Auch bei #D und #A kann es Probleme geben

DeddyH 17. Nov 2012 11:28

AW: TStrings maximale Länge
 
Zitat:

Zitat von mkinzler (Beitrag 1191657)
Auch bei #D und #A kann es Probleme geben

Wird dann nicht nur ein unerwünschter Zeilenumbruch eingefügt? Es fällt mir ein wenig schwer zu glauben, dass das mit einem Stringende verwechselt werden könnte, habe es aber zugegebenermaßen nicht ausprobiert.

Popov 17. Nov 2012 11:41

AW: TStrings maximale Länge
 
@Tommy99

Test das mal:

Delphi-Quellcode:
var
  s: String;
begin
  s := 'Hallo Welt';
  s[6] := #0;

  ShowMessage('Text von s: "' + s + '"'); //hier wird sogar das zweite Anführungszeichen geschluckt
  ShowMessage('Länge s: ' + IntToStr(Length(s))); //die Länge ist aber korrekt (10)

  Caption := s; //mal an die Titelleiste übergeben
  ShowMessage('Länge Caption: ' + IntToStr(Length(Caption))); //die Länge ist kürzer (5)
end;
Einige Programme haben damit kein Problem, da sie die Nullen im Text ignorieren. Andere dagegen schlucken alles dahinter.

Tommy99 17. Nov 2012 13:56

AW: TStrings maximale Länge
 
ich glaube nicht, dass es mit dem #0 zusammenhängt.

Es handelt sich hierbei um eine TXT Datei und über suchen kann ich keinen #0 Eintrag finden.

Zum Testen habe ich den Inhalt je Zeile verkürzt:

TStringTest.Add(Copy(Dateiinhalt,1,10))

Dann schafft er ein paar Zeilen mehr in die Variable aufzunehmen, bricht dann aber auch ab.

Sir Rufo 17. Nov 2012 13:59

AW: TStrings maximale Länge
 
Wenn die Datei nicht zu geheim ist, dann packe die in ein Zip-File und häng die hier mal dran.
(evtl. ist es auch ein Codepage/Encoding Problem)

Popov 17. Nov 2012 14:03

AW: TStrings maximale Länge
 
kennst du das Programm TextPad? Gibt es auch als Shareware. Ansonsten tut auch jeder Hexeditor. Zumindest kann man mit TextPad auch binär laden und da genau prüfen ob eine Null da ist. Ich glaube nicht, dass ein normaler Editor eine Null findet. Dann weißt due es genau.

Übrigens, was passiert wenn du es in ein Memo lädst? Mach aber vorher WordWrap auf False.

Bernhard Geyer 17. Nov 2012 14:05

AW: TStrings maximale Länge
 
Zitat:

Zitat von Tommy99 (Beitrag 1191686)
ich glaube nicht, dass es mit dem #0 zusammenhängt.

Es handelt sich hierbei um eine TXT Datei und über suchen kann ich keinen #0 Eintrag finden.

Solange du Texteditoren verwendest wirst du auch keine #0-Einträge finden können da diese Texteditoren diese Suchfunktionalität gar nicht bieten.
Du brauchst hier einen Hex-Editor und musst je nach codiertung der Textdatei nach $00 bzw. $0000 suchen.

Sir Rufo 17. Nov 2012 14:09

AW: TStrings maximale Länge
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1191692)
Zitat:

Zitat von Tommy99 (Beitrag 1191686)
ich glaube nicht, dass es mit dem #0 zusammenhängt.

Es handelt sich hierbei um eine TXT Datei und über suchen kann ich keinen #0 Eintrag finden.

Solange du Texteditoren verwendest wirst du auch keine #0-Einträge finden können da diese Texteditoren diese Suchfunktionalität gar nicht bieten.
Du brauchst hier einen Hex-Editor und musst je nach codiertung der Textdatei nach $00 bzw. $0000 suchen.

Oder auch Notepad++, der kann auch optional die normal nicht sichtbaren Zeichen hervorheben.
Zudem wird die Datei auch dahingehend analysiert (soweit möglich) um welche Codierung es sich handelt.

Tommy99 17. Nov 2012 14:14

AW: TStrings maximale Länge
 
Ok, das wars,...

Mit TexPad habe ich die #0 gefunden,...

Danke für Eure Hilfe !!!!

Sir Rufo 17. Nov 2012 14:21

AW: TStrings maximale Länge
 
Zitat:

Zitat von Tommy99 (Beitrag 1191695)
Ok, das wars,...

Mit TexPad habe ich die #0 gefunden,...

Danke für Eure Hilfe !!!!

Dass man aber auch immer erst mit dem großen Knüppel drohen muss :mrgreen:

Popov 17. Nov 2012 14:39

AW: TStrings maximale Länge
 
Shit, und ich hab noch etwas auf die Schnelle geprogt. Wir sind hier in einem Programmierforum, ist doch lächerlich, dass wir fremde Programme für sowas brauchen:

Delphi-Quellcode:
function LoadStringFromFile(sInFile: String; var sFileString: String): Boolean;
var
  FileStream: TFileStream;
begin
  Result := False;
  if not FileExists(sInFile) then Exit;
  FileStream := TFileStream.Create(sInFile, fmOpenRead);
  try
    if FileStream.Size <> 0 then begin
      SetLength(sFileString, FileStream.Size);
      FileStream.Read(sFileString[1], FileStream.Size);
      Result := True;
    end;
  finally FileStream.Free end;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  SuchZeichen = #0;
var
  s: String;
  k: Integer;
begin
  with OpenDialog1 do
  begin
    if Execute then
    begin
      if not LoadStringFromFile(FileName, s) then
      begin
        MessageDlg('Keine Datei geladen', mtError, [mbOK], 0);
        Exit;
      end;

      k := 0;
      while Pos(SuchZeichen, s) > 0 do
      begin
        s[Pos(SuchZeichen, s)] := '~';
        Inc(k);
      end;

      ShowMessage(Format('Zeichen "%s" %d mal gefunden.', [SuchZeichen, k]));
    end;
  end;
end;
Zwar zusammengebastelt, aber wer behauptet, dass es immer ein Programm sein muß.

Bernhard Geyer 17. Nov 2012 15:05

AW: TStrings maximale Länge
 
Zitat:

Zitat von Popov (Beitrag 1191702)
Shit, und ich hab noch etwas auf die Schnelle geprogt. Wir sind hier in einem Programmierforum, ist doch lächerlich, dass wir fremde Programme für sowas brauchen:
...
Zwar zusammengebastelt, aber wer behauptet, dass es immer ein Programm sein muß.

Gut nur das dein Programm bei den letzten 5 Delphi-Versionen nicht korrekt funktioniert.

Popov 17. Nov 2012 15:11

AW: TStrings maximale Länge
 
Wieso das?

Edit:

Achso

himitsu 17. Nov 2012 18:16

AW: TStrings maximale Länge
 
Du könntest natürlich auch endlich mal Code zeigen (wie dir ständig irgendwo gesagt wird)
und eventuell die problembehafte Datei anhängen.

Entweder zu zeigst etwas oder du höst auf das, was dir gesagt wurde.
Anonsten kann dir einfach keiner helfen.


@Popov: Ja, dein Delphi ist uralt, aber dennoch kann man mal versuchen seine Codes "ordentlich" zu erstellen.
sFileString muß ein AnsiString sein, wenn du eine Datei Byteweise dort reinkopierst, oder du mußt SetLength an SizeOf(Char) anpassen.
(seit über 3 Jahren rennen hier viele mit einem UnicodeDelphi rum und bei denen würden deine Codes sonst abrauchen)
[edit] zu langsam :oops:

PS: Hätten mehr Leute schon immer auf die richtgen Typen geachtet, hätte es wohl keinerlei Probleme bei der Umstellung auf Unicode gegeben.

Popov 17. Nov 2012 18:33

AW: TStrings maximale Länge
 
himitsu, ich helfe gerne, auch mit Beispielen. Das bedeutet aber nicht, dass ich immer alles neu entwickele. Oft gucke ich in einem meiner alten Programme nach und hole mir hier und da eine Prozedur oder eine Funktion raus. Und gelegentlich ist sie nicht mehr Up-To-Date. Aber was soll ich sagen? Ist das ein Problem? Entweder es funktioniert oder es funktioniert nicht. Funktioniert es nicht, dann gibt es zwei Möglichkeiten: entweder bietet einer was besseres an oder der Code wird angepaßt. Wo ist das Problem? Nicht falsch verstehen, ich würde nie absichtlich einen fehlerhaften Code anbieten oder Fehler absichtlich einbauen, aber ich hab das was ich habe. Wenn das Beispiel nicht funktioniert, dann Pech. Das passiert schon mal bei Delphi. Die Standardtypen werden gelegentlich angepaßt und der Code funktioniert besser oder gar nicht mehr. Ich glaube der Typ String war mal 256 Zeichen lang, was ist er jetzt? So ist das leben. Ich werde mich jetzt nicht in Arbeit stürzen und alle meine Beispiele anpassen. Wenn ich mir ein neues Delphi besorge, meinetwegen. Und wenn gelegentlich meine Beispiele nicht klappen, dann gibt es so nette Kollegen wie euch die mich drauf hinweisen. Na und? Wenn es nicht funktioniert, dann muß man es anders machen. Ich für mich werde nicht auf Unicode umschalten wenn es für mich persönlich nicht nötig ist. Ich meine, keiner ändert seinen Unicode wenn ich nur 8 bit brauche.

himitsu 17. Nov 2012 18:47

AW: TStrings maximale Länge
 
Wie gsagt, du kannst gerne bei ANSI bleiben. Du mußt einfach nur AnsiString nehmen ... das funktioniert auch in D2009+ :zwinker:


Delphi-Quellcode:
function LoadStringFromFile(sInFile: String; var sFileString: String): Boolean;
begin
  ...
      SetLength(sFileString, FileStream.Size div SizeOf(Char));
      FileStream.Read(sFileString[1], Length(sFileString) * SizeOf(Char));



function LoadStringFromFile(sInFile: String; var sFileString: AnsiString): Boolean;
begin
  ...
      SetLength(sFileString, FileStream.Size);
      FileStream.Read(sFileString[1], FileStream.Size);
Beim Ersten gibt es keine Zugriffsverletzung mehr, aber dafür wird dann aus deuschen Text bei Unicode schnell mal Chinesisch. :lol:
Darum wäre ANSI hier sogar richtig, da sich dabei das "Dateiformat" nicht verändert.

Perlsau 17. Nov 2012 21:17

AW: TStrings maximale Länge
 
Zitat:

Zitat von Tommy99 (Beitrag 1191652)
Nein, es handelt sich um einen reinen Textfile (Namen von Banken in Deutschland)

Wenn du eine akurate und immer aktuelle BLZ-Datei suchst, wirst du bei der Deutschen Bundesbank fündig. Ich nutze die dort bereitgestellten Downloads für diverse Projekte, um immer die aktuellen Bankleitzahlen verfügbar zu haben. Nimm am besten die unkomprimierte Text-Datei, da sind garantiert keine Datei-Ende-Zeichen drin. Die einzelnen Felder der Datei sind fix, d.h, sie haben eine feste Länge, was das Parsen der Datei sehr vereinfacht (kein POS notwendig).

Du kannst die Seite bankleitzahlen_download.html nach den beiden Textdateien parsen, die Download-URLS sichern und dann mit TIdHTTP herunterladen, dann muß sich der Anwender nicht weiter darum kümmern, außer daß er das Update anleiert.

Früher hatte ich auch BLZ-Dateien aus allen möglichen Quellen, bis mir eines Tages einfiel, doch mal bei der Bundesbank nachzuschauen – die sind ja auch dafür zustständig. Und tatsächlich, BLZ-Dateien immer frisch aus der Sitzung mit den Spitzenverbänden des deutschen Kreditgewerbes ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz