Pole obiektu z listy

0

Cześć mam listę TList pewnej struktury, np:

TMyRec = record
  pole1: string;
  pole2: boolean;
end;

Dodanie jest banalne:

  List.Add(@myRec);

Ale jak odczytać jakiś element tego rekordu?
Próbowałem na wiele sposobów, najlepszym dla mnie był:

  TMyRec(List.Items[0]^).pole1;

Ale nie działa oczywiście.

0
type
TMyRec = record
  pole1: string;
  pole2: boolean;
end;

PMyRec = ^TMyRec;

//...

PMyRec(List.Items[0])^.pole1;
0

Nie idzie.

0
Juhas napisał(a)

Nie idzie.

Może napisał byś więcej szczegółów?

Spróbuj tak:

type
TMyRec = record
  pole1: string;
  pole2: boolean;
end;
var
  lista : TList;
  myRec,myRec2 : TMyRec;
begin
  lista := TList.Create;
  myrec.pole1 := 'test';
  myrec.pole2 := true;
  lista.Add(@myrec);
  myRec2 := TMyRec(Lista.Items[0]^);
  ShowMessage(myRec2.pole1);

No musi działać :-)

0

Widzisz, w taki sposób. A ja robiłem tak, jak wyżej :)

0

Jak nie działa, jak musi działać? A nie jest przypadkiem tak, że do List dodajesz adres zmiennej lokalnej? Oto cały kod.

type
  TMyRec = record
    pole1: string;
    pole2: boolean;
    end;
  PMyRec = ^TMyRec;
var List:TList;
    MyRec:PMyRec;
begin
List:=TList.Create;
new(MyRec);
MyRec.pole1:='AAA';
List.Add(MyRec);
ShowMessage(PMyRec(List.Items[0]).pole1);
dispose(PMyRec(List.Items[0]));
List.Delete(0);
List.Free;
end;
0

Tak, dodaję zmienną lokalną, gdyż chcę uniknąć dodawania do TList wskaźników wskazujących na ten sam obszar.
A nie mogę posłużyć się tablicą dynamiczną(nie znam ilości tych zmiennych)

[dopisane]
OK, okazało się, że przy przyrównaniu mam AV jednak, mało tego, zrobiłem to, czego chciałem uniknąć, a więc lista trzyma te same adresy w każdym elemencie.
(przy zmiennych lokalnych)

[dopisane]
Sprawdziłem dla globalnych i jest to samo, z tym, że nie wywala się AV

Czy ktoś wie, jak to rozwiązać bez tablic dynamicznych?

0
Juhas napisał(a)

Tak, dodaję zmienną lokalną, gdyż chcę uniknąć dodawania do TList wskaźników wskazujących na ten sam obszar.

No to właśnie przy zmiennej lokalnej może się zdarzyć, że otrzymasz ten sam adres, bo po wyjściu z funkcji, ten zakres pamięci nie jest już prawidłowy (pamiętaj, że nie wolno Ci się poza funkcją do zmiennej lokalnej odwoływać).

Dlatego na rekordy powinieneś alokować pamięć (new/dispose). Wciąż nie rozumiem z czym masz zatem problem.

0

Błąd robiłem taki, że nie alokowałem ręcznie pamięci.

1 użytkowników online, w tym zalogowanych: 0, gości: 1