![]() |
Tlist wird nicht richtig gefüllt
Hallo,
ich schreibe an einem NonVCL Programm und möchte eine TList mit meinen Accountdaten füllen. Die Daten werden auch richtig in die Liste eingetragen, aber sobald ich die Daten aus der Liste auslesen möchte zeigt der mir von den zwei Accounts zweimal den zweiten an. Hier mal der Code:
Delphi-Quellcode:
Das Ergebnis in der Konsole ist:
type
TAccounts = class(TObject) ID : Integer; Name : String; Passwort : String; ban : integer; end; ... q:='select * from user;'; FResult := FMysql.query(q, true, ex); if ex then begin ListAccounts:= TList.Create; Account:= TAccounts.Create; FResult.First; for I := 0 to FResult.RowsCount - 1 do begin Account.ID := strtoint(Fresult.FieldValuebyname('id')); Account.Name := Fresult.FieldValuebyname('username'); Account.Passwort := Fresult.FieldValuebyname('password'); Account.ban := strtoint(Fresult.FieldValuebyname('ban')); ListAccounts.Add(Account); FResult.Next; end; ... for E := 0 to SQL.ListAccounts.Count -1 do begin Account := SQL.ListAccounts.Items[E]; WriteLN('Name: '+Account.Name+' | '+'ID: '+inttostr(Account.ID)); end; Name: test | ID: 2 Name: test | ID: 2 Eigentlich müsste es aber so aussehen: Name: XXcD | ID: 1 Name: test | ID: 2 Wo könnte da der Fehler liegen? |
Re: Tlist wird nicht richtig gefüllt
Das
Delphi-Quellcode:
muss natürlich mit in die For-Schleife, sonst legst Du keinen neuen Account an, sondern überschreibst den bestehenden.
Account:= TAccounts.Create;
|
Re: Tlist wird nicht richtig gefüllt
Zitat:
|
Re: Tlist wird nicht richtig gefüllt
Lol wenn ich Account:= TAccounts.Create; in die for Schleife einfüge funktioniert es.
Ich dachte Account wäre nur temporär da das in die ListAccounts eingefügt wird und beim auslesen wieder in Account geladen wird. |
Re: Tlist wird nicht richtig gefüllt
Nee nee, die einzelnen Objekte müssen auch alle erzeugt werden. Wieso nimmst Du eigentlich keine TObjectList statt TList?
|
Re: Tlist wird nicht richtig gefüllt
Hallo XXcD!
Mich wundert, das es jetzt funktioniert: Du sagst, das Dein TList Objekt nicht funktioniert, aber Du hast geschrieben:
Delphi-Quellcode:
statt:
type
TAccount = class(TObject) ... end;
Delphi-Quellcode:
In TList hast Du alles, was Du für Deine Liste brauchst. Warum da ein neues Listenobjekt?
type
TAccount = class(TList) ... end; |
Re: Tlist wird nicht richtig gefüllt
TAccounts ist die Deklaration eines Objekts. Mit diesen Objekten will er seine Liste befüllen, das ist doch völlig korrekt.
|
Re: Tlist wird nicht richtig gefüllt
Wenn ich jetzt direkt ne TList nehme ist das doch bestimmt ein wenig Ressourcen schonender.
Aber wie kann ich das umsetzen? So siehts bei mir bis jetzt aus:
Delphi-Quellcode:
type
TAccounts = class(TList) ID : Integer; Name : String; Passwort : String; ban : integer; end; ... q:='select * from user;'; FResult := FMysql.query(q, true, ex); if ex then begin Account:= TAccounts.Create; FResult.First; for I := 0 to FResult.RowsCount - 1 do begin test. Account.ID := strtoint(Fresult.FieldValuebyname('id')); Account.Name := Fresult.FieldValuebyname('username'); Account.Passwort := Fresult.FieldValuebyname('password'); Account.ban := strtoint(Fresult.FieldValuebyname('ban')); // Wie gehts denn hier weiter???<--------------------------------- FResult.Next; end; |
Re: Tlist wird nicht richtig gefüllt
Ehm, du hast nun kein Objekt, mit dem du die Liste füllen könntest!
Hast du dich schon mal mit Listenverwaltung beschäftigt? Würde sagen, dass du dir erstmal Grundlagenwissen aneignen solltest... |
Re: Tlist wird nicht richtig gefüllt
Ja hab mich schon mit Listenverwaltung beschäftigt, aber bisher noch nie in NonVCL.
Ich möchte auch eigentlich nur die Tabelle von meiner MySQL Datenbank direkt ins Programm laden und wenn sich einer einloggt, sollen die Daten aus der Liste genommen werden. Wenn es da noch bessere Möglichkeiten gibt, als die die ich im Moment habe gebt mir bitte etwas code womit ich nen wenig lernen kann. |
Re: Tlist wird nicht richtig gefüllt
Moin XXcD.
Bin auch noch nicht fit in diesem Thema, habe aber vor kurzem hier im Forum ein tolles Beispiel für die Verwendung von TList bekommen. Ich will mich selbst mal prüfen, ob ich das einigermaßen verstanden habe und erkläre es an einigen beispielhaften Codefragmenten mit meinen eigenen Worten: 1. Deklaration des Datenobjekts (="Record")
Delphi-Quellcode:
2. Deklaration der eigentlichen Liste in deiner Klasse:
type TMyListItem = class
MyInteger : Integer; MyString : String; end;
Delphi-Quellcode:
3. Instanz der Liste bilden (z.B. im Create der Klasse)
// ..
type TMyClass = class(~~) //.. private FMyList : TList; //.. end;
Delphi-Quellcode:
4. Liste mit Werten füllen
constructor TMyClass.Create(AOwner:TComponent);
begin inherited; //.. FMyList:=TList.Create; //.. end;
Delphi-Quellcode:
5. Zugriff auf einen "Record" der Liste
procedure TMyClass.Add2List;
var ListItem : TMyListItem; begin ListItem:=TMyListItem.Create; // "Record" erzeugen ListItem.MyInteger:=22; // "Record" füllen ListItem.MyString:='ein String'; FMyList.Add(ListItem); // Adresse des "Records" an Liste übergeben end;
Delphi-Quellcode:
6. Löschen eines "Records"
function TMyClass.GetListItem(Index:Integer):TMyListItem;
begin Result:=FMyList[Index] end;
Delphi-Quellcode:
7. Gesamte Liste löschen
procedure TMyClass.DeleteItem(Index:Integer);
begin TObject(FMyList[Index]).Free; // "Record" freigeben FMyList.Delete(Index); // Listenelement löschen FMyList.Capacity:=FMyList.Count; // Listengröße anpassen end;
Delphi-Quellcode:
PS : Mit VCL oder nonVCL sollte das eigentlich nix zu tun haben :spin2:
procedure TMyClass.DeleteList;
var i : Integer; begin for i:=1 to FMyList.Count do TObject(FMyList[i-1].Free; // ALLE "Records" freigeben FMyList.Clear; // Liste löschen end; |
Re: Tlist wird nicht richtig gefüllt
Nimm doch einfach den Code aus dem ersten Post und ersetze TList durch TObjectList (unit contnrs). Wenn Du den Parameter OwnsObjects im Konstruktor nicht änderst, kümmert sich die Liste selbstständig um die Freigabe der enthaltenen Objekte. Einfacher geht es doch nicht mehr.
[edit] Da fehlte ein Buchstäbelchen [/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:12 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