Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Tstringlist hat ein Maximum von 3277 Zeilen? (https://www.delphipraxis.net/186354-tstringlist-hat-ein-maximum-von-3277-zeilen.html)

muhael 26. Aug 2015 13:55

Delphi-Version: 7

Tstringlist hat ein Maximum von 3277 Zeilen?
 
Heyho habe mal eine Frage zu Stringlist.
Und zwar ist mir Aufgefallen dass man, wenn man eine datei mit einer Stringliste läd "unendlich" viele Zeilen in der Liste haben kann aber wenn man die Stringliste vom Quellcode her füllt (über eine For schleife) dann ist die liste maximal 3277 Zeilen lang.

ist das ein bekanntes Problem? bei Google hab ich nichts gefunden und her in der suche auch nicht.
Oder mach ich einfach nur was falsch?


PS: Meine Delphi Version ist Delphi 7 Enterprise


LG

muhael

baumina 26. Aug 2015 13:59

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Zeig doch mal deine for-Schleife und sag uns den Fehler den du bekommst.

muhael 26. Aug 2015 14:06

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
es ist kein fehler er hört einfach nach 3277 auf:

habe ein procedure da lade ich eine datei in die Stringlist und gebe den count in einer showmessage aus:
Delphi-Quellcode:
sl.LoadFromFile(pfad);
showmessage(inttostr(sl.Count)+ ' Clienten werden importiert.');
hier zeigt er die gesamte anzahl an z.B. 4500...

aber im programmstart wenn die Clienten in das Stringrid(sgclients) geladen werden sollen stoppt er bei 3277...
Delphi-Quellcode:
  ini.ReadSections(SL);
  SL.Sort;
  SGClients.RowCount := SL.Count +1;
  Statusb.Panels[0].Text := InttoStr(SGclients.RowCount-1) + ' Clients registriert.';
  FOR i := 0 to SL.Count -1  do
  begin
    // Mach was
  end;
hier speichert er nur 3277... von den eigendlichen 4500


ich würde es gerne nur wissen das programm wird nie solch eine anzahl von Clienten erhalten bzw verarbeiten müssen

baumina 26. Aug 2015 14:20

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Das liegt daran, dass Du Äpfel (Anzahl Zeilen=4500) mit Birnen (Anzahl Sektionen=3277) vergleichst.

muhael 26. Aug 2015 14:24

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
ja aber die Sectionen in der iniDatei zählen auch die 4500... also theoretisch verliere ich die daten bei der zeile:
Delphi-Quellcode:
ini.readsections(sl);
oder nicht?

da zuerst der import erfolgt eine Zeile bei der import Stringlist ist eine Section in der ini Datei das heißt beim import werden dann 4500 Sections erstellt.
diese sind auch vorhanden. aber beim einlesen dann nicht mehr oder was?

Jumpy 26. Aug 2015 14:34

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Gibt es vllt. doppelte in der Stringlist?

Sir Rufo 26. Aug 2015 14:36

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Hast da alle Sektionen per Hand durchgezählt?

Nein -> mach es!

Eine andere Möglichkeit ist eine leere Ini-Datei und dort alle Einträge importieren.
Vor jedem Schreiben prüfst du aber nun, ob die Sektion schon existiert -> Dublette entdeckt!

baumina 26. Aug 2015 14:37

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Hab mal nen kleinen Test gemacht. Showmessage bringt mir die erwarteten 4500.

Delphi-Quellcode:
procedure TForm26.Button1Click(Sender: TObject);
var
  i : Integer;
  s : TStringList;

begin
  s := TStringList.Create;
  for i := 1 to 4500 do
  begin
    s.Add('[Sect'+IntToStr(i)+']');
  end;
  s.SaveToFile('c:\temp\test.ini');
  s.Free;
end;

procedure TForm26.Button2Click(Sender: TObject);
var
  ini : TIniFile;
  s : TStringList;

begin
  ini := TIniFile.Create('c:\temp\test.ini');
  s := TStringList.Create;
  ini.ReadSections(s);
  ini.Free;
  showmessage(IntToStr(s.Count));
  s.Free;
end;

Sir Rufo 26. Aug 2015 14:39

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
@baumina

Er würde dir auch 9999 melden, wenn du 9999 unterschiedliche Sektionen erstellst ;)
(Dir war das klar)

muhael 26. Aug 2015 14:41

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Zitat:

Zitat von Jumpy (Beitrag 1313586)
Gibt es vllt. doppelte in der Stringlist?

nein Forlaufender Section Zähler von 1000 beginnend (Personalnummern kennt man ja ^^)

Zitat:

Zitat von Sir Rufo (Beitrag 1313587)
Hast da alle Sektionen per Hand durchgezählt?

Nein -> mach es!

Kann es sein das die ini datei bei 3277 sections gecappt ist?


Das einzige was doppelt sein kann sind 2 Keys da stets max als name und Mustermann als nachname eingetragen ist

baumina 26. Aug 2015 14:42

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Es hat sogar mit 9999999 funktioniert 8-)

baumina 26. Aug 2015 14:45

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
ReadSections ist es egal ob es den SektionNamen bereits gibt oder nicht. Es wird einfach jedes "[...]" gezählt.

muhael 26. Aug 2015 14:51

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
nein das mit dem cap bei 3277 sections stimmt nicht alle sections vorhanden -.- und doppelt ist da auch nichts

Sir Rufo 26. Aug 2015 15:02

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Nun, dann solltest du dich auf die Fehlersuche machen.

Stelle fest, welche Sektionen gefunden werden und vergleiche die mit den tatsächlich vorhandenen. Fehlen dort Sektionen mittendrin, oder am Anfang oder am Ende?

(Meine bescheidene Vermutung ist, dass hier - unwissentlich - mit zwei unterschiedlichen Ini-Dateien gearbeitet wird ;))

muhael 26. Aug 2015 15:14

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
es fehlen die letzten im stringgrid ist der letzte Eintrag die Section 4275...

kann natürlich sein das ich nicht ini.free benutzt habe :o

baumina 26. Aug 2015 15:17

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Zitat:

Zitat von muhael (Beitrag 1313598)
es fehlen die letzten im stringgrid ist der letzte Eintrag die Section 4275...

kann natürlich sein das ich nicht ini.free benutzt habe :o

Also wenn du 3277 Zeilen hast und der letzte Eintrag bei 4275 liegt, kann man vermuten, dass zwischendrin auch schon paar fehlen?

Wir bleiben dabei, es gibt kein Zeilenlimit. Deine Datei scheint einfach nicht das herzugeben, was du erwartest und dabei können wir echt nicht helfen.

muhael 26. Aug 2015 15:22

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
es liegt nicht an der datei... dein test gibt bei mir nur 1944 aus...

haentschman 26. Aug 2015 15:26

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Was hälst du davon die betroffene Datei mal anzuhängen? 8-)

Dalai 26. Aug 2015 15:28

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Ich schlage vor: Lass das StringGrid völlig außen vor und lass dir die Namen der Sections in einer ListBox o.ä. ausgeben, dazu die Anzahl der Sections (also TStringList.count).

MfG Dalai

baumina 26. Aug 2015 15:30

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Zitat:

Zitat von muhael (Beitrag 1313601)
es liegt nicht an der datei... dein test gibt bei mir nur 1944 aus...

Na dann muss das wohl ein Fehler im Delphi 7 sein, ich hatte es mit XE getestet, hab hier leider kein Delphi 7.

muhael 26. Aug 2015 15:33

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
nehmt den Test von baumina der schmeißt mir da nur 1944 aus ._.

und das problem habe ich nicht nur auf dem Pc sondern auch auf meinen PC zuhause -.-

datei ist angehängt.. was mir aber jetzt noch aufgefallen ist nach der personalnummer 4275 hat er als Section nur die 42... kann es ein Fehler in der Funktion sein?

Dalai 26. Aug 2015 15:48

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Komisch, muhael hat recht, was das Beispiel von baumina betrifft. Das Problem liegt in der Klasse TIniFile, denn mit TBigIniFile geht es einwandfrei.

Ergänzung: Das Problem liegt im Buffer mit einer festen Größe von 16384 Bytes in der Methode TIniFile.ReadSections begründet. Neuere Delphis gehen anders vor und haben keinen festen Buffer mehr.

Weitere Ergänzung: @muhael: Da wird dir wohl nichts anders übrig bleiben als mit einer Schleife die einzelnen Sections auszulesen bzw. mit TIniFile.SectionExists zu prüfen, ob diese vorhanden ist. Oder du nimmst eine andere Klasse zum Auslesen (TBigIniFile gibt's irgendwo zum Download, vielleicht geht auch TMemIniFile o.ä. was bei Delphi dabei ist). Oder du speicherst die Daten in einer anderen Form (z.B. XML).

MfG Dalai

muhael 26. Aug 2015 15:58

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
"Ich sollte vielleicht auch noch erwähnen, das es einen Nachteil bei der Verwendung von INI-Dateien gibt: Die maximale Kapazität liegt unter W9x bei 32k. Dies ist eine ganz schöne Menge, aber doch begrentzt." dies steht auch bei Delphi Treff drin... aber gibt es schon TbigIniFile bei D7? und wenn welche uses hat es?

Dalai 26. Aug 2015 16:03

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Zitat:

Zitat von muhael (Beitrag 1313608)
"Ich sollte vielleicht auch noch erwähnen, das es einen Nachteil bei der Verwendung von INI-Dateien gibt: Die maximale Kapazität liegt unter W9x bei 32k. Dies ist eine ganz schöne Menge, aber doch begrentzt." dies steht auch bei Delphi Treff drin...

Inwiefern ist das relevant? Hast du Win9x? Wohl kaum. Es gibt in der Tat eine Begrenzung von 64K pro Section (auch unter den NT-Plattformen), aber wer erreicht die schon? Wenn die jemand erreicht, benutzt er das falsche Format zum Speichern von Daten.

Zitat:

aber gibt es schon TbigIniFile bei D7? und wenn welche uses hat es?
Nein, die ist nicht Bestandteil von Delphi. Das ist eine Unit, die unter anderem dazu geschrieben wurde, um diese Größenbegrenzung auf Win9x zu umgehen (ggf. auch die 64K auf NT+). Ich hatte die vor langer Zeit mal irgendwo runtergeladen und benutzt, aber mittlerweile verzichte ich darauf, weil Win9x nun wirklich seit langer Zeit tot ist (zum Glück).

MfG Dalai

p80286 26. Aug 2015 16:06

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Wenn ich mich richtig erinnere dann ist das TMeminifile für Dich das richtige, da gibt es die 32k-Begrenzung nicht mehr.
U.U wäre zu überlegen, statt eines INI-Files ein anderes Format zu nutzen?
CSV z.B.?

Gruß
K-H

muhael 26. Aug 2015 16:17

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
wäre eine Idee aber ich muss das programm fertig bekommen :) also das später umwuseln dann als "HotFix" mit Import :D

und bigini Funktioniert!

muhael 26. Aug 2015 16:28

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
nur Bigini schreibt nichts in die datei O.o

frankyboy1974 26. Aug 2015 17:12

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Hallo,

also ich sehe das Problem eher darin, dass ihr einen Compiler benutzt. Mit einem Interpreter würde dass natürlich alles funktionieren.:-D

mfg

haentschman 26. Aug 2015 17:42

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Hallo...
Zitat:

nur Bigini schreibt nichts in die datei O.o
...könntest du auch ein anderes Format der Datei wie XML in Betracht ziehen? Da gibt es dann viel mehr Möglichkeiten in der Verschachtelung wenn benötigt. Nur so als Idee. :P

muhael 26. Aug 2015 18:14

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Zitat:

Zitat von haentschman (Beitrag 1313621)
Hallo...
Zitat:

nur Bigini schreibt nichts in die datei O.o
...könntest du auch ein anderes Format der Datei wie XML in Betracht ziehen? Da gibt es dann viel mehr Möglichkeiten in der Verschachtelung wenn benötigt. Nur so als Idee. :P

wie schon gesagt Programm muss bald Fertig sein da kann ich dann andere Dateien als Hotfix in betracht ziehen :D

nahpets 26. Aug 2015 18:39

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Um diese Ini zu lesen, braucht man nicht unbedingt IniFiles (laut Delphi 7-Sourcen mit einer Begrenzung auf 16384 Byte - {delphi}\rtl\IniFiles.pas)
Delphi-Quellcode:
var
     sl        : TStringList;
     slSections : TStringList;
     i         : Integer;
begin
  sl := TStringList.Create;
  slSections := TStringList.Create;
  sl.LoadFromFile('dateiname.ini');
  for i := 0 to sl.Count - 1 do begin
    if Copy(sl[i],1,1) = '[' then begin
      slSections.Add(AnsiReplaceText(AnsiReplaceText(sl[i],'[',''),']',''));
    end;
  end;
  ...
end;
Damit hat man in slSection eben alle Sections.
Die kann man dann, wie auch immer abarbeiten.

Der Zugriff auf eine Section kann dann so erfolgen:
Delphi-Quellcode:
  iIndex := sl.IndexOf(Format('[%s]',[slSection[i]]));
  if iIndex > -1 then begin
    // Bei der Struktur der Beispiel-Ini von weiter oben:
    // [1000]
    // Name=Max1
    // Nachname=Mustermann1
    // Kostenstelle=1
    // Punkte=10
    sName := sl[iIndex + 1];
    sNachname := sl[iIndex + 2];
    sKostenstelle := sl[iIndex + 3];
    sPunkte := sl[iIndex + 4];
  ...
end;
Das kann man so nur machen, wenn man sich auf die Struktur absolut verlassen kann, ansonsten eben die "Datenübernahme" in eine plausible Logik packen und das Überschreiten von sl.Count - 1 beachten.
Delphi-Quellcode:
  iIndex := sl.IndexOf(Format('[%s]',[slSection[i]]));
  if iIndex > -1 then begin
    ...
    // Schreiben dann halt mit:
    sl[iIndex + 1] := sName;
    sl[iIndex + 2] := sNachname
    sl[iIndex + 3] := sKostenstelle;
    sl[iIndex + 4] := sPunkte;
  end else begin
    sl.Add(Format('[%s]',[slSection[i]]));
    sl.Add(sName);
    sl.Add(sNachname);
    sl.Add(sKostenstelle);
    sl.Add(sPunkte);
  end;
  sl.SaveToFile('dateiname.ini');
end;
Wer fleißig ist, baut sich 'ne Klasse, die das Ganze kapselt und pfeift auf die INI-Beschränkungen...

hoika 26. Aug 2015 21:25

AW: Tstringlist hat ein Maximum von 3277 Zeilen?
 
Hallo,

an den TE, was spricht gegen TMemIniFile (wie schon mehrfach erwähnt?)


Heiko


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