Delphi-Version: 5
Formular ohne VCL
Hallo Allerseits,
wie kann ich in einem Delphi-Programm ein 2. Fenster ohne die VCL erstellen? Das Formular erstelle ich mit:
Delphi-Quellcode:
Aber was muss an die Stelle der Fragezeichen?
MeinFenster := TForm.Create(???);
Ist der Owner das erste Formular? Vielen Dank |
AW: Formular ohne VCL
TForm ist Teil der VCL. Zu non-VCL gibt es hier in der DP eine Menge Lesestoff, insbesondere Artikel von Luckie!
|
AW: Formular ohne VCL
Wo machst du denn da was ohne VCL?
AnyWay ... als Parameter wird da der Owner erwartet. Der Owner kümmert sich darum, dass die erzeugte Instanz wieder aus dem Speicher fliegt. Wenn du dich darum selber kümmerst, dann gib als Parameter einfach
Delphi-Quellcode:
an, ansonsten halt den Owner (kann ja auch
Nil
Delphi-Quellcode:
sein) an, der sich um die Freigabe kümmern soll.
Application
Delphi-Quellcode:
var
MyForm : TForm; begin // Selber kümmern MyForm := TForm.Create( nil ); try MyForm.ShowModal; finally MyForm.Free; end; // oder // Application kümmert sich drum MyForm := TForm.Create( Application ); MyForm.Show; end; |
AW: Formular ohne VCL
Ich habe ein Fenster ganz normal mit der VCL erstellt. Das Hauptfenster. Will ich auch erst einmal so lassen.
Innerhalb des Create des Hauptfensters möchte ich ein 2. Fenster selbst erstellen, dass ich bei Bedarf ein- oder ausschalte und in dem ich zur Laufzeit erzeugte Komponenten anzeigen möchte. Eigentlich läuft das auch schon alles, solange ich die zur Laufzeit erzeugten Komponenten im Hauptfenster (1. Fenster) anzeige. Dort übergebe ich AOwner und Parent vom Hauptfenster. Nun möchte ich das Ganze so ändern, dass die zur Laufzeit erzeugten Komponenten alle in einem zusätzlichen, eigenen Fenster dargestellt werden, dass sich auf Knopfdruck öffnet. Der Knopfdruck ist nicht so wichtig. Könnte auch gleich da sein. |
AW: Formular ohne VCL
Dafür würde es doch reichen, einfach ein zweites, leeres Fenster zu erstellen, und dies den dynamischen Komponenten als Parent zu geben. Dann bei Bedarf via Show() einblenden.
Du willst übrigens sehr wohl mit der VCL arbeiten: Die VCL ist die Standard-Klassenbibliothek in Delphi, zu der u.a. auch TForm gehört. Was du meinst, ist der Form-Designer. Dieser ist zwar nicht ohne die VCL nutzbar, die VCL ohne den Designer aber sehr wohl - und das würdest du im Wesentlichen dann tun. |
AW: Formular ohne VCL
PS: VCL ist nicht der Editor mit dem du dein Formular und deine Oberfläche zusammenklickst.
VCL ist die Bezeichnung einer Bibliothek aller visuellen Komponenten/Controls die Delphi dir zur Verfügung stellt. Non-VCL bedeutet du erstellt alle Fenster, Buttons usw. mit CreateWindow oder CreateWindowEx. |
AW: Formular ohne VCL
Ja, dass stimmt.
Ist es denn sehr viel schwieriger, wenn man das 2. Fenster auch zur Laufzeit erstellen will? Ich dachte, dass das vielleicht nur ein kleine Erweiterung des bisherigen was ich habe darstellt (mit den Komponenten habe ich das ganz gut hinbekommen). Also komme ich um ein vorher mit dem Form-Designer erstelltes leeres Fenster nicht drumherum? |
AW: Formular ohne VCL
Irgendwie denkst Du zu kompiziert.
Sir Rufo hat in #3 geschrieben, wie Du es lösen kannst. Einfach zur Laufzeit eine Formularinstanz erzeugen und einer Variablen zuweisen. Dann kannst Du darauf Deine Controls seztzen und das Formular anzeigen. Alternativ kannst Du das Formular auch schon zur Designzeit definieren. Dann kannst Du automatisch damit arbeiten. Im Ergebnis kommt das nahezug auf das gleiche raus. Mein Tipp: Dynamisch würde ich Formulare eigentlich nur erzeugen, wenn ich nicht weiß, wie viele solcher Formulare ich dann zur Laufzeit brauche oder wenn ich jedes Byte unnötigen Speicherplatz vermeiden will. |
AW: Formular ohne VCL
Vielleicht will er nur nicht dass das Formular automatisch von Delphi erzeugt wird, sondern dies (z.b. wg. Ressourcen) selber tun will. Also unter Projektoptionen aus der "automatisch erzeugen" Liste entfernen und dann wenn benötig mit Create erzeugen und mit Show anzeigen.
|
AW: Formular ohne VCL
Ich habe es so ausprobiert, wie es "Sir Rufo" beschrieben hat.
Das Problem ist nur, dass zwar ein zweites Fenster angezeigt wird, aber die Komponenten, die ich darin erzeuge nicht. Das Fenster ist leer. Die Komponentenerstellung zur Laufzeit funktionierte ja vorher für das 1., bzw. Hauptfenster. Wahrscheinlich mache ich etwas mit dem Owner falsch. Der Compiler meckert aber nichts an. Könnt ihr nochmal schauen:
Delphi-Quellcode:
Habt ihr eine Idee, was ich falsch mache?
//Formular mache ich wie von "Sir Rufo" beschrieben.
MyForm := TForm.Create( Application ); //Dann erstelle ich die Komponenten: MyScrollBox[0]:=TScrollBox.Create(MyForm.Owner); MyScrollBox[0].Parent:=MyForm.Parent; [...] MyGroupBox:=TGroupBox.Create(MyForm.Owner); MyGroupBox.Parent:=MyScrollBox[0]; [...] MyLabel[FiIndexLabel]:=TLabel.Create(MyForm.Owner); MyEdit[FiIndexEdit]:=TEdit.Create(MyForm.Owner); [...] MyLabel[FiIndexLabel].parent := MyGroupBox; MyEdit[FiIndexEdit].parent := MyGroupBox; [...] |
AW: Formular ohne VCL
Ja, der Owner und Parent der Scrollbox muss MyForm sein.
|
AW: Formular ohne VCL
Wobei der Owner es nicht sein muss, aber es macht Sinn :) (Im Normalfall zumindest, so generell kann ich das nicht stehen lassen.)
|
AW: Formular ohne VCL
Das war die Lösung. :-D
Vielen Dank an die Cummunity für die Hilfe und Unterstützung. |
AW: Formular ohne VCL
Zitat:
|
AW: Formular ohne VCL
Zitat:
|
AW: Formular ohne VCL
Ich denke das ist eine Frage der Begrifflichkeit. Der Delphi-Programmierer denkt bei "Dialogbox" vermutlich zuerst an "Wollen Sie die Datei löschen? [Ja] [Nein]"-Fenster. In der Windows API aber nennt sich "Dialog", was sich unter Delphi "Form" nennt - beides sind, um ein anderes Wort zu verwenden, Fenster :)
Insofern ist eine "Dialogbox" bzw. ein "Dialog" in nonVCL halt tatsächlich das, was eine "TForm" in VCL ist. |
AW: Formular ohne VCL
Zitat:
|
AW: Formular ohne VCL
Hmmm... aber TForm kann doch sowohl modal als auch nicht modal sein, abhängig davon, wie es aufgerufen wird, insofern macht das Argument "modal" doch wenig Sinn?
Dazu kommt, daß TForm sicherlich hauptsächlich modal eingesetzt wird - jede Anwendung fängt mit ihrem Hauptfenster mit einem modalen Fenster (TForm!) an, erst danach können nichtmodale Fenster ins Spiel kommen. Genauso kann zugegeben TForm sowohl zur Designzeit als auch zur Laufzeit erstellt werden; aber wenn man auf die Ebene der VCL geht, wird es wohl immer zur Laufzeit erstellt. Sogesehen ist der Vergleich mit CreateWindow wohl passend. Nur wenn man die Anwendungsebene (die Anwendung durch den Entwickler ist hier gemeint) vergleicht, verwendet man halt üblicherweise zur Designzeit entwickelte Fenster, und die entsprechen eben RT_DIALOG-Resourcen, und nicht CreateWindow-Aufrufen. Um Dir aber mal mit Dokumentation im Rücken zu widersprechen: Zitat:
Du darfst mir natürlich gerne widersprechen, und ich lerne auch gerne noch dazu, aber kannst Du Dein Nein irgendwie ähnlich belegen? |
AW: Formular ohne VCL
Liste der Anhänge anzeigen (Anzahl: 1)
Och Kinders,
auch ein RT_DIALOG-Resourcen ruft intern, also in der API CreateWindow... auf. Ein Dialog ist auch nur ein Fenster und ein Fenster kann auch ein Dialog sein. :stupid: Ob nun VCL oder nonVCL das ist alles Einstellungssache. |
AW: Formular ohne VCL
Natürlich tut es das, steht direkt oben unter meinem DialogBox-Link drin :)
Weil mich Sir Rufo nochmal arrogant süffisant lächend per PM angegangen ist, möchte ich hier nochmal klarstellen, und entschuldige mich gleichzeitig für das Herumreiten darauf: 1. Im Rahmen der Windows-API (auf die ich mich beziehe) ist ein Window ein Fenster, und ein Dialog ein aus einer Resource erstelltes Fenster. Dort ist die Unterscheidung quasi bei dynamisches vs. statischen Fenstern (statisch insofern, als das Aussehen schon festgelegt ist und nicht per Code erzeugt wird). 2. Auf Benutzer-/Entwickler-Ebene (auf der Sir Rufo argumentiert) wird der Begriff Dialog üblicherweise für modale Fenster verwendet. Dort ist die Unterscheidung zwischen modalen vs. nicht-modalen Fenstern. Ich dachte, das hätte ich in Post #16 klar gemacht, aber offensichtlich nicht klar genug. Und wenn ich geschrieben habe, daß ein "Dialog" in nonVCL das ist, was eine TForm in VCL ist, ist das natürlich eigentlich schlecht geschrieben, weil ich die Bezeichnungen für nonVCL auf Ebene 1 und VCL auf Ebene 2 wähle, und das in einem Satz. Um es auf Resourcenebene zu vergleichen: die TForm, die in VCL eine Resource vom Typ RT_RCDATA ist und vom VCL-DFM-Loader erstellt wird, ist in nonVCL eine Resource vom Typ RT_DIALOG und wird von den *Dialog*-Funktionen erstellt (die - intern - etwa CreateWindowEx aufrufen). Arbeitet man ohne Resourcen, bleibt man in VCL bei der Form, wechselt in nonVCL aber tatsächlich auf CreateWindowEx. |
AW: Formular ohne VCL
Und damit sind nun hoffentlich alle Haare gespalten und alle Erbsen gezählt :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:25 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