![]() |
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. ![]() 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. |
AW: VCL Formular in ein Panel einbetten
Hallo,
Delphi-Quellcode:
Ich dachte, du wolltest Form2 erstellen.
procedure TForm1.FormCreate(Sender: TObject);
begin Form1 := TForm1.Create(Panel1); |
AW: VCL Formular in ein Panel einbetten
Zitat:
Was ist jetzt genau mein Fehler? |
AW: VCL Formular in ein Panel einbetten
Hallo,
alt
Delphi-Quellcode:
neu
procedure TForm1.FormCreate(Sender: TObject);
begin Form1 := TForm1.Create(Panel1);
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin Form2 := TForm2.Create(Panel1); |
AW: VCL Formular in ein Panel einbetten
Außerdem: Wenn möglich, nimm Frames statt Forms, wenn du es einbetten willst.
|
AW: VCL Formular in ein Panel einbetten
Warum willst du ein Auto in den Kofferraum eines anderen Autos packen? :roll:
|
AW: VCL Formular in ein Panel einbetten
Zitat:
Zitat:
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 |
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.
|
AW: VCL Formular in ein Panel einbetten
Zitat:
Abgesehen davon das es noch erwünscht ist.. macht man ja heute nicht mehr. Zitat:
gruss |
AW: VCL Formular in ein Panel einbetten
Zitat:
Es können gerne auch andere antworten. |
AW: VCL Formular in ein Panel einbetten
Zitat:
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. |
AW: VCL Formular in ein Panel einbetten
Dann Debug doch mal das ganze.
Eventuell findest du den Fehler dann selbst. gruss |
AW: VCL Formular in ein Panel einbetten
Zitat:
|
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ß |
AW: VCL Formular in ein Panel einbetten
Zitat:
Bei der
Delphi-Quellcode:
-Anweisung fehlt das
with
Delphi-Quellcode:
.
begin/end
|
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 ... ;) |
AW: VCL Formular in ein Panel einbetten
Zitat:
|
AW: VCL Formular in ein Panel einbetten
So würde ich den Code formulieren:
Delphi-Quellcode:
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!
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. |
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 |
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.) |
AW: VCL Formular in ein Panel einbetten
Zitat:
Gruß K-H |
AW: VCL Formular in ein Panel einbetten
Zitat:
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 |
AW: VCL Formular in ein Panel einbetten
Zitat:
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 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