Ja mam obawy, że problem jest w czymś innym niż sam ten obiekt :/
Jak widać na zrzucie, błąd występuje w metodzie TTimer.WndProc
, a więc wygląda na to, że wywala się kod timera, który odpowiedzialny jest za przechwytywanie zdarzeń WM_TIMER
i odpalanie zdarzenia OnTimer
. Więcej informacji jest tutaj — https://docwiki.embarcadero.com/CodeExamples/Alexandria/en/TTimerFWindowHandle_(Delphi). Jest tam nawet kod, który pokazuje jak to działa (usunąłem komentarze):
procedure MyTTimer.WndProc(var Msg: TMessage);
begin
with Msg do
if Msg = WM_TIMER then // Check for timer messages.
try
Timer; // This calls the OnTimer event handler.
except
Application.HandleException(Self);
end
else
Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
end;
Tak więc albo wywala się kod timera, albo kod zdarzenia OnTimer
.
Edit: tak szczerze pisząc, gdyby błąd dotyczył zdarzenia OnTimer
, to byłoby ono widoczne w callstacku (wywołanie metody Timer
też), a nie jest. Coś w tej metodzie odwołuje się do nieprzydzielonej lub już zwolnionej pamięci. Jedyne co mi przychodzi do głowy to to, że metoda WndProc
lub Timer
została wywołana na już zwolnionej instancji klasy TTimer
. Ale w to trochę mi trudno uwierzyć, bo zniszczenie instancji timera wyrejestrowuje uchwyt okna (który timer sobie rejestruje w swoim konstruktorze), a więc po zniszczeniu timera ten uchwyt już nie istnieje (zostaje wyrejestrowany), więc system nie wyśle do niego komunikatu (czyli metoda WndProc
się nie wykona).