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 VCL Formular in ein Panel einbetten (https://www.delphipraxis.net/200963-vcl-formular-ein-panel-einbetten.html)

delphicoder123 11. Jun 2019 19:26

VCL Formular in ein Panel einbetten
 
Im Formular "Form1" befindet sich ein Panel.
Auf diesem Panel soll ein zweites Formular "Form2" eingebettet werden.
Es sollen aber nicht nur die Komponenten eingebettet werden, sondern auch die Funktionsweise.
Ich verwende ein VCL Formular.

Suchfunktion habe ich schon verwendet. Trotzdem bekomme ich es anhand des Beispiels nicht hin.
https://www.delphipraxis.net/27476-f...einbetten.html

Was mache ich falsch?
Hier ist mein aktueller Code:

Code:
unit parent;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, child;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1 := TForm1.Create(Panel1);
  Form1.Parent := Panel1;
  Form1.SetBounds(10,10,Form2.Width, Form2.Height);
  Form1.FormStyle := fsNormal; // Hatte diese Zeile vergessen
  Form1.Visible := true;
end;

end.

Code:
unit child;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    btnCalc: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    procedure btnCalcClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.btnCalcClick(Sender: TObject);
begin
edit3.Text:=edit1.Text+edit2.Text;
end;

end.

hoika 11. Jun 2019 19:30

AW: VCL Formular in ein Panel einbetten
 
Hallo,
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1 := TForm1.Create(Panel1);
Ich dachte, du wolltest Form2 erstellen.

delphicoder123 11. Jun 2019 19:47

AW: VCL Formular in ein Panel einbetten
 
Zitat:

Zitat von hoika (Beitrag 1434367)
Hallo,
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1 := TForm1.Create(Panel1);
Ich dachte, du wolltest Form2 erstellen.


Was ist jetzt genau mein Fehler?

hoika 11. Jun 2019 20:21

AW: VCL Formular in ein Panel einbetten
 
Hallo,

alt
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1 := TForm1.Create(Panel1);
neu
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.Create(Panel1);

uligerhardt 11. Jun 2019 20:51

AW: VCL Formular in ein Panel einbetten
 
Außerdem: Wenn möglich, nimm Frames statt Forms, wenn du es einbetten willst.

Luckie 11. Jun 2019 21:17

AW: VCL Formular in ein Panel einbetten
 
Warum willst du ein Auto in den Kofferraum eines anderen Autos packen? :roll:

EWeiss 11. Jun 2019 21:30

AW: VCL Formular in ein Panel einbetten
 
Zitat:

Zitat von Luckie (Beitrag 1434374)
Warum willst du ein Auto in den Kofferraum eines anderen Autos packen? :roll:

Zitat:

Auf diesem Panel soll ein zweites Formular "Form2" eingebettet werden.
Wir wissen doch gar nicht warum und welchen zweck er damit erfüllen will.

Weist du eigentlich wie viele Windows ich in einem anderen Parke?
Überlege mal was ein Button ist..
Vielleicht will er genau das damit bezwecken.. lediglich die Form als Fenster(Window) zweckentfremden.

Ein Auto-Fahrzeugtransporter tut nichts anderes. ;)

gruss

Luckie 11. Jun 2019 21:39

AW: VCL Formular in ein Panel einbetten
 
Deswegen Frage ich ja. Und ja ich weiß was Schaltflächen und andere Kontrollelemente sind. Aber eine Schaltfläche ist kein Hauptfenster und kann es nicht sein. Und wenn du ein Auto mit einem Auto transportierst, dann benutzt du ein Auto, was dafür gedacht ist. Im Falle der VCL wären das, wie oben schon gesagt, Frames.

EWeiss 11. Jun 2019 21:40

AW: VCL Formular in ein Panel einbetten
 
Zitat:

Zitat von Luckie (Beitrag 1434376)
Deswegen Frage ich ja. Und ja ich weiß was Schaltflächen und andere Kontrollelemente sind. Aber eine Schaltfläche ist kein Hauptfenster und kann es nicht sein. Und wenn du ein Auto mit einem Auto transportierst, dann benutzt du ein Auto, was dafür gedacht ist.

Nun ja ein MDI-Hauptformular ist nichts anderes als eine Form und es ist durchaus berechtigt diese in eine andere Form zu parken..
Abgesehen davon das es noch erwünscht ist.. macht man ja heute nicht mehr.
Zitat:

Und ja ich weiß was Schaltflächen
Ist mir klar.. ;)

gruss

delphicoder123 11. Jun 2019 22:14

AW: VCL Formular in ein Panel einbetten
 
Zitat:

Zitat von uligerhardt (Beitrag 1434373)
Außerdem: Wenn möglich, nimm Frames statt Forms, wenn du es einbetten willst.

Du meinst, dass ich ein VCL-Frame anstatt eines VCL Formular nehmen soll?
Es können gerne auch andere antworten.

delphicoder123 11. Jun 2019 22:23

AW: VCL Formular in ein Panel einbetten
 
Zitat:

Zitat von hoika (Beitrag 1434371)
Hallo,

alt
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form1 := TForm1.Create(Panel1);
neu
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.Create(Panel1);


Ich müsste noch mindestens einen Fehler haben. Zwar wird jetzt, dass Formular angezeigt aber das Form2 ist immer noch nicht im Panel von Form1. Gerne können auch andere antworten, wenn man die Antwort weiß.
Hier nochmal der aktuelle Code.

Code:
unit parent;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, child;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.Create(Panel1);
  with Form2 do
    Parent := Panel1;
    Width := 500;
    Height := 500;
    Top := 10;
    Left := 10;
    Show;
end;

end.
Code:
unit child;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm2 = class(TForm)
    btnCalc: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    procedure btnCalcClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;

implementation

{$R *.dfm}

procedure TForm2.btnCalcClick(Sender: TObject);
begin
edit3.Text:=edit1.Text+edit2.Text;
end;

end.

EWeiss 11. Jun 2019 22:30

AW: VCL Formular in ein Panel einbetten
 
Dann Debug doch mal das ganze.
Eventuell findest du den Fehler dann selbst.

gruss

uligerhardt 11. Jun 2019 22:53

AW: VCL Formular in ein Panel einbetten
 
Zitat:

Zitat von delphicoder123 (Beitrag 1434378)
Zitat:

Zitat von uligerhardt (Beitrag 1434373)
Außerdem: Wenn möglich, nimm Frames statt Forms, wenn du es einbetten willst.

Du meinst, dass ich ein VCL-Frame anstatt eines VCL Formular nehmen soll?

Genau. Das wäre meine erste Wahl, solange nichts Triftiges dagegenspricht.

Heuman 11. Jun 2019 23:04

AW: VCL Formular in ein Panel einbetten
 
Hallo,

falls ich es jetzt richtig verstanden. Dem Konstruktor 'self' übergeben.

procedure Tform1.FormCreate(Sender: TObject);
begin

Form2 := TForm2.Create(self);



with Form2 do
begin
Parent := Panel1;

Width := 500;
Height := 500;
Top := 10;
Left := 10;
Show;
end;
end;

Gruß

Uwe Raabe 11. Jun 2019 23:26

AW: VCL Formular in ein Panel einbetten
 
Zitat:

Zitat von delphicoder123 (Beitrag 1434382)
Hier nochmal der aktuelle Code.
...
Code:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Form2 := TForm2.Create(Panel1);
  with Form2 do
    Parent := Panel1;
    Width := 500;
    Height := 500;
    Top := 10;
    Left := 10;
    Show;
end;



Bei der
Delphi-Quellcode:
with
-Anweisung fehlt das
Delphi-Quellcode:
begin/end
.

hoika 12. Jun 2019 06:20

AW: VCL Formular in ein Panel einbetten
 
Hallo,
eigentlich fehlt das begin end nicht, das with ist zu viel ;)

Genau deshalb sollte man with vermeiden.

Was wäre z.B., wenn es das Show in TForm2 nicht geben würde?
Dann würde das Show von Form1 aufgerufen.
Da beide vom Typ TForm sind, klappt das hier (wenn begin/end da wären),
muss aber nicht.
Dumm wäre es, wenn es z.B. in TForm2 eine Methode Halt geben würde ... ;)

haentschman 12. Jun 2019 08:21

AW: VCL Formular in ein Panel einbetten
 
Zitat:

Genau deshalb sollte man with vermeiden.
+:thumb:

Andreas L. 12. Jun 2019 09:08

AW: VCL Formular in ein Panel einbetten
 
So würde ich den Code formulieren:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, child;

type
  TForm1 = class(TForm)
    Panel1: TPanel;
    procedure FormCreate(Sender: TObject);
  private
    // Feld für das Form anlegen
    FEmbeddedForm: TForm2;
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // Das Form soll Form1 als Owner haben
  // deshalb wird Self angegeben.
  // Dadurch wird das Form automatisch freigegeben
  // wenn das Form1 gechlossen/freigegeben wird...
  FEmbeddedForm := TForm2.Create(Self);

  // Als Parent wird Panel1 verwendet.
  // Parent gibt an auf welchen Control
  // das Form platziert werden soll.
  FEmbeddedForm.Parent := Self.Panel1;

  // Ein paar Eigenschaften des Forms festlegen.
  // Ich würde eher Align verwenden.
  // Deshalb habe ich das auskommentiert...
  //FEmbeddedForm.Width := 500;
  //FEmbeddedForm.Height := 500;
  //FEmbeddedForm.Top := 10;
  //FEmbeddedForm.Left := 10;
  // Mit Align := alClient ist das Form
  // immer genau so groß wie das Panel1...
  FEmbeddedForm.Align := alClient;

  // Zu guter letzt das Form noch sichtbar machen
  FEmbeddedForm.Visible := True;
end;

end.
Wichtig: Form2 muss noch aus der Liste der automatisch zu erstellenden Formulare entfernt werden. Menü > Projekt > Optionen > Formulare > In der Liste links Form2 markieren und auf den ">"-Button klicken. Dann landet Form2 in der rechten Liste!

EWeiss 12. Jun 2019 09:17

AW: VCL Formular in ein Panel einbetten
 
Frage mich was der Aufwand soll pack doch ne MDI Form rein und gut ist.
Warum da selbst was frickeln wenn man das unbedingt haben muss.

gruss

hoika 12. Jun 2019 13:21

AW: VCL Formular in ein Panel einbetten
 
Hallo,
FEmbeddedForm ist nirgendwo definiert.

MDI:
Ich dachte, dass wäre tot?
(Obwohl das hier ja nach Wunsch genau das Richtige wäre.)

p80286 12. Jun 2019 13:31

AW: VCL Formular in ein Panel einbetten
 
Zitat:

Zitat von hoika (Beitrag 1434441)
Hallo,
FEmbeddedForm ist nirgendwo definiert.

MDI:
Ich dachte, dass wäre tot?
(Obwohl das hier ja nach Wunsch genau das Richtige wäre.)

Wenn nicht heute, dann morgen. Frame wäre hier besser.

Gruß
K-H

dataspider 12. Jun 2019 16:26

AW: VCL Formular in ein Panel einbetten
 
Zitat:

Zitat von delphicoder123 (Beitrag 1434378)
Zitat:

Zitat von uligerhardt (Beitrag 1434373)
Außerdem: Wenn möglich, nimm Frames statt Forms, wenn du es einbetten willst.

Du meinst, dass ich ein VCL-Frame anstatt eines VCL Formular nehmen soll?
Es können gerne auch andere antworten.

Ich betrachte pauschale Aussagen wie "Nimm Frames" etwas kritisch.
Beides hat seine Berechtigung und es spielt neben persönlichen Vorlieben auch die Komplexizität des einzubettenden "Frame / Form" eine Rolle.

Ich z.B. bevorzuge Forms.
Das liegt aber daran, dass ich nicht nur ein paar Buttons benutze, sondern z.B. ein ganzes DataForm mit Grid, Edits etc.

Und hier habe ich bei Forms einfach mehr Möglichkeiten der Steuerung / Initialisierung.
Bei Frames fängt man dann irgendwann an, fehlende Events wie OnCreate, OnShow usw. nachzuimplementieren...

Frank

uligerhardt 12. Jun 2019 17:31

AW: VCL Formular in ein Panel einbetten
 
Zitat:

Zitat von dataspider (Beitrag 1434468)
Ich betrachte pauschale Aussagen wie "Nimm Frames" etwas kritisch.
Beides hat seine Berechtigung und es spielt neben persönlichen Vorlieben auch die Komplexizität des einzubettenden "Frame / Form" eine Rolle.

Siehe hier:
Zitat:

Zitat von uligerhardt (Beitrag 1434386)
Genau. Das wäre meine erste Wahl, solange nichts Triftiges dagegenspricht.

Zitat:

Zitat von dataspider (Beitrag 1434468)
Ich z.B. bevorzuge Forms.
Das liegt aber daran, dass ich nicht nur ein paar Buttons benutze, sondern z.B. ein ganzes DataForm mit Grid, Edits etc.

Und hier habe ich bei Forms einfach mehr Möglichkeiten der Steuerung / Initialisierung.
Bei Frames fängt man dann irgendwann an, fehlende Events wie OnEnter, OnShow usw. nachzuimplementieren...

Das hat sich bei mir bisher als Problem erwiesen, aber kann natürlich je nach Umständen sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:44 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