Formular dynamisch erzeugen --> Application.createForm

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Formular dynamisch erzeugen --> Application.createForm

Beitrag von mintpc »

Hallo zusammen,

ich möchte per ButtonClick ein Formular erzeugen, auf dem verschiedene
visuelle Komponenten dynamisch erzeugt werden. Die Komponenten sind von
TLabel abgeleitet, z.B. TFigur = class(TLabel). Das Programm funktioniert so auch perfekt.

Nun soll das Formular von einem Button aus angezeigt werden. Dabei habe ich zwei Versionen gefunden:

Version 1 (Formular bei Projekteinstellungen hinzugefügt):

Code: Alles auswählen

var form : TForm1;
begin
  form := TForm1.Create(Self);
  try
    form.ShowModal;
  finally
    form.Free;
  end; 
Bei dieser Version wird das Formular geöffnet, allerdings werden die visuellen Komponenten nicht
angezeigt
, bzw. deren Objekt nicht erzeugt.

Version 2 (Formular bei Projekteinstellungen nicht hinzugefügt):

Code: Alles auswählen

 
Application.CreateForm(TForm1, Form1);
Form1.Visible:=true;  
Diese Version funktioniert einwandfrei, allerdings ist das Formular nicht modal.

Nun meine Fragen:
a) Warum klappt die Komponentenanzeige bei Version 1 nicht? Gibt es da einen Grund?
b) Wie mache ich das Formular bei Vers. 2 modal?

Vielen Dank schonmal für eine Antwort und
beste Grüße

mintpc

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: Formular dynamisch erzeugen --> Application.createForm

Beitrag von mintpc »

Oh, mea culpa.

Die Antwort zu (b) hab ich grad selbst gefunden.

Einfach statt form1.visible := true

Form1.showmodal

benutzen.

sorry, sorry, sorry

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Formular dynamisch erzeugen --> Application.createForm

Beitrag von Michl »

Für nachfolgende Leser, die wissen wollen, wie man ein Formular dynamisch erzeugt (gem. Überschrift): http://wiki.freepascal.org/Form_Tutoria ... h_erzeugen

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: Formular dynamisch erzeugen --> Application.createForm

Beitrag von mintpc »

Danke erstmal für den link.

Meine Frage (Problem) war aber eigentlich die (das), warum die beim Erzeugen des
Formulars nach dieser Anleitung (meiner Version 1) die visuellen Objekte,
die in der Form.Create erzeugt werden, eben NICHT erzeugt und angezeigt werden...

... auch nicht per ButtonClick, was beim normalen Start funktioniert.

Ist doch seltsam, oder?

Beste Grüße
mintpc

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Formular dynamisch erzeugen --> Application.createForm

Beitrag von Michl »

Das hatte ich überlesen, dass Du noch eine offene Frage hattest. Keine Ahnung, was da schief läuft?! Bei mir funktioniert das (leeres Formular, mit einem Button):

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var form : TForm1;
begin
  form := TForm1.Create(Nil);
  try
    form.Caption:=Caption + 'I';
    form.ShowModal;
  finally
    form.Free;    //Mit Create(Self) wäre Self (das aufrufende Control) für das "Free" zuständig
  end;
end; 
Ich habe getestet mit Win7 64bit, Lazarus 1.2.2 32bit r44758 FPC 2.6.4 i386-win32-win32/win64. Welches System nutzt Du denn?!
Dateianhänge
Test.jpg

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

mintpc
Beiträge: 124
Registriert: Mo 6. Sep 2010, 18:39
OS, Lazarus, FPC: Win 7 (L 1.6 FPC 3.0.0)
CPU-Target: Win 7
Wohnort: Mailand

Re: Formular dynamisch erzeugen --> Application.createForm

Beitrag von mintpc »

Hi, danke erstmal für die Antwort.

So tatsächlich ist das nicht mein Problem, da ich ja nicht nur Komponenten einfach
so auf dem Formular platziere, sondern dynamisch erzeuge und dann auf dem
Formular anzeigen lasse, und das eben klappt nicht.

Na ja, ich wurschtel mich nochmal durch und wenn ich's raus hab, was es
war, berichte ich.

Gruß
mintpc

Michl
Beiträge: 2511
Registriert: Di 19. Jun 2012, 12:54

Re: Formular dynamisch erzeugen --> Application.createForm

Beitrag von Michl »

Hast Du Dir das Bsp. http://wiki.freepascal.org/Form_Tutoria ... _erstellen mal angesehen, es sollte doch so ziemlich dem entsprechen, was Du vorhast?!

Ein mögliches Problem, wenn eine Komponente nicht angezeigt wird, könnte sein, dass Du vergessen hast die Eigenschaft Parent zu setzen.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection;  

Antworten