![]() |
Dynamische Arrays
Delphi-Quellcode:
type
TDatei = class name,pass: String; end; TDaten = class datei: array of TDatei; procedure Einlesen; end;
Delphi-Quellcode:
So, das Problem liegt im SetLength. Wenn ich das Programm schrittweise ausführe, kommt eine Fehlermeldung "Zugriffsverletzung bei Adresse ... "
var
Form1: TForm1; Daten: TDaten; implementation procedure TDaten.Einlesen; var xdatei: textfile; var dateiname: string; var i,n: integer; begin i := 0; dateiname := ExpandFileName('keys.txt'); assignfile(xdatei,dateiname); reset(xdatei); repeat inc(i); readln(xdatei); until eof(xdatei); SetLength(daten.datei,i+1); for n := 0 to i do begin readln(xdatei,daten.datei[i].name); readln(xdatei,daten.datei[i].pass); end; closefile(xdatei); end; Woran kann das liegen und wie kann ich das beheben? Danke Chris WF Edit: Achso, da ist noch ein EOF-Problem, das hat aber nicht Priorität |
Re: Dynamische Arrays
Nach der Zeile:
Delphi-Quellcode:
Ist i eins.
inc(i);
Hier
Delphi-Quellcode:
willst du aber auf das 0'te Element zugreifen nur da steht nichts drinne.
readln(xdatei,daten.datei[i].name);
Und so was:
Delphi-Quellcode:
Macht man nicht, weil sich das so gut wie gar nicht zeilenweise debuggen läßt.
repeat inc(i); readln(xdatei); until eof(xdatei);
Dann fällt mir noch das auf:
Delphi-Quellcode:
Auch das ist ungewöhnlich. Normalerweise läßt man ein 0 basierdendes Array von 0 bis Anzahlelement-1 laufen.
SetLength(daten.datei,i+1);
for n := 0 to i do |
Re: Dynamische Arrays
So wie ich das sehe willst du zwei zusammengehöhrende Listen verwalten,
da würde ich zwei TStringList Objecte anlegen und in die eine den einen Wert und in den anderen den anderen Wert einspeichern. Ich denke das ist einfacher. Wenigstens mal drüber nachdenken Gruß derDan |
Re: Dynamische Arrays
Ist denn die Länge eines TStringsList im Programm änderbar?
|
Re: Dynamische Arrays
TStringList verwaltet belibig viele Strings, die beliebig lang sein können.
Delphi-Quellcode:
...
strListName := TStringList.Create;
strListPass := TStringList.Create; . . . strListName.Add (Name); strListPass.Add (Pass); auf die Strings zugreifen kannst du dann einfach mit
Delphi-Quellcode:
i darf zwichen 0 und strListName.Count - 1 sein
label.caption := strListName[i] + ' -> ' + strListPass[i];
DerDan |
Re: Dynamische Arrays
Moin Chris,
nicht zu vergessen:
Code:
Dein Schleifenzähler ist n, aber die Variable die als Index dient ist i.
for [color=red][b]n[/b][/color] := 0 to i do
begin readln(xdatei,daten.datei[[color=red][b]i[/b][/color]].name); |
Re: Dynamische Arrays
1. Ich kann mir gut vorstellen, dass es mit daten.datei zusammenhängt. Wird Daten überhaupt mit einem gültigen TDaten-Objekt versorgt? Wenn ja, dann ist es nicht sinnvoll so auf das Array zuzugreifen, da du dann immer das gleiche Array hast, auch wenn du mehere Instanzen von TDaten erstellst.
Nimm also lieber das daten. vorher immer weg. 2. Schleifenzähler wurde schon angesprochen. Zudem mach deine Schleife nur bis i-1 und bei SetLength machst du nur i statt i+1 3. Vor der Schleife mach ein Reset, dann beginnt er wieder beim Datei Anfang. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:50 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 by Thomas Breitkreuz