2011-11-04 11 views
5

To jest mój pierwszy post tutaj, ale chciałbym podziękować społeczności, ponieważ znalazłem rozwiązania moich problemów niezliczoną ilość razy, przychodząc tutaj i znajdując rozwiązanie w pytaniu na które już udzielono odpowiedzi.Tworzenie/niszczenie klas wirtualnych w delphi

Powiedziawszy to, chciałbym przejść do rzeczy. Pracuję w IDE Code Delphi 2007. Wciąż jestem raczej nowy w pracy z Delphi, mniej niż 3 miesiące, aby być precyzyjnym, więc proszę o tym pamiętać, ponieważ może brakować czegoś podstawowego.

Najpierw chciałbym podać mały kontekst związany z problemem. Piszę narzędzie planowania do wykonywania zadań w określonych godzinach. Dla każdego dostępnego zadania istnieją 2 powiązane ramki delphi, które są powiązane z tym zadaniem. Pierwsza klatka służy do edycji szczegółów właściwych dla tego zadania, a druga ramka służy do wyświetlania informacji o czasie wykonywania, gdy zadania są uruchomione.

Lista uruchomionych zadań jest przechowywana, aw przewijanym oknie narzędzia wyświetlane jest lista odpowiednich ramek dla informacji o środowisku wykonawczym. Te ramki środowiska wykonawczego są tworzone i niszczone podczas uruchamiania i kończenia zadań. Co prowadzi mnie do mojego problemu.

Używam menedżera klasy wirtualnej, aby zachować listę dostępnych ramek do wyświetlania i edycji dla każdego zadania i tworzyć je w locie zgodnie z potrzebami. Podczas działania wszystko zachowuje się właściwie, gdy aplikacja faktycznie zamyka, że ​​widzę problem.

program uchyla wyjątek wyjątku naruszenia karty jako zakończenie. Kiedy próbowałem prześledzić problem za pomocą IDE, linia lub akcja odpowiadająca problemowi nie istnieje w moim kodzie. Musi więc być częścią niektórych funkcji czyszczenia, które są wykonywane w tle.

Zawęziłem to do kodu, który tworzy klatki klas wirtualnych w locie, ponieważ zamyka się dobrze, gdy mam ten kod skomentowany. Prowadzi mnie to do przekonania, że ​​nie wykonuję niektórych czynności związanych z używaniem tego rodzaju tworzenia klas.

var 
    tmpCCI: TComponentClassInfExt; 
    tmpS: String; 
    tc: TComponent; 
    bf: TBaseactionedit; 
... 
begin 
... 
tc := tmpCCI.fComponentClass.Create(nil); 
if tc is TBaseactionedit then 
begin 
    bf := TBaseActionEdit(tc); 
    bf.name := tmpCCI.fComponentClass.classname+IntToStr(nameCount); 
    bf.Visible := False; 
    bf.parent := pnlActionEdit; 
    bf.Align := alClient; 
    bf.Visible := True; 
end; 
... 

Oto fragment, w jaki sposób tworzę ramki przy użyciu menedżera klas wirtualnych. Zwalniam instancje z FreeAndNil, gdy nie są już potrzebne. Doszedłem do tego, co w mojej mocy, by upewnić się, że poprawnie usunąłem instancje, zanim aplikacja się zamknie, ale oczywiście brakuje mi czegoś.

Czy ktoś ma jakieś pomysły na temat tego, skąd wziąć debugowanie czegoś takiego?

P.S. po raz kolejny jestem nowy, więc jeśli jest coś, co przegapiłem, pomalowałem lub zapomniałem dodać, proszę dać mi znać. Jeszcze raz dziękuję za przeczytanie mojego posta!

+0

Doświadczyłem AVs na wyłączanie, jeśli pozwolisz hierarchii "Właściciel" zniszczyć wszystko podczas zamykania. Spróbuj wywołać 'Free' na głównym formularzu (i innych otwartych formularzach) przy wyłączaniu. Zrób to, dodając do pliku .dpr po linii 'Application.Run'. –

Odpowiedz

2

To prawdopodobnie rodzic uwalnia wszystkie kontrolowane elementy podczas Destroy.

+1

Jeśli rodzic chce go zniszczyć podczas zamykania aplikacji, jaki byłby właściwy sposób zniszczenia ramki, gdy nie jest ona już potrzebna w czasie pracy, lub czy istnieje sposób mówienia rodzicowi, to nie musi martwić się o próbę niszczyć komponent? – PoultrySlave

+4

@PrematureOptimization 'TWinControl' uwalnia także swoje elementy podrzędne, zobacz [tutaj] (http://stackoverflow.com/questions/7075637/). –

+0

@Nie, dziękuję, całkiem interesujący i niebezpieczny zakątek VCL –

Powiązane problemy