Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TTabSheet dynamisch erstellt & nun nicht mehr löschbar (https://www.delphipraxis.net/116356-ttabsheet-dynamisch-erstellt-nun-nicht-mehr-loeschbar.html)

Errraddicator 27. Jun 2008 10:54


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:
    // 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;
Jeder Tab wird mit entsprechendem Titel angezeigt usw.

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

Errraddicator 27. Jun 2008 11:10

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?

RavenIV 27. Jun 2008 11:30

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.

Errraddicator 27. Jun 2008 11:39

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 21:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz