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 Form in auf einer PageControl-Seite darstellen (https://www.delphipraxis.net/137352-form-auf-einer-pagecontrol-seite-darstellen.html)

Alphacodex 19. Jul 2009 10:26


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

mkinzler 19. Jul 2009 10:35

Re: Form in auf einer PageControl-Seite darstellen
 
Wie bist du genau vorgegangen?
Warum ein Formular und keinen Frame?

Alphacodex 23. Jul 2009 09:18

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

wp_xxyyzz 23. Jul 2009 21:14

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:
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.
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.
Wichtig ist auch der explizite Aufruf von "Show" für die Kind-Formulare, die sonst versteckt bleiben.

Luckie 23. Jul 2009 21:21

Re: Form in auf einer PageControl-Seite darstellen
 
Ich muss noch mal frage, warum der Umweg über das Formular?

Alphacodex 24. Jul 2009 23:40

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

Luckie 25. Jul 2009 00:20

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.

wp_xxyyzz 25. Jul 2009 18:16

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 05:40 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