![]() |
TTabSheet dynamisch erstellt & nun nicht mehr löschbar
Hiho,
da bin ich schon wieder. *G* Also jetzt habe ich nach wie vor x Formulare und jedes Formular enthält 1 Thread der Daten liest. Unter Anderem erstellt dieser Fred auch anhand der Daten x Tabs in diesem Formular. Das klappt auch wunderbar mit
Delphi-Quellcode:
Jeder Tab wird mit entsprechendem Titel angezeigt usw.
// read account list & build a tab for each account
accList := buildAccountList(qryData, dbConnection); for accIndex := 0 to accList.Count - 1 do begin curAcc := accList[accIndex]; newSheet := TTabSheet.Create(display.pagAccounts); newSheet.PageControl := display.pagAccounts; newSheet.Caption := FormatFloat('00000', curAcc.number) + ' ' + curAcc.text; end; Wenn ich das Fenster jetzt aber schließen möchte, erhalte ich folgende Meldung: "Systemfehler! Code 1400: Ungültiges Fensterhandle" Wenn ich die Tabs nicht erstelle bekomme ich den Fehler nicht mehr, d.h. es MUSS daran liegen. Allerdings habe ich keine Vorstellung, woran es liegen könnte. *grübel* Die Tabs werden wie gesagt richtig dargestellt und ich kann in diesen auch navigieren wie ich möchte. Sobald ich aber ein Free() auf ein x-beliebiges dieser Tabs aufrufen möchte, stürzt er mir ab. Hat wer ne Idee, woran das liegen könnte? Bis denne und danke im Voraus cu Patrick |
Re: TTabSheet dynamisch erstellt & nun nicht mehr löschb
So, nach ein wenig Rumspielen bin ich jetzt auf den Trichter gekommen, dass das Problem evt. daran liegt dass der Thread (eine Klasse die logischerweise nix mit dem Formular an sich zu tun hat) das Tab erstellt.
Denn wenn ich einen Tab direkt inner IDE eingebe oder aber auch dynamisch im Form.Show() Event z.B. erstellt funktioniert alles einwandfrei. Erstelle ich den Tab im externen Thread stürzt das Fenster ab. Kann sowas sein? |
Re: TTabSheet dynamisch erstellt & nun nicht mehr löschb
Wobei wir wieder beim sehr beliebten Thema "VCL und Threads" sind.
Die VCL ist nämlich nicht Threadsicher. Niemals in einem Thread auf die VCL (Elemente eines Forms) direkt zugreifen. Dies gilt auch, wenn Du einem Form ein Element (Tab in einem TabSheet) hinzufügen möchtest. Selbiges auch, wenn Du "nur" die Caption eines Labels ändern möchtest. Da muss man Synchronize verwenden. Die Suche im Forum mit den Suchbegriffen "VCL und Threads" oder "Synchonize" wird Dir weiterhelfen. |
Re: TTabSheet dynamisch erstellt & nun nicht mehr löschb
Hey Supi!
Hab jetzt in dem Formular eine Funktion "addTab" gemacht, die einen neuen Tab erzeugt und diese rufe ich dann aus dem Thread heraus mit "Synchronize" auf, dann passts. :) Jetzt habe ich nur noch eine Frage dazu: So wie das aussieht, kann ich dort ja nur sagen, welche Funktion er nehmen soll, gibt es auch eine Möglichkeit dieser Funktion dann Parameter mitzugeben, oder muss ich das z.B. über globale/lokale Variablen bzw. ganz anders lösen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:07 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz