![]() |
Eine Form mehrmals aufrufen
Hallo,
irgendwie steck ich grad fest: Ich hab eine Form erzeugt, die auf Knopfdruck erstellt wird:
Delphi-Quellcode:
dann im hauptfenster meines Projekts will ich diese Form mehrmals aufrufen, wie kann man das machen:
Form1:
unit unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; ... Eine Instanz erstelle ich so:
Delphi-Quellcode:
Wie könnt ich das machen?
Form1:= TForm.Create(nil);
Form1.Left:= pos.X; Form1.Top:= pos.Y; Form1.ShowModal; Form1.Free; |
Re: Eine Form mehrmals aufrufen
Mit
Delphi-Quellcode:
solltes du die Form mehrmals createn können.
Application.CreateForm(TForm1,Form1);
Form1.Show; |
Re: Eine Form mehrmals aufrufen
Delphi-Quellcode:
Dann ist jedesmal aForm eine Intstanz.
var
i : Integer; aForm : TForm; begin for i:=0 to 3 do begin aForm := TForm1.Create(self); aForm.ShowModal; end; ... Das geht :stupid: |
Re: Eine Form mehrmals aufrufen
Dann erstellst du halt noch eine Instanz... Das darf natürlich nicht über die gleiche Instanzvariable Form1 gehen.... Form1 ist eh ein blöder Name.
Wenn jede Form für sich arbeitet, brauchst du dir überhaupt keinen Namen merken, dann geht das auch so:
Delphi-Quellcode:
wichtig ist, dass du die Form über Show aufrufst, da du sonst erst eine 2. Instanz erstellen kannst, nachdem du die erste Form geschlossen hast.
with TForm.Create(nil) do begin
Left:= pos.X; Top:= pos.Y; Show; // kein Showmodal Free; end ; Wenn du von aussen eine liste aller gezeigten Forms benötigst, dann musst du die halt in einem array oder ObjectList verwalten. Dabei bietet sich Objectlist in diesem Fall wirklich an, weil die Instanz aus der Liste entfernt wird, sobald dein Form zerstört wird. |
Re: Eine Form mehrmals aufrufen
Zitat:
|
Re: Eine Form mehrmals aufrufen
Zitat:
|
Re: Eine Form mehrmals aufrufen
... oder es wird statt Free von aussen
![]() |
Re: Eine Form mehrmals aufrufen
Zitat:
Dein Vorschlag hingegen funktioniert natürlich.. |
Re: Eine Form mehrmals aufrufen
Danke für die schnellen Hilfen.
Also ich lasse die Forms jetzt folgendermaßen erstellen:
Delphi-Quellcode:
Form1 sieht dann so aus, die nächsten Fenster sollen sich alle neben das erste Reihen und wenn sich das erste bewegt sollen alle mitziehen:
var
formen : array [1..5] of TForm1; AnzForm : integer; procedure THauptForm.StartBtnClick(Sender: TObject); begin AnzForm:= AnzForm+1; formen[AnzForm]:= TForm1.Create(nil); formen[AnzForm].Left:= pos.X; formen[AnzForm].Top:= pos.Y; formen[AnzForm].Tag:= AnzForm; formen[AnzForm].Show; end;
Delphi-Quellcode:
das zugreifen auf "Tag" funktioniert hier so nicht, hat da jemand eine Lösung
...
private procedure WMMove(var Message: TWMMove); MESSAGE WM_MOVE; procedure AlignForm; .... procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin AnzForm:= AnzForm-1; end; procedure TForm1.WMMove(var Message: TWMMove); begin inherited; try // hier hängt er dann if Assigned(formen[Form1.Tag]) then begin AlignForm; end; except end; end; procedure TForm1.AlignForm; begin formen[Form1.Tag].Left := formen[formen[Form1.Tag]-1].Left + formen[formen[Form1.Tag]-1].Width; formen[Form1.Tag].Top := formen[formen[Form1.Tag]-1].Top; end; |
Re: Eine Form mehrmals aufrufen
Besser
Delphi-Quellcode:
Warum form1? das ist eine bestimmte Referenz, welche in deinem Fall höchstwahrscheinlich Nil ist.
formen[AnzForm]:= TUmbauten.Create(self);
Besser Self.Tag bzw. Tag |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz