![]() |
Form in auf einer PageControl-Seite darstellen
Hallo,
ich habe, so wie in einem anderen Thread angedeutet, versucht ein zur Designzeit erstelltes Formular innerhalb einer Seite einer PageControl darzustellen. Also ich habe eine Umain und eine Ufall. In der Umain ist ein PageControl und in Ufall ist ein Formular mit einem Gridd und ein paar Buttons. Nun soll dieses Formular auf einer der Seiten der PageControl in Umain "eingefügt" werden. Da die Inhalte der Seiten recht fest sind brauche ich eigentlich nix zur Laufzeit designen oder createn. Das habe ich schon probiert (ohne Erfolg): Ich habe versucht den Parent des Ufall - Formulars auf eine Seite der PageControl zu setzen, und zwar einmal innerhalb des OnCreate Ereignisses von Ufall und weil ich mir nicht sicher war obs damit Probleme geben könnte auch im OnShow Ereignis des Formulars in der Umain. In beiden Fällen wird auf der gewünschten Page nicht der Inhalt des Formulars aus Ufall eingefügt... Weiss jemand Rat? Grüße Codex |
Re: Form in auf einer PageControl-Seite darstellen
Wie bist du genau vorgegangen?
Warum ein Formular und keinen Frame? |
Re: Form in auf einer PageControl-Seite darstellen
Habe zur Laufzeit den Parent des designeten Forumlars auf eine Page des TabSheets gesetzt. Was aber geht und das nehme ich im Moment als Workaround, ist, auf das Formular nochmal ein Panel draufzusetzen, das genausogroß ist wie das Formular selbst und diesem Panel dann zur Laufzeit die Page des TabSheets als Parent zu geben. So funzt es im Moment.
Vielleicht kann in Delphi ja ein Frame nicht Parent eines anderen Frames sein??? Grüße Codex |
Re: Form in auf einer PageControl-Seite darstellen
Folgender Code funktioniert bei mir einwandfrei (getestet unter D7).
Delphi-Quellcode:
unit Main;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, ExtCtrls; type TMainForm = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; TabSheet2: TTabSheet; procedure FormCreate(Sender: TObject); private { Private-Deklarationen } procedure InsertForms; public { Public-Deklarationen } procedure BeforeRun; end; var MainForm: TMainForm; implementation uses Child1, Child2; {$R *.dfm} procedure TMainForm.InsertForms; begin // ChildFormRed := TChildFormRed.Create(self); ChildFormRed.Parent := TabSheet1; ChildFormRed.Align := alClient; ChildFormRed.Show; // ChildFormBlue := TChildFormBlue.Create(self); ChildFormBlue.Parent := TabSheet2; ChildFormBlue.Align := alClient; ChildFormBlue.Show; end; procedure TMainForm.FormCreate(Sender: TObject); begin // InsertForms; // NEIN: Das gibt eine Zugriffsverletzung, da die Formulare noch // gar nicht existieren! // Stattdessen die neue öffentliche Methode "BeforeRun" verwenden end; procedure TMainForm.BeforeRun; // Wird im Projekt-File vor Application.Run aufgerufen. begin InsertForms; end; end.
Delphi-Quellcode:
Ich verwende ein MainForm mit einem zweiseitigen PageControl, sowie zwei Kind-Formulare, jeweils eine eigene Klasse, die sich nur in der Formularfarbe unterscheiden. In der beigefügten Version werden die Kind-Formulare automatisch erzeugt. Wichtig ist, diese Formulare nicht im OnCreate des MainForm ins PageControl einzufügen, da sie zu diesem Zeitpunkt ja noch gar nicht existieren. Im Prinzip kann man das OnShow-Ereignis nehmen, aber da das Hauptformular ja gerade angezeigt wird, kann sich bei komplexen Formularen ein unruhiger Bildaufbau ergeben. Stattdessen habe ich für solche Zwecke immer eine "BeforeRun"-Methode des Hauptformulars vorbereitet, die ich im Project-File explizit vor "Application.Run" aufrufe.
program FormsInPageControl;
uses Forms, Main in 'Main.pas' {MainForm}, Child1 in 'Child1.pas' {ChildFormRed}, Child2 in 'Child2.pas' {ChildFormBlue}; {$R *.res} begin Application.Initialize; Application.CreateForm(TMainForm, MainForm); Application.CreateForm(TChildFormRed, ChildFormRed); Application.CreateForm(TChildFormBlue, ChildFormBlue); MainForm.BeforeRun; // neu! Application.Run; end. Wichtig ist auch der explizite Aufruf von "Show" für die Kind-Formulare, die sonst versteckt bleiben. |
Re: Form in auf einer PageControl-Seite darstellen
Ich muss noch mal frage, warum der Umweg über das Formular?
|
Re: Form in auf einer PageControl-Seite darstellen
Danke für das Ausprobieren...ich teste mal ob das bei mir so auch geht, dann kann ich mir das Panel sparen...
@Luckie Naja, weil die Inhalte der Formulare fest sind ich sie so schön zur Designzeit zusammenklicken kann und dann aus der UMain heraus auf der Tabsheet anzeigen kann => kein Code-Wirrwarr in der UMain und trotzdem bequem design-bare Formulare. Von Komponentenentwicklung oder Frames habe ich leider keine Ahnung - hab in einem anderen Forum gelesen, dass das auch gehen soll. Das war halt der für meine Kenntnisse einfachste Weg... Wie hättest Du es denn gelöst? Grüße Codex |
Re: Form in auf einer PageControl-Seite darstellen
Also wenn du ein "Code Wirrwar" hast, dann machst du was falsch. Und der Weg über ein Formular ist definitiov der falsche dieses
"Code-Wirrwarr" zu umgehen. das was du machst ist ungegfäjhr so, als wennman einen vollbeladenen Lieferwagen auf einen Sattelschlepper zu stellen, anstatt den Lieferwagen selbst fahren zu lassen. |
Re: Form in auf einer PageControl-Seite darstellen
Ich habe selbst schon mehrfach Kindformulare in ein Hauptformular eingebettet, um den Code des Hauptformulars in funktionale Einheiten zu entzerren. Zugegeben, das begann zu Zeiten von Delphi 4, als es noch keine Frames gabe. Aber auch zu Zeiten von D7 habe ich mich immer wieder für diesen Weg entschieden, nachdem Frames z.B. Probleme mit dem ActionManager haben. Die Technik mit den eingebetteten Formularen hat auch den Vorteil, das man ein Kind-Formular mal schnell für Testzwecke zum Hauptformular machen kann, um es besser durchtesten zu können (geht natürlich nur, wenn das Projekt entsprechend strukturiert ist). Einen Ideologiestreit, was in diesem Zusammenhang "definitiv falsch" ist, sollte man nicht austragen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 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