W obsludze kliknięcia przycisku, tworzę obiekt formularza (jesli poprzednia instancja została zwolniona) i przypisuję do globalnej zmiennej (jedna zmienna dla każdej klasy formularza)
Procedure OnClick()
Begin
If not Assigned(mojForm) then
MojForm := TMojForm.Create();
End;
Pod różnymi przyciskami tworzę różne formularze.
W obsludze cyklicznego zdarzenia (powiedzmy OnTimer)
Wykonuję operację na aktywnym formularzu
Obsluz(Screen.ActiveForm);
Po obsłużeniu, zapamietuję formularz w celu uniknięcia kolejnej obslugi tego samego obiektu.
Procedure Obsluz(frm:TForm):
Begin
If LIstaObsluzonych.IndexOf(frm) = -1 then
Begin
WlasciwaOperacja(frm);
ListaObsluzonych.Add(obslugiwanyFormularz);
End;
End;
Po zamknięciu formularza zwalniam jego obiekt i w destrulktorze przypisuję NIL do globalnej zmiennej.
Gdy użytkownik ponownie użyje przycisku (po zamknięciu poprzedniej instancji formularza) tworzonajest kilejna instancja.
I tu docieramy do mojego problemu:
Przy próbie Obslyzenia nowej instancji formularza, okazuje się, że nowy formularz JEST JUŻ NA LISCIE OBSLUZONYCH!
Po sprawdzeniu wychodzi na to że każda kolejna instancja formularza ma ten sam pointer!?!?!?!
Jak to możliwe? Skoro destruktor został wywolany a zmienna wyczyszczone (przypisano NIL)
Kłóci sie to z moją wiedzą na temat obiektów oraz burzy zaplanowane rozwiązanie...
Czy ktoś umie powiedzieć dlaczego nowo utworzony obiekt ma pointer taki jak obiekt przed chwilą zwolniony?
Co zrobić aby zapewnić unikalność pointerow w ramach aplikacji?
Jak inaczej zapewnić jednorazową obsługę obiektów? (Bez ingerencji w ich strukturę)
Post pisałem z komórki - problem nie daje mi spac.
Postaram się go wyedytować i uzupełnić rano gdy będę miał dostęp do kodu.