Entwickler-Ecke
Grafische Benutzeroberflächen (VCL & FireMonkey) - Formular "on the fly" (zur Laufzeit) ?????
FrankTheFox - Do 03.04.08 11:05
Titel: Formular "on the fly" (zur Laufzeit) ?????
Hallo,
ich würde gerne ein Formular zur Laufzeit erzeugen. Dieses Formular soll Komponenten wie z.B. Button Label oder... besitzten, diese Events (oder Ereignisse...) Wie gehe am besten vor? Eine Klasse, oder direkt in einem anderen Formular?
Kann mir da jemand weiterhelfen? Am besten mit Beispielen. Ich stehe irgendwie auf dem Schlauch!!!
Gruß
Franky
Moderiert von
Christian S.: Topic aus Sonstiges (Delphi) verschoben am Do 03.04.2008 um 11:06
Tut mir leid, ich dachte im "Sonstiges" wäre ich richtig.. ^^
STS301 - Do 03.04.08 11:19
mit Frames wäre es am besten
oldmax - Do 03.04.08 12:49
Hi
Am Einfachsten ist das Formular ganz normal zu entwerfen und die Funktionalität einzubauen.
Also einfach neues Formular und dann alles rein, was rein muß.
Nun tragst du dieses Formular (und auch weitere) aus dem automatischen Start aus. Das geht unter Menüpunkt Projekte->Optionen->Tabulator Formulare und aus automatisch erzeugt nach verfügbar.
Soll nun dieses Formular aus deinem Programm aufgerufen werden, setzt du in die entsprechende Ereignisroutine folgenden Code
Delphi-Quelltext
1: 2: 3:
| Application.CreateForm(TMyForm,MyForm); MyForm.Visible:=False; MyForm.ShowModal; |
ShowModal verhindert auch, das versucht wird, ein weiteres Mal ein Formular zu erzeugen. Da es bereits existiert, wird ein Laufzeitfehler ausgelöst. Natürlich kann man dem Formular einen Index verpassen, wenn dieses Formular mehrmals benötigt wird.
Ich hoffe, es hat gehelft.....
Gruß oldmax
FrankTheFox - Do 03.04.08 22:00
Hi,
ja aber müßte ich dann nicht für alle mögliche Komponenten des Forms (TButton,...) diese in der Klasse definieren.
obwohl ich vielleicht nur ein Label, oder ein Edit und einen Button drauf haben will.
@STS301 Ok, wie setze ich das dann um. Ich habe in Delphi bislang nur wenig gemacht. Ich will eine ini ähnliche Datei nutzen, in der dann die Komponenten des Formulars definiert sind (TLabel : Width, Height,... TButton:...).
und daraus das Formular erzeugen....
eine Unit...
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| Type TAForm = class(TForm) public Constructor Create(aOwner: TComponent); override; Destructor Destroy; override; end;
implementation
Constructor TAForm. Create; begin inherited CreateNew(aOwner); end;
Destructor TAForm. Destroy; begin inherited Destroy; end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TForm1.bCreateNewFormClick(Sender: TObject); var TAF : TAForm; MyLabel : TLabel; begin
TAF := TAForm.Create(self); MyLabel := TLabel.Create(TAF); MyLabel.Left := 0; MyLabel.Top := 0; MyLabel.Width := TAF.Width; MyLabel.Height:= 100; MyLabel.Caption := 'Hallo!!!'; MyLabel.Parent := TAF; MyLabel.Show; TAF.ShowModal; TAF.Free;
end; |
ich kann so einen Label erzeugen und so auf die Form setzten,
aber ich frage mich ob ich die Unit wirklich brauche und ob es nicht besser geht...
Gruß
Franky
oldmax - Fr 04.04.08 06:28
Hi
Wenn du noch nicht viel mit Delphi zu tun hattest, trotzdem aber an die Formularerzeugung und Objekterstellung zur Laufzeit herangehen willst, nehme ich an, das du Erfahrungen mit anderen Programmiersprachen hast. Natürlich kannst du zur Laufzeit auch alle möglichen Objekte erzeugen und auf der Form erstellen. Dies aber hier zu beschreiben sprengt den Rahmen eines Postings. Es ist ja nicht damit getan, nur Objekte irgendwo zu plazieren, sie sollen ja auch auf Ereignisse reagieren. Ich sag nicht, das es nicht geht, doch es ist schon ein beachtlicher Programmaufwand. Also Fleißarbeit. Es ist dann halt nicht mehr ein Create, sondern entsprechend viele mit der zugehörigen Parametrierung. Aber da sag ich nix neues. Selbst wenn du nur sowas ähnliches wie einen MessageDlg erzeugen willst, würd ich entsprechend meinem Posting vorgehen
Es ist relativ einfach und schnell erzeugt. Übergabeparameter lassen sich bspw. über eine global verfügbare Unit einrichten.
Gruß oldmax
FrankTheFox - Fr 04.04.08 09:52
Hi,
ja ich arbeite mit anderen Programmiersprachen. Mein Problem ist es soll nicht nur ein Formular erzeugt werden sondern auch auf Ereignisse reagiert werden. Ein "TFrame" nimmt dann TButton oder TMemo, ... auf und ich habe die Möglichkeit das dann an auf ein TForm zu legen. Ok, das kann ich dann aber auch gleich mit dem TForm machen. Ich weiß nur nicht ob ich dann in
Delphi-Quelltext
1: 2: 3: 4: 5:
| type TForm1 = class(TForm) bCreateNewForm: TButton; procedure bCreateNewFormClick(Sender: TObject); ... |
das oben beschriebene (hier als Beispiel für einen Button) dann für alle
möglichen Elemente des Forms machen muß.
Genutzt werden sie dann ja, wenn die ensprechenden Einträge in der Datei, die ich auslese, enthalten sind. Weil ich nicht weiß, wie ich das dann mit den Ereignissen und den Elementen machen soll. Denn so wie oben müßte ich dann ja alle Elemente, die ich nutzen will schon auf das Formular legen (erstmal unsichtbar) und dann bei Bedarf aktivieren.
Also wirklich klar ist mir das ganze nicht!
Gruß
Franky
oldmax - Fr 04.04.08 12:06
Hi
Also, wenn du weißt, welche Ereignisse dubrauchst, kannst du folgendermaßen vorgehen.
Erzeuge eine Form nach meinem 1. Vorschlag.Dann setzt du ein Button temporär hinein und erzeugst z. B. die ereignisroutinen , die du brauchst, hier z. B. onClick.
Nun schreibst du dir eine Procedure zur Erzeugung eines Buttons zur Laufzeit. Du weißt schon,
Delphi-Quelltext
1:
| MyButton:=TButton.Create(Self); |
darunter nun die ganzen Eigenschaften und ! die Zuweisung der OnClick-Methode des temporären Buttons.
Nun nimmst du die Möglichkeiten der verschiedenen Buttons und vezweigst in der Ereignisprocedure auf entsprechende Proceduren für die unterschiedlichen Aktionen der Buttons.
Also
MyButton.Name:='EinButton_'+IntToStr(Index); // Namen mit Index vergeben
MyButton.OnClick:=TempButtonClick; // Ereignisprocedure zuweisen
MyButton.Parent:=MyForm; // Parent nicht vergessen, kann auch Panel sein
In der Ereignisprocedur
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| Procedure MyForm.TempButtonClick(Sender:TObject); Var ProcNr : Integer; xPos : Integer; TempStr : String; Begin If Sender is TButton then Begin TempStr :=(Sender As TButton).Name; xPos:=Pos('_',TempStr); ProcNr:=StrToInt(Copy(TempStr,xpos+1,Length(TempStr)-xPos)); Case ProcNr of 1 : Mach_dies; 2 : Mach_das; ...... xx: oder_nix; end; End; |
Das sollte mal für den Anfang reichen. Jetzt kannst du das temporäre Button auch löschen.
genauso gehst du mit den Ereignisroutinen der anderen Elemente vor. Es geht zwar auch ohne die temporären Objekte und auch noch viel komplizierter und umfangreicher, aber ich denke, dieser Weg ist nachvollziehbar und dann kannst du immer noch eigene Wege gehen
Gruß oldmax
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!