AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Form in auf einer PageControl-Seite darstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Form in auf einer PageControl-Seite darstellen

Ein Thema von Alphacodex · begonnen am 19. Jul 2009 · letzter Beitrag vom 25. Jul 2009
Antwort Antwort
Alphacodex

Registriert seit: 16. Mär 2006
65 Beiträge
 
Delphi 2006 Professional
 
#1

Form in auf einer PageControl-Seite darstellen

  Alt 19. Jul 2009, 10:26
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Form in auf einer PageControl-Seite darstellen

  Alt 19. Jul 2009, 10:35
Wie bist du genau vorgegangen?
Warum ein Formular und keinen Frame?
Markus Kinzler
  Mit Zitat antworten Zitat
Alphacodex

Registriert seit: 16. Mär 2006
65 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Form in auf einer PageControl-Seite darstellen

  Alt 23. Jul 2009, 09:18
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
  Mit Zitat antworten Zitat
wp_xxyyzz

Registriert seit: 2. Okt 2006
23 Beiträge
 
#4

Re: Form in auf einer PageControl-Seite darstellen

  Alt 23. Jul 2009, 21:14
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Form in auf einer PageControl-Seite darstellen

  Alt 23. Jul 2009, 21:21
Ich muss noch mal frage, warum der Umweg über das Formular?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Alphacodex

Registriert seit: 16. Mär 2006
65 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Form in auf einer PageControl-Seite darstellen

  Alt 24. Jul 2009, 23:40
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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Form in auf einer PageControl-Seite darstellen

  Alt 25. Jul 2009, 00:20
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
wp_xxyyzz

Registriert seit: 2. Okt 2006
23 Beiträge
 
#8

Re: Form in auf einer PageControl-Seite darstellen

  Alt 25. Jul 2009, 18:16
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:57 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