![]() |
Tabsheet samt Inhalt zur Laufzeit erstellen
Hi,
Schönes neues Jahr erstmal. Ich möchte zur Laufzeit Tabsheets erstellen, komplett mit allen Objekten die darauf liegen. Es handelt sich dabei um ein Formular zu einem Auftrag. Ich möchte für andere Aufträge jeweils ein neues TabSheet mit allen dazugehörigen Formulardaten erstellen. Wie kann man das am einfachsten anstellen? |
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Mmh. Ich denke am Besten du machst dafür ein Frame (TFrame). Dort kannst du alle Komponenten zu Designzeit reinpacken und wie mit einem Formular arbeiten. Dieses Frame kann dann in einen Tabsheet eingebettet werden.
Wie man dynamisch TTabsheets erstellt findest du hier zu genüge. |
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Hört sich ja nicht schlecht an aber wie stell ich das an? Wie kann ich das Frame in das TabSheet einbetten?
|
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Ich stelle mir also nen Button vor, von wegen "Auftrag in neuem Tab öffnen" und ich bekomme auf einem neuen Tab das komplette Formular des neuen Auftrags - in etwa so wie bei Firefox.
|
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Ich hab jetzt wenigstens schonmal rausbekommen, wie ich die Tabsheets zur laufzeit erzeue. Ich hab dafür folgenden code:
Delphi-Quellcode:
Prinzipiell könnte man jetzt sicher sämtliche darauf befindlichen Objekte genauso erschaffen aber dabei handelt es sich um ca. 20 DBEDITs, Labels, ... mit sämtlichen Positionen und Eigenschaften, was also nen recht großen Aufwand bedeuten würde.
procedure Tfrmmain.Button1Click(Sender: TObject);
var newsheet:ttabsheet; begin newsheet:=ttabsheet.Create(pcauftrag); newsheet.Caption:='neu'+ inttostr(pcauftrag.PageCount+1); newsheet.PageControl:= pcauftrag; end; Ich bräuchte also eine Möglichkeit, meine Tabsheets aus einer Vorlage zu erstellen. |
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Du erstellst einfach ein Frame
(Neu -> Frame) Setzt deine Controls darauf. Und erstellst es einfach mit dem Tab :
Delphi-Quellcode:
procedure Tfrmmain.Button1Click(Sender: TObject);
var newsheet:ttabsheet; NewFrame:TFrame1; begin newsheet:=ttabsheet.Create(pcauftrag); newsheet.Caption:='neu'+ inttostr(pcauftrag.PageCount+1); newsheet.PageControl:= pcauftrag; NewFrame := TFrame1.Create(self); NewFrame.parent := Newsheet; end; |
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
OK, ein komplettes Tabsheet kann ich so erstellen, beim zweiten meckert er mich allerdings an, das Frame1 schonmal existiert.
|
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Hab's hinbekommen, einfach umbenennen und schon funzt's
Delphi-Quellcode:
procedure Tfrmmain.Button1Click(Sender: TObject);
var newsheet:ttabsheet; newframe:tframe1; begin newsheet:=ttabsheet.Create(pcauftrag); newsheet.Caption:='neu'+ inttostr(pcauftrag.PageCount+1); newsheet.PageControl:= pcauftrag; NewFrame := TFrame1.Create(self); newframe.Name := 'tframe' + inttostr(pcauftrag.PageCount+1); NewFrame.parent := Newsheet; end; Schönen Dank an alle. |
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Hi nochmal,
Ich hab jetzt auf den Frame noch nen Button gesetzt, mit dem sich das aktuelle Tabsheet mit allem darauf befindlichem schließen soll. Dazu dieser Code - den hab ich von ![]()
Delphi-Quellcode:
Allerdings bekomme ich nen Fehler "undefinierter Bezeichner TTabSheet" in der zweiten Zeile. Wenn ich diese Zeile herauslasse passiert allerdings auch gar nix.
procedure Tframeauftrag.Button1Click(Sender: TObject);
begin (FindComponent('frameauftrag' + IntToStr(frmmain.pcauftrag.ActivePageIndex)) as TFrameauftrag).Free; (FindComponent('tabauftrag' + IntToStr(frmmain.pcauftrag.ActivePageIndex)) as TTabSheet).Free; end; :stupid: Hasst mich nicht für meine Dummheit!! :lol: |
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Zitat:
![]() Nachtrag: Hm, ich komme nicht auf den von dir genannten Link, seltsam. Wo ich schonmal schreibe: Man kann und soll Beiträge editieren. Hast du evtl vergessen, die ComCtrls.pas einzubinden? |
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Zitat:
Zitat:
|
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Wie kann ich denn die erstellten Tabsheets wieder löschen?
|
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Destroy sollte man dafür nicht nehmen, wenn, dann Free. Wenn man das ganze sauber machen möchte, sollte man das objektorientiert machen, dann hast du einen Constructor und einen Destructor zur Verfügung, wo du die Objekte sauber wieder freigeben kannst.
|
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Wie gesagt hab ich es mit diesem Code versucht
Delphi-Quellcode:
Allerdings passiert rein gar nix wenn ich auf den Button klicke.
procedure Tframeauftrag.Button1Click(Sender: TObject);
begin (FindComponent('frameauftrag' + IntToStr(frmmain.pcauftrag.ActivePageIndex)) as TFrameauftrag).Free; (FindComponent('tabauftrag' + IntToStr(frmmain.pcauftrag.ActivePageIndex)) as TTabSheet).Free; end; Kann das damit zusammenhängen, das der Button auch auf dem Frame liegt, das zur Laufzeit erstellt wird und daher nen ganz anderenen Namen hat? |
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Also daran scheint's nicht zu liegen.
Ich hab mir den Namen des Buttons mal in nem Edit ausgeben lassen und der heißt so wie in der OnClick-Prozedur. Die Prozedur wird also ausgelöst. Was ist denn sonst verkehrt? Fehlt noch was? |
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Das große Problem ist doch, dass sich die Nummerierung der Pages ändert, wenn du eins löscht. Von daher kannst du garnicht so einfach über ActivePageIndex das Frame ermitteln.
Wenn du das Frame mit TMyFrame.Create(NewTabSheet), statt TMyFrame.Create(Self) angelegst, sollte es reichen das Tabsheet freizugeben (PageControl.ActivePage.Free). Das Frame wird dann automatisch freigegeben, da ja das Tabsheet der Owner des Frames ist. Weiterhin, ist es schwierig, aus einem OnClick eines Buttons des Frames, das Frame freizugeben, da ja nach dem OnClick noch bissle was mit dem Button passiert. Du solltest also auf deinem Haupt-Formular (nicht im Frame) den Button packen und dann einfach wie oben geschrieben, freigegeben. |
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
Mit dem Button auf dem MainForm fuktioniert's :lol:
Dann muss ich mir eben was für's Layout einfallen lassen. :gruebel: Vielen Dank erstmal. |
Re: Tabsheet samt Inhalt zur Laufzeit erstellen
wie passend dieser thread hier! hab grad ein ähnliches problem.
hab über datei->neu->frame einen neue frame erzeugt, und mir dort einen erweiterten konstruktor geschrieben, der als parameter eine referenz auf ein pagecontrol bekommt. in diesem erzeuge ich dann ein tabsheet, und änder dann den parent von den komponenten auf meinem frame auf das tabsheet-objekt. soweit so gut, funktioniert perfekt, tabsheet wird angezeigt etc. beim destruktor des frames geb ich dann entsprechend das tabsheet wieder frei, allerdings kommt dann die fehlermeldung "Formular kann nicht erstellt werden, zurzeit sind keine mdi-formulare aktiv" (EInvalidOperation). Hat jemand ne idee? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:44 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 by Thomas Breitkreuz