Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zeiger auf TlistItem wird nil (https://www.delphipraxis.net/36076-zeiger-auf-tlistitem-wird-nil.html)

gekmihesg 15. Dez 2004 15:16


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:

jim_raynor 15. Dez 2004 15:19

Re: Zeiger auf TlistItem wird nil
 
Wie weist du dem Array das TListItem zu? Quellcode kann nur schaden, wenn du zuviel davon postet.

gekmihesg 15. Dez 2004 15:24

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;

Dani 15. Dez 2004 15:43

Re: Zeiger auf TlistItem wird nil
 
Hi,
Ist ein TListItem nicht bereits ein Zeiger?

Delphi-Quellcode:
type
  TUser = record
    name: string;
    ip: string;
    status: integer;
    lvp: TListItem;
  end;
PS: Leite deinen Typ doch von TObject ab und nimm anstelle eines Arrays TList, lässt sich imho leichter handhaben :)

jim_raynor 15. Dez 2004 15:43

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:
TUser = record
    name: string;
    ip: string;
    status: integer;
    lvp: TListItem;
  end;
2. user.lvp := @a; nach user.lvp := a; ändern

und 3. Überall beim Zugriff auf lvp das ^ entfernen.

gekmihesg 15. Dez 2004 16:34

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