![]() |
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 |
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
Zeig doch mal deine for-Schleife und sag uns den Fehler den du bekommst.
|
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:
hier zeigt er die gesamte anzahl an z.B. 4500...
sl.LoadFromFile(pfad);
showmessage(inttostr(sl.Count)+ ' Clienten werden importiert.'); aber im programmstart wenn die Clienten in das Stringrid(sgclients) geladen werden sollen stoppt er bei 3277...
Delphi-Quellcode:
hier speichert er nur 3277... von den eigendlichen 4500
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; ich würde es gerne nur wissen das programm wird nie solch eine anzahl von Clienten erhalten bzw verarbeiten müssen |
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
Das liegt daran, dass Du Äpfel (Anzahl Zeilen=4500) mit Birnen (Anzahl Sektionen=3277) vergleichst.
|
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:
oder nicht?
ini.readsections(sl);
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? |
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
Gibt es vllt. doppelte in der Stringlist?
|
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! |
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; |
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) |
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
Zitat:
Zitat:
Das einzige was doppelt sein kann sind 2 Keys da stets max als name und Mustermann als nachname eingetragen ist |
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
Es hat sogar mit 9999999 funktioniert 8-)
|
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.
|
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
|
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 ;)) |
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 |
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
Zitat:
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. |
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
es liegt nicht an der datei... dein test gibt bei mir nur 1944 aus...
|
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
Was hälst du davon die betroffene Datei mal anzuhängen? 8-)
|
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 |
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
Zitat:
|
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? |
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 |
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?
|
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
Zitat:
Zitat:
MfG Dalai |
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 |
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! |
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
nur Bigini schreibt nichts in die datei O.o
|
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 |
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
Hallo...
Zitat:
|
AW: Tstringlist hat ein Maximum von 3277 Zeilen?
Zitat:
|
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:
Damit hat man in slSection eben alle Sections.
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; Die kann man dann, wie auch immer abarbeiten. Der Zugriff auf eine Section kann dann so erfolgen:
Delphi-Quellcode:
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.
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;
Delphi-Quellcode:
Wer fleißig ist, baut sich 'ne Klasse, die das Ganze kapselt und pfeift auf die INI-Beschränkungen...
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; |
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 21:30 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