Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Tlist wird nicht richtig gefüllt (https://www.delphipraxis.net/119574-tlist-wird-nicht-richtig-gefuellt.html)

XXcD 28. Aug 2008 14:24


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:
  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;
Das Ergebnis in der Konsole ist:
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?

DeddyH 28. Aug 2008 14:27

Re: Tlist wird nicht richtig gefüllt
 
Das
Delphi-Quellcode:
Account:= TAccounts.Create;
muss natürlich mit in die For-Schleife, sonst legst Du keinen neuen Account an, sondern überschreibst den bestehenden.

Roachford 28. Aug 2008 14:27

Re: Tlist wird nicht richtig gefüllt
 
Zitat:

Zitat von XXcD
Wo könnte da der Fehler liegen?

Vielleicht daran, dass du nur ein Objekt erzeugst und dieses eine ständig erneut hinzufügst?

XXcD 28. Aug 2008 14:39

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.

DeddyH 28. Aug 2008 14:41

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?

I.A 28. Aug 2008 14:46

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:
type
  TAccount = class(TObject)
   ...
  end;
statt:

Delphi-Quellcode:
type
  TAccount = class(TList)
   ...
  end;
In TList hast Du alles, was Du für Deine Liste brauchst. Warum da ein neues Listenobjekt?

DeddyH 28. Aug 2008 14:48

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.

XXcD 28. Aug 2008 14:58

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;

spaxxn 28. Aug 2008 14:59

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...

XXcD 28. Aug 2008 16:14

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.

taaktaak 28. Aug 2008 17:18

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:
type TMyListItem = class
                     MyInteger : Integer;
                     MyString : String;
                     end;
2. Deklaration der eigentlichen Liste in deiner Klasse:
Delphi-Quellcode:
 // ..
type TMyClass = class(~~)
     //..
     private
       FMyList : TList;
     //..
     end;
3. Instanz der Liste bilden (z.B. im Create der Klasse)
Delphi-Quellcode:
constructor TMyClass.Create(AOwner:TComponent);
begin
  inherited;
  //..
  FMyList:=TList.Create;
  //..
end;
4. Liste mit Werten füllen
Delphi-Quellcode:
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;
5. Zugriff auf einen "Record" der Liste
Delphi-Quellcode:
function TMyClass.GetListItem(Index:Integer):TMyListItem;
begin
  Result:=FMyList[Index]
end;
6. Löschen eines "Records"
Delphi-Quellcode:
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;
7. Gesamte Liste löschen
Delphi-Quellcode:
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;
PS : Mit VCL oder nonVCL sollte das eigentlich nix zu tun haben :spin2:

DeddyH 28. Aug 2008 17:48

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