Mam pewną trudną sytuację. Muszę być w stanie uwolnić obiekt, który jest polem zapisu. Normalnie zapisałbym kod czyszczenia w destruktorze, gdyby był klasą. Ale ponieważ typy rekordów nie mogą wprowadzić "destruktora", jak można byłoby wywołać TObject (Field) .Free;?Jak uwolnić obiekt znajdujący się w rejestrze?
Będą dwa rodzaje użytkowania Przewiduję:
Wymiana rekord z nowym.
Myślę, że takie użycie byłoby łatwe do wdrożenia. Ponieważ rekordy są typami wartości i dlatego są kopiowane na zlecenie, mogę przeciążyć operatora przypisującego i zwolnić obiekty posiadane przez stary rekord.
(Edit: Przypisanie przeciążenia nie był w stanie To nowe informacje do mnie ...)
Wychodzenie zakres gdzie zdefiniowana zmienna rekord.
Mogę wymyślić prywatną metodę, która zwalnia obiekty i tę metodę można wywołać ręcznie na wzbudzeniu zakresu. ALE, tutaj jest to samo pytanie: jak zrobić to bardziej rekordowo? Takie zachowanie niby czuje się jak w klasie ...
Oto próbka (i oczywiście nie zamierzone wykorzystanie):
TProperties = record
... some other spesific typed fields: Integers, pointers etc..
FBaseData: Pointer;
FAdditionalData: TList<Pointer>;
//FAdditionalData: array of Pointer; this was the first intended definition
end;
Załóżmy,
FAdditionalData:=TList<Pointer>.Crete;
nazywa w konstruktorze rekordów lub ręcznie w zakresie zmiennych rekordów, uzyskując dostęp do pola publicznie, np.
procedure TFormX.ButtonXClick(Sender: TObject);
var
rec: TProperties;
begin
//rec:=TProperties.Create(with some parameters);
rec.FAdditionalData:=TList<Pointer>.Create;
//do some work with rec
end;
Po wyjściu z zakresu ButtonClick rec więcej nie jest tylko TList nadal utrzymuje ich istnienia, co powoduje przecieki pamięci ...
Przypisywanie rekordów nie może być przeciążone. – kludg
Nie zdawałem sobie z tego sprawy (nigdy wcześniej nie potrzebowałem), ale nauczyłem się tego teraz :) Tak, nie można było przeciążać ... –