Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Wie speche ich OnResize bzw. OnClick einer dynamisch erstellten Form an ? (https://www.delphipraxis.net/157409-wie-speche-ich-onresize-bzw-onclick-einer-dynamisch-erstellten-form.html)

Linkat 11. Jan 2011 10:29

Delphi-Version: 2009

Wie speche ich OnResize bzw. OnClick einer dynamisch erstellten Form an ?
 
Hallo,

mit
Delphi-Quellcode:
procedure erzeugeForm2;
begin
  Form2:=TForm.create(Form1);
  Form2.Top:=screen.Width div 2;
  Form2.Left:=Screen.Height div 2;
  Form2.Width:=500;
  Form2.Height:=400;

  Button:=TButton.create(Form2);
  Button.parent:=Form2;
  Button.Top:=Form2.Height-30;
  Button.Left:=10;
  Button.Anchors:=[akLeft,akBottom];
  Button.Width:=90;
  Button.caption:='&Zwischenablage';
   .
   .
   .
end;
erzeuge ich Form2 und Button.

Wie kann ich jetzt das Form2-ReSize-Ereignis bzw. das Button-OnClick-Ereignis des Buttons ansprechen?

Vielen Dank!

Gruß, Linkat

alfold 11. Jan 2011 10:35

AW: Wie speche ich OnResize bzw. OnClick einer dynamisch erstellten Form an ?
 
In dem Du die Routine zuweist.
Delphi-Quellcode:
Button .onClick:= 'deine clickroutine oder schon eine vorhandene';
From2.onResize:= 'deine routine oder schon eine vorhandene';
Gruss alfold

Bernhard Geyer 11. Jan 2011 10:37

AW: Wie speche ich OnResize bzw. OnClick einer dynamisch erstellten Form an ?
 
In einer einfachen Prozedur/Funktion: gar nicht!
Du brauchst schon eine Klasse bei der du mittels
Delphi-Quellcode:
type MyClass
  procedure MeineKlassenMethodeMitPassenderSignatur(Sender: TObject);

...
Button.OnClick = MeineKlassenMethodeMitPassenderSignatur;
...

Linkat 12. Jan 2011 13:23

AW: Wie speche ich OnResize bzw. OnClick einer dynamisch erstellten Form an ?
 
Hallo,

Vielen Dank alfold und Bernhard.

Habe jetzt mal ein Beispielprogramm, in dem ich eine dynam. Form mit Button und BitBtn erzeuge, erstellt (ich habe versucht eure Hinweise einzuarbeiten, aber leider habe ich kaum Ahnung mit der OOP).

Mit dem BtErzeugeform erzeuge ich die Form mit den beiden Buttons.
Durch Klicken auf den "Start Farbe"-Button, soll sich die Farbe von Form2 ändern, und der Integer-Wert der Farbe wird in der Leiste angezeigt.
Im Quelltext habe ich die 3 Tests mit den entsprechenden Fehlermeldungen angegeben.

Delphi-Quellcode:
unit DynFormU;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons;

type
  TForm2 = class(TForm)
    BitBtn1: TBitBtn;
    btErzeugeForm: TButton;
    procedure btErzeugeFormClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm;

implementation

{$R *.dfm}

type
  TMyClass=class(TForm)
    procedure SetzeColor(Sender:TObject);
  end;

var
  Form    :TForm;
  Button  :TButton;
  BitBtn  :TBitBtn;

procedure SetzeColor;
begin
  Form2.Color:=Form2.Color+1000;
  Form.Caption:=IntToStr(Form2.Color);
end;


procedure TForm2.btErzeugeFormClick(Sender: TObject);
begin
  Form:=TForm.Create(Form2);
  Form.Top:=100;
  Form.Left:=100;
  Form.Width:=400;
  Form.Height:=300;
  Form.Visible:=true;
  Form.Caption:='Dyn. Form';


  Button:=TButton.create(Form);
  Button.parent:=Form;
  Button.Top:=Form.Height-70;
  Button.Left:=10;
  Button.Anchors:=[akLeft,akBottom];
  Button.Width:=90;
  Button.Height:=25;
  Button.caption:='S&tart Farbe';
  Button.Visible:=true;
    {Test1}
//  Button.OnClick:=SetzeColor(Sender:TObject);
    {Fehlermeldung: zu viele Parameter}

    {Test2}
//  Button.OnClick:=SetzeColor;
    {Fehlermeldung: Inkompatible Typen Methodenzeiger und reguläre Prozedur}

    {Test3}
//  Button.OnClick:=SetzeColor(Sender);
    {Fehlermeldung: zu viele Parameter}

  BitBtn:=TBitBtn.Create(Form);
  BitBtn.parent:=Form;
  BitBtn.Top:=Form.Height-70;
  BitBtn.Left:=Form.Width-100;
  BitBtn.Anchors:=[akRight,akBottom];
  BitBtn.Kind:=bkClose;
  BitBtn.Caption:='&Schließen';
  BitBtn.Visible:=true;
end;

end.
Wie weise ich dem OnClick-Ereignis die procedure SetzeColor zu?
Was mache ich falsch? Wer hat einen Tipp?

Gruß, Linkat

Bummi 12. Jan 2011 13:34

AW: Wie speche ich OnResize bzw. OnClick einer dynamisch erstellten Form an ?
 
Delphi-Quellcode:
type
  TForm2 = class(TForm)
    BitBtn1: TBitBtn;
    btErzeugeForm: TButton;
    procedure btErzeugeFormClick(Sender: TObject);
    procedure SetzeColor(Sender:TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;


// snipp...


procedure TForm2.SetzeColor(Sender:TObject);
begin
//.....
end;

procedure TForm2.btErzeugeFormClick(Sender: TObject);
begin
//....SNIPP
 Button.OnClick:=SetzeColor;
//.....SNIPP
end;

end.

Linkat 12. Jan 2011 14:21

AW: Wie speche ich OnResize bzw. OnClick einer dynamisch erstellten Form an ?
 
Hallo Thomas,
vielen Dank für die schnelle und richtige Antwort. Es funktioniert tatsächlich.

Leider war mein Beispiel nicht ganz richtig. Auch ist die Bezeichnung meiner Forms unglücklich (#1 dyn. Form ist Form2, #4 dyn. Form ist Form).

Ich muss das OnClick-Ereignis ja auf meine dynamische Form Form und nicht auf die statische Form Form2 anwenden.

Wo muss ich die procdure SetzeColor deklarieren, damit sie auf die dyn. Form wirkt?

Gruß, Linkat

DeddyH 12. Jan 2011 14:48

AW: Wie speche ich OnResize bzw. OnClick einer dynamisch erstellten Form an ?
 
Wie wäre es denn mit
Delphi-Quellcode:
Form.OnClick := SetzeColor;

Linkat 12. Jan 2011 15:09

AW: Wie speche ich OnResize bzw. OnClick einer dynamisch erstellten Form an ?
 
Ich möchte ja, dass das Ereignis bei Klicken auf den dyn. erzeugten Button wirkt. Irgendwie muß ja im Deklarationsteil die procedure für das Object Form bekanntgegeben werden.

Wahrscheinlich hat Bernhard (siehe #3) mit seinem Vorschlag:

Zitat:

type MyClass
procedure MeineKlassenMethodeMitPassenderSignatur(Sender: TObject);

...
Button.OnClick = MeineKlassenMethodeMitPassenderSignatur;
...
nicht ganz unrecht, aber ich weiß nicht wie ich das umsetzen soll.

Gruß, Linkat

Bummi 12. Jan 2011 15:53

AW: Wie speche ich OnResize bzw. OnClick einer dynamisch erstellten Form an ?
 
Du kannst alles auf einer Routine in Deinem Mainform umbiegen und dort den Sender, bzw den Owner des Senders ermitteln, ungeprüft und ohne Sicherheitsabfragen nur ein Beispiel....
Delphi-Quellcode:
Procedure Mainform.SetColor(Sender:TObject);
begin
  TForm(TComponent(Sender).Parent).Color := TComponent(Sender).Tag;
     
end;

Linkat 17. Jan 2011 12:33

[gelöst] Wie spreche ich OnResize bzw. OnClick einer dynamisch erstellten Form an ?
 
So nun habe ich doch die Lösung gefunden:
Hier ist der Link: http://www.delphipraxis.net/10009-dy...nach-ende.html

entscheidend ist:
Delphi-Quellcode:
@Button.OnClick:=@SetzeColor;

Hier noch einmal mein Testprogramm:
Delphi-Quellcode:
var
  Form    :TForm;
  Button  :TButton;
  BitBtn  :TBitBtn;

procedure SetzeColor;
begin
  Form.color:=Form.color+1;
end;

procedure ErmittleDynWidthHeight;
begin
  Form.Caption:=IntToStr(Form.Width)+'  '+IntToStr(Form.Height)
end;

procedure TForm2.btErzeugeFormClick(Sender: TObject);
begin
  Form:=TForm.Create(Form2);
  Form.Top:=100;
  Form.Left:=100;
  Form.Width:=400;
  Form.Height:=300;
  Form.Visible:=true;
  Form.Caption:='Dyn. Form';
  @Form.OnResize:=@ErmittleDynWidthHeight;   //<-------------

  Button:=TButton.create(Form2);
  Button.parent:=Form;
  Button.Top:=Form.Height-70;
  Button.Left:=10;
  Button.Anchors:=[akLeft,akBottom];
  Button.Width:=90;
  Button.Height:=25;
  Button.caption:='S&tart Farbe';
  Button.Visible:=true;
  @Button.OnClick:=@SetzeColor;   //<-------------

  BitBtn:=TBitBtn.Create(Form);
  BitBtn.parent:=Form;
  BitBtn.Top:=Form.Height-70;
  BitBtn.Left:=Form.Width-100;
  BitBtn.Anchors:=[akRight,akBottom];
  BitBtn.Kind:=bkClose;
  BitBtn.Caption:='&Schließen';
  BitBtn.Visible:=true;

end;
Vielen Dank für eure Bemühungen.


Gruß, Linkat


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 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