Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Buttons dynamisch erstellen (https://www.delphipraxis.net/64108-buttons-dynamisch-erstellen.html)

Pelzi 27. Feb 2006 17:15


Buttons dynamisch erstellen
 
Hi,
Ich brauche für ein programm sehr viele Buttons auf meinem Formular, deswegen hab ich mir überlegt das es das einfachste wäre die Buttons dynamishc zu erstellen. Schön und gut innen bischen in Klassen in Delphi eingelesen, und schnell herausgefunden wie man Komponenten dynamisch erstellt, dachte ich.
Mit dem dynamischen erstellen von Formularen klappt es so ja auch problemlos:
Delphi-Quellcode:
var
  Form1: TForm1;
  forms: array[0..20] of TForm;
[......]
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
begin
  for i:=0 to 20 do
  begin
    forms[i]:=TForm.create(form1);
    forms[i].Visible:=true;
    forms[i].Left:=i*40;
  end;
end;
Das funktioniert ohne Probleme.
Nun stelle icha ber diesen code auf Buttons um:

Delphi-Quellcode:
var
  Form1: TForm1;
  buttons: array[0..20] of TButton;
[......]
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
begin
  for i:=0 to 20 do
  begin
    buttons[i]:=TButton.create(form1);
    buttons[i].Visible:=true;
    buttons[i].Left:=i*40;
  end;
end;
Wenn ich nun das nun Compeliere sagt er mir zunächst:
Zitat:

[Fehler] Unit1.pas(19): Undefinierter Bezeichner: 'TButton'
Das lässt sich aber beheben in dem ich einen button auf dem Formular erstelle un ihn wieder lösche.
Nun gibt es zwar keine Fehlermeldungen mehr, aber es passiert aber auch nciht das gewünschte.
Es passiert nämlich genau garnichts, außer das nach realtiv langer Compelier Zeit für ein so kleines Programm ein leeres Fenster erscheint.
Woran liegt das?
Und wie funktioniert es?

pelzi

jfheins 27. Feb 2006 17:17

Re: Buttons dynamisch erstellen
 
Du musst noch top, height und width enstellen, damit der Button weis, wo er ist ;)

Ach, und nen Parent braucht er auch noch ...

glkgereon 27. Feb 2006 17:20

Re: Buttons dynamisch erstellen
 
Zitat:

Zitat von jfheins
Du musst noch top, height und width enstellen, damit der Button weis, wo er ist ;)

Ach, und nen Parent braucht er auch noch ...

Idealerweise sagst du ihm auch noch was er beim OnClick machen soll (Wozu sonst ein Button?)

Und damit er wirklich gezeigt wird muss man glaub ich noch Button.Show; sagen...

turboPASCAL 27. Feb 2006 17:22

Re: Buttons dynamisch erstellen
 
Da der Button selbst ein Fenster ist muss ihm noch ein Parent zugewiesen werden damit er weis auf welchem Fenster er erscheinen soll.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
begin
  for i:=0 to 20 do
  begin
    buttons[i]:=TButton.create(form1);
    buttons[i].Visible:=true;
    buttons[i].Left:=i*40;

    buttons[i].Parent := forms[i];
  end;
end;

Pelzi 27. Feb 2006 17:34

Re: Buttons dynamisch erstellen
 
Zitat:

Zitat von glkgereon
Zitat:

Zitat von jfheins
Du musst noch top, height und width enstellen, damit der Button weis, wo er ist ;)

Ach, und nen Parent braucht er auch noch ...

Idealerweise sagst du ihm auch noch was er beim OnClick machen soll (Wozu sonst ein Button?)

Und damit er wirklich gezeigt wird muss man glaub ich noch Button.Show; sagen...

So der Tipp mit dem Parent war gut :)
Wo du es schon ansprichst, Onclick ereignisse, in diesem Fall brauchte ich die ganzen buttons zwar nur wegen ihres schönen aussehens, aber in zukunft kann es durchaus passieren, das sie etwas bewirken sollen.
Kann mir da jemand einen Link geben oder erklären wie es funktioniert?

Pelzi

glkgereon 27. Feb 2006 17:39

Re: Buttons dynamisch erstellen
 
Zitat:

Zitat von Pelzi
Zitat:

Zitat von glkgereon
Zitat:

Zitat von jfheins
Du musst noch top, height und width enstellen, damit der Button weis, wo er ist ;)

Ach, und nen Parent braucht er auch noch ...

Idealerweise sagst du ihm auch noch was er beim OnClick machen soll (Wozu sonst ein Button?)

Und damit er wirklich gezeigt wird muss man glaub ich noch Button.Show; sagen...

So der Tipp mit dem Parent war gut :)
Wo du es schon ansprichst, Onclick ereignisse, in diesem Fall brauchte ich die ganzen buttons zwar nur wegen ihres schönen aussehens, aber in zukunft kann es durchaus passieren, das sie etwas bewirken sollen.
Kann mir da jemand einen Link geben oder erklären wie es funktioniert?

Pelzi

Weil sie schön aussehen? :shock:

OnClick:

einfach eine
procedure Click(Sender: TObject);
in der Form deklarieren und dann
Button.OnClick:=Click;

Pelzi 27. Feb 2006 18:01

Re: Buttons dynamisch erstellen
 
Zitat:

Zitat von glkgereon
Zitat:

Zitat von Pelzi
Zitat:

Zitat von glkgereon
Zitat:

Zitat von jfheins
Du musst noch top, height und width enstellen, damit der Button weis, wo er ist ;)

Ach, und nen Parent braucht er auch noch ...

Idealerweise sagst du ihm auch noch was er beim OnClick machen soll (Wozu sonst ein Button?)

Und damit er wirklich gezeigt wird muss man glaub ich noch Button.Show; sagen...

So der Tipp mit dem Parent war gut :)
Wo du es schon ansprichst, Onclick ereignisse, in diesem Fall brauchte ich die ganzen buttons zwar nur wegen ihres schönen aussehens, aber in zukunft kann es durchaus passieren, das sie etwas bewirken sollen.
Kann mir da jemand einen Link geben oder erklären wie es funktioniert?

Pelzi

Weil sie schön aussehen? :shock:

OnClick:

einfach eine
procedure Click(Sender: TObject);
in der Form deklarieren und dann
Button.OnClick:=Click;

Also wo jetzt die Prozedur deklarieren?
wenn ich es so mache bekomme ich eine Fhelermeldung:(mal die ganze unit)
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  buttons: array[0..20] of TButton;
  forms: array[0..20] of TForm;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
begin
  for i:=0 to 20 do
  begin
    buttons[i]:=TButton.create(form1);
    buttons[i].Left:=20;
    buttons[i].top:=80;
    buttons[i].height:=35;
    buttons[i].width:=80;
    buttons[i].Visible:=true;
    forms[i]:=TForm.Create(form1);
    buttons[i].Parent:=forms[i];
    forms[i].Visible:=true;
    forms[i].left:=40*i;
    forms[i].width:=38;
    buttons[i].OnClick:=click;
  end;
end;
procedure click(Sender: TObject);
begin
  showmessage('du hast geklicked');
end;

end.
Zitat:

[Fehler] Unit1.pas(46): Inkompatible Typen: 'Liste der Parameter ist unterschiedlich'

Pelzi

glkgereon 27. Feb 2006 18:03

Re: Buttons dynamisch erstellen
 
nimm mal einen Button per Hand und nimm da das OnClick.

genauso muss es aussehen, nur halt per hand geschrieben ;)

so:

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

implementation

procedure TForm1.Click(Sender: TObject);
begin
  //Mach mal irgendwas
end;

procedure TForm1.FormCreate(Sender: TObject);
var i:Integer;
begin
  for i:=0 to 20 do
  begin
    buttons[i]:=TButton.create(form1);
    buttons[i].Left:=20;
    buttons[i].top:=80;
    buttons[i].height:=35;
    buttons[i].width:=80;
    buttons[i].Visible:=true;
    forms[i]:=TForm.Create(form1);
    buttons[i].Parent:=forms[i];
    forms[i].Visible:=true;
    forms[i].left:=40*i;
    forms[i].width:=38;
    buttons[i].OnClick:=click;
  end;
end;

dataspider 27. Feb 2006 18:05

Re: Buttons dynamisch erstellen
 
Hi,

die Methode Click ist in bereits als virtuelle Methode (TControl) implementiert.
Du musst diese in z.B. ButtonClick umbenennen.

Cu, Frank

Pelzi 27. Feb 2006 18:09

Re: Buttons dynamisch erstellen
 
Zitat:

Zitat von dataspider
Hi,

die Methode Click ist in bereits als virtuelle Methode (TControl) implementiert.
Du musst diese in z.B. ButtonClick umbenennen.

Cu, Frank

Guter Tipp, aber funktionieren tuts nochimmer nicht, gibt ne neue Fehlermeldung:
Zitat:

[Fehler] Unit1.pas(46): Inkompatible Typen: 'Methodenzeiger und reguläre Prozedur'
Pelzi


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:12 Uhr.
Seite 1 von 2  1 2      

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