[Delphi] Free z wewnątrz objektu

0

Witam
Mam mały problem. Otóż moja klasa posiada konstruktor, w którym tworzone są zmienne, oraz destruktor, w którym są one zwalniane. Dodatkowo posiada kilka procedur i tu pojawia się problem. Jedna z procedur w zależności od wyniku działania ma (docelowo) mieć możliwość zwolnienia się (całego objektu) z pamięci.

type
 Titem = class(TPanel)
 ...
 constructor create(Aowner : Tcomponent);override;
 destructor destroy; override;
 ...
 procedure cośtam (wejście);
 ...
procedure Titem.cośtam (wejście);
begin
 // coś tam wylicza
 free;
end;

Free oczywiście nie działa ale co wpisać w to miejsce żeby zwalniać objekt z pamięci?

0

Coś innego musi go usunąć, sam nie ma takiej możliwości - żadnej.

0

free(Self);

0

zastanawiałem się nad wątkami, ale nie do końca wiem jak to zrobić :(

0

Szczawik napisał:

Coś innego musi go usunąć, sam nie ma takiej możliwości - żadnej.

Otóż jest tak możliwość: poniżej kod, jest to używane w Delphi(patrz ComObj.pas)

function TComObject.ObjRelease: Integer;
begin
  // InterlockedDecrement returns only 0 or 1 on Win95 and NT 3.51
  // returns actual result on NT 4.0
  Result := InterlockedDecrement(FRefCount);
  if Result = 0 then Destroy;
end;
0

OK. Jeśli to nie powoduje żadnych błędów przy wywołaniu, to przepraszam i wycofuję moją kategoryczną opinię. Sam czegoś się nauczyłem. Myślałem, że wywołanie tego, to za mało, ale skoro tak, to sorry za dezinformację.

Zasugerowałem się pomocą do Delphi (to też odpowiedź na post freeme).

Help Delphi, Free method (TObject) napisał(a)

Warning: Never explicitly free a component within one of its own event handlers or the event handler of a component it owns or contains. For example, don?t free a button, or the form that owns the button, in its OnClick event handler.

0

nie bardzo kapuje jak tego używać :(

0

Jak można nie kapować.
Jest wszystko napisane.
Jeżeli czcesz żeby obiekt się zwolnił to wywołaj destruktora tego obiektu a nie motode Free;

0
dj napisał(a)

Jeżeli czcesz żeby obiekt się zwolnił to wywołaj destruktora tego obiektu a nie motode Free;

Chciałbym się dołączyć do tego tematu i poprosić o wytłumaczenie dlaczego trzeba użyc Destroy a nie Free ??

0

no więc panowie powiem wam że Destroy owszem usuwa objekt, po czym wyświetla się błąd dostępu do pamięci. Przypominam że free/destroy wywoływane jest z procedury należącej do klasy

0

Czyżbym jednak miał rację, że nie jest to dozwolone?

//A jakby ktoś pytał o różnicę Free oraz Destroy, to Free sprawdza przed usunięciem obiektu, czy nie jest on nil, więc nie wyrzuca błędów przy usuwaniu nieprawidłowych obiektów.

0

Więc jak zwykle musiałem sobie poradzić sam, ale i tak dzięki. Problem rozwiązałem w trochę nietypowy i niepraktyczny sposób, no ale jak na mój program starczy. Po prostu użyłem zewnętrznego objektu TTimer. Jedynym minusem jest to, że mój objekt znika około 0.01s po kliknięciu no ale cóż :)

Myślę że nie musze umieszczać źródeł sposobu rozwiązania tego bo używanie Ttimer jest stosunkowo proste :]

0

Tak swoją drogą zastanawia mnie, po co obiekt sam ma się usuwać. Nigdy nie potrzebowałem z tym kombinować.

Coś wywołuje tą metodę, więc czy nie może działać to w ten sposób:

if (not item.cośtam()) then item.Free();
0
Szczawik napisał(a)

Tak swoją drogą zastanawia mnie, po co obiekt sam ma się usuwać. Nigdy nie potrzebowałem z tym kombinować.

faktycznie trochę się zamotałem przy tym. Klasa jest potomną TFrame - zawiera się w niej kilkanaście standartowych komponentów. Jeden z nich jest przyciskiem zamykającym cały objekt (niszczącym go) i stąd potrzeba samozniszczenia. Myślałem nad tworzeniem komponentu, czytałem o różnych sposobach na robienie takich elementów ale we wszystkich przypadkach natrafiałem na problem samo-niszczenia, więc wróciłem do Tframe...

0

Może sie przyda:

TForm ma metodę Release służącą do zwalniania formy którą można wywołać wewnątrz jednej z metod tejże formy. Moze warto podejrzec w module Forms jak to jest zrobione.

Inna metoda jaka przyszła mi do głowy, to wysłanie komunikatu do głównego okna tuż przed zamknięciem obiektu. Aplikacja w odpowiedzi na ten komunikat zwalniałaby obiekt.

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