Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Formular ohne VCL (https://www.delphipraxis.net/162995-formular-ohne-vcl.html)

FriendOfDelphi 12. Sep 2011 12:20

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:
MeinFenster := TForm.Create(???);
Aber was muss an die Stelle der Fragezeichen?
Ist der Owner das erste Formular?

Vielen Dank

Medium 12. Sep 2011 12:23

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!

Sir Rufo 12. Sep 2011 12:24

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:
Nil
an, ansonsten halt den Owner (kann ja auch
Delphi-Quellcode:
Application
sein) an, der sich um die Freigabe kümmern soll.

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;

FriendOfDelphi 12. Sep 2011 12:40

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.

Medium 12. Sep 2011 12:45

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.

Neutral General 12. Sep 2011 12:45

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 MSDN-Library durchsuchenCreateWindow oder MSDN-Library durchsuchenCreateWindowEx.

FriendOfDelphi 12. Sep 2011 12:54

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?

stahli 12. Sep 2011 13:33

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.

Union 12. Sep 2011 14:22

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.

FriendOfDelphi 12. Sep 2011 14:25

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:
//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;
  [...]
Habt ihr eine Idee, was ich falsch mache?

Union 12. Sep 2011 14:36

AW: Formular ohne VCL
 
Ja, der Owner und Parent der Scrollbox muss MyForm sein.

Medium 12. Sep 2011 14:47

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.)

FriendOfDelphi 13. Sep 2011 11:36

AW: Formular ohne VCL
 
Das war die Lösung. :-D
Vielen Dank an die Cummunity für die Hilfe und Unterstützung.

CCRDude 13. Sep 2011 13:56

AW: Formular ohne VCL
 
Zitat:

Zitat von Neutral General (Beitrag 1123599)
Non-VCL bedeutet du erstellt alle Fenster, Buttons usw. mit MSDN-Library durchsuchenCreateWindow oder MSDN-Library durchsuchenCreateWindowEx.

Ohne Klugscheißen zu wollen, würde ich das eher als die Ausnahme bezeichnen. Der übliche Non-VCL-Weg wären doch MSDN-Library durchsuchenDialogBox-Aufrufe für entsprechende Dialog-Resourcen?

Sir Rufo 14. Sep 2011 00:35

AW: Formular ohne VCL
 
Zitat:

Zitat von CCRDude (Beitrag 1123998)
Zitat:

Zitat von Neutral General (Beitrag 1123599)
Non-VCL bedeutet du erstellt alle Fenster, Buttons usw. mit MSDN-Library durchsuchenCreateWindow oder MSDN-Library durchsuchenCreateWindowEx.

Ohne Klugscheißen zu wollen, würde ich das eher als die Ausnahme bezeichnen. Der übliche Non-VCL-Weg wären doch MSDN-Library durchsuchenDialogBox-Aufrufe für entsprechende Dialog-Resourcen?

Wer sprach denn hier von Dialogboxen? Es ging doch nur ganz allgemein darum den Unterschied zwischen VCL und nonVCL aufzuzeigen am Beispiel von TForm (dachte ich zumindest)

CCRDude 14. Sep 2011 08:14

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.

Sir Rufo 14. Sep 2011 08:21

AW: Formular ohne VCL
 
Zitat:

Zitat von CCRDude (Beitrag 1124199)
Insofern ist eine "Dialogbox" bzw. ein "Dialog" in nonVCL halt tatsächlich das, was eine "TForm" in VCL ist.

Nein, ein Dialog ist modales Window und ein Window ist das nonVCL Gegenstück zum TForm.

CCRDude 14. Sep 2011 13:39

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:

CreateDialogIndirect function
Creates a modeless dialog box from a dialog box template in memory.
Dort nennt die MSDN ein nicht-modales Fenster "dialog box", auch der Funktionsnamen trägt das "Dialog" in sich.

Du darfst mir natürlich gerne widersprechen, und ich lerne auch gerne noch dazu, aber kannst Du Dein Nein irgendwie ähnlich belegen?

turboPASCAL 14. Sep 2011 22:48

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.

CCRDude 15. Sep 2011 07:38

AW: Formular ohne VCL
 
Natürlich tut es das, steht direkt oben unter meinem MSDN-Library durchsuchenDialogBox-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.

DeddyH 15. Sep 2011 07:51

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