Autor Beitrag
FrankTheFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Do 03.04.08 11:05 
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 user profile iconChristian 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
Hält's aus hier
Beiträge: 9


Delphi 2007 WIN 32 und Lazarus 0.9.25
BeitragVerfasst: Do 03.04.08 11:19 
mit Frames wäre es am besten
oldmax
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
2:
3:
Application.CreateForm(TMyForm,MyForm); // generiert das Formular
MyForm.Visible:=False; // bereitet das Umschalten für ShowModal vor
MyForm.ShowModal; // Läßt Die Bearbeitung nur in diesem FOrmular zu

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

_________________
Zier dich nich so, ich krieg dich schon....
FrankTheFox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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...
ausblenden 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;




ausblenden 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;
  //f := TForm.Create(Form1);
  //f.Visible := True;


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: 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

_________________
Zier dich nich so, ich krieg dich schon....
FrankTheFox Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 380


D3 Prof, D4 Prof
BeitragVerfasst: 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,
ausblenden 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
ausblenden 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; // Name mit Aufrufindex holen
   xPos:=Pos('_',TempStr);               // Trennzeichen suchen
   ProcNr:=StrToInt(Copy(TempStr,xpos+1,Length(TempStr)-xPos)); // Aufrufindex 
   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

_________________
Zier dich nich so, ich krieg dich schon....