![]() |
Zeiger auf TlistItem wird nil
hallo.
ich hab ein problem mit einem zeiger. und zwar habe ich ein dynamisches array eines records der auch eine zeigervariable für ein TListItem enthält. in einer procedure erweitere ich jetzt das array um 1 und weise der zeigervarible eine speicheradresse zu. wenn ich im lauf der procedure is die adresse noch gespeichert. aber später versuch ich dann in einer anderen procedure auf den wert (oder auf das TListItem) zuzugreifen und die varible is plötzlich nil. was hab ich da falsch gemacht? ich bin etwas aus der übung :wink: |
Re: Zeiger auf TlistItem wird nil
Wie weist du dem Array das TListItem zu? Quellcode kann nur schaden, wenn du zuviel davon postet.
|
Re: Zeiger auf TlistItem wird nil
na gut ;)
Delphi-Quellcode:
type
TUser = record name: string; ip: string; status: integer; lvp: ^TListItem; end; users: array of TUser; procedure TForm1.AddUser(user: TUser); var a: TListItem; i: integer; begin if IndexByIP(user.ip) <> -1 then begin UpdateUser(IndexByIp(user.ip),user); exit; end; if IndexByName(user.name) <> -1 then begin i := 1; while IndexByName(user.name + ' (' + inttostr(i) + ')') <> -1 do inc(i); user.name := user.name + ' (' + inttostr(i) + ')'; end; a := userlv.Items.Add; a.Caption := user.name; user.lvp := @a; // hier wird die adresse zugewiesen setLength(users,length(users)+1); users[high(users)] := user; if users[high(users)].lvp = nil then // hier nur zum testen. da gehts noch showmessage('nil'); if user.status = stat_away then a.ImageIndex := 1 else a.ImageIndex := 0; end; procedure TForm1.UpdateUser(index: integer; user: TUser); begin users[index] := user; showmessage(users[index].name); // user wird richtig erkannt // users[index].lv^.Caption := user.name; geht nich if users[index].lvp = nil then // gibt true, also der wert is weg showmessage('nil'); end; |
Re: Zeiger auf TlistItem wird nil
Hi,
Ist ein TListItem nicht bereits ein Zeiger?
Delphi-Quellcode:
PS: Leite deinen Typ doch von TObject ab und nimm anstelle eines Arrays TList, lässt sich imho leichter handhaben :)
type
TUser = record name: string; ip: string; status: integer; lvp: TListItem; end; |
Re: Zeiger auf TlistItem wird nil
Dein Fehler ist, dass a eine Lokale Variable ist die nach der Funktion überschrieben wird. Mit @a bekommst du die Adresse davon und diese wird abgespeichert.
Alle Objekte (auch TListItem) sind bereits Pointer. Was du erzeugst sind Pointer auf Pointer. Mach also folgendes: 1. Record ändern und das ^ entfernen.
Delphi-Quellcode:
2. user.lvp := @a; nach user.lvp := a; ändern
TUser = record
name: string; ip: string; status: integer; lvp: TListItem; end; und 3. Überall beim Zugriff auf lvp das ^ entfernen. |
Re: Zeiger auf TlistItem wird nil
oh naja wenn das so einfach is...
vielen dank doch nich. genau das gleiche problem... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:06 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