Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Button zur Laufzeit erzeugen (https://www.delphipraxis.net/96647-button-zur-laufzeit-erzeugen.html)

Mooshead 28. Jul 2007 02:03


Button zur Laufzeit erzeugen
 
Hallo ich hab das Problem, dass ich einen Button zur Laufzeit erzeugt habe und ich wollte diesem Button nun eine Procedure beim Ereignis OnClick zuweisen.

Das Programm könnte wie folgt aussehen:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  TButton.Create(Self).Name :='Button1';
  with TButton(FindComponent('Button1')) do
  begin
    Left := 10;
    Top := 20;
    Parent := self;
    //Anweisung um beim Ereignis OnClick die Procedure 'test' auszuführen
  end;
end;


procedure test;
begin
//Anweisungen
end;
Die Procedure test wurde natürlich im Voraus deklariert.

Danke für eure Antworten

raiguen 28. Jul 2007 02:27

Re: Button zur Laufzeit erzeugen
 
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var btnNeu: TButton;
begin
  btnNeu := TButton.Create(Self)
  with btnNeu do
  begin
    Name := 'Button1';
    Caption := 'Click mich';
    Left := 10;
    Top := 20;
    Parent := self;
    OnClick := tesstClick;
  end;
end;


procedure tesstClick;
begin
//Anweisungen
end;
So in etwa...
Gute Nacht :hi:

[edit=Luckie] Mfg, Luckie[/edit]

Christian Seehase 28. Jul 2007 02:41

Re: Button zur Laufzeit erzeugen
 
Moin Mooshead,

wichtig ist erst einmal, dass OnClick eine Methode zugewiesen werden muss, und keine einfache Prozedur oder Funktion.
Eine Methode ist eine Prozedur oder Funktion einer Klasse.

In diesem Falle (OnClick) muss es eine Prozedur vom Typ TNotifyEvent sein.

Das einfachst wäre, wenn Du dem Formular eine, wie auch immer genannte, Methode hinzufügst.



Delphi-Quellcode:
TForm1 = class(TForm)
  procedure MeineOnClickMethode(Sender : TObject);
//...

implementation

procedure TForm1.MeineOnClickMethode(Sender : TObject);
begin
  // Was auch immer beim Anklicken passieren soll
end;

// Jetzt kannst Du dem Button die Methode zuweisen

  OnClick := MeineOnClickMethode;

Der Wesentliche Unterschied zwischen einer Methode und einer Prozedur/Funktion:
Eine Methode hat noch einen, impliziten, also nicht direkt sichtbaren, Parameter namens self, mit dem auf die Instanz der Klasse referenziert wird, in der sich die Methode befindet. Intern steht dieser vor dem ersten sichtbaren Parameter.

Mooshead 28. Jul 2007 13:08

Re: Button zur Laufzeit erzeugen
 
Danke für euren schnellen Antworten auch noch zur späten Stunde :coder:

ich habe da aber jetzt noch eine Frage und ich hoffe ihr könnt mir schnell weiter helfen:

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure Klick(Sender : TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
   { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
  for i:=1 to 10 do
    begin
      TButton.Create(Self).Name :='Button'+IntToStr(i);
      with TButton(FindComponent('Button'+IntToStr(i))) do
      begin
        Left   := 10;
        Top    := i * 30;
        caption := IntToStr(i);
        Parent := self;
        OnClick := Klick;
      end;
    end;
end;


procedure TForm1.Klick(Sender : TObject);
begin
   label1.Caption:='???'; //Im Label sollte nun der Name des Buttons der
end;                      //betätigt wurde bzw. dessen Beschriftung (Caption) stehen


end.
:wiejetzt: :wiejetzt: :wiejetzt: :wiejetzt:

Meine Fragestelung sollte sich aus dem Quelltext ergeben.

marabu 28. Jul 2007 13:18

Re: Button zur Laufzeit erzeugen
 
Hi,

das weiß sogar ich:

Delphi-Quellcode:
procedure TForm1.Klick(Sender : TObject);
begin
  with Sender as TButton do
    Label1.Caption := Caption;
end;
Grüße vom marabu

Mooshead 28. Jul 2007 13:19

Re: Button zur Laufzeit erzeugen
 
Dankeschööön :cheers:

BenjaminH 28. Jul 2007 14:34

Re: Button zur Laufzeit erzeugen
 
Noch eine kleine Ergänzung:
Zitat:

Zitat von Mooshead
Delphi-Quellcode:
TButton.Create(Self).Name :='Button'+IntToStr(i);
      with TButton(FindComponent('Button'+IntToStr(i))) do

Schnelle geht es, wenn du den Button danach nicht nochmal suchen musst:
Delphi-Quellcode:
with TButton.Create(self) do
begin
   Name:='Button'+IntoStr(i);
In den Beispielen die dir gegeben wurden wurde es schon so gemacht.


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