unit DynaButtons;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Contnrs;
type
(* Beispieldaten, die einem Button zugeordnet werden *)
TDatensatz =
class
private
FStringValue:
string;
FIntValue: integer;
public
property StringValue:
string read FStringValue
write FStringValue;
property IntValue: integer
read FIntValue
write FIntValue;
end;
TfrmDynamicButtons =
class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private-Deklarationen }
(* Liste für die dynamischen Buttons *)
FButtons: TObjectList;
(* Hilfsroutine zum Erzeugen eines neuen Buttons *)
procedure InsertButton(
const ACaption:
string; X, Y: integer;
Datensatz: TDatensatz);
(* Eventhandler für OnClick der dynamischen Buttons *)
procedure ShowData(Sender: TObject);
public
{ Public-Deklarationen }
end;
var
frmDynamicButtons: TfrmDynamicButtons;
implementation
{$R *.dfm}
procedure TfrmDynamicButtons.FormCreate(Sender: TObject);
var
Datensatz: TDatensatz;
begin
(* Erzeugen der Liste *)
FButtons := TObjectList.Create(false);
(* Und mit ein paar Daten befüllen *)
Datensatz := TDatensatz.Create;
Datensatz.StringValue := '
Hanswurst';
Datensatz.IntValue := 100;
InsertButton('
Erster Button', 10, 10, Datensatz);
Datensatz := TDatensatz.Create;
Datensatz.StringValue := '
Hallo Welt';
Datensatz.IntValue := 12345;
InsertButton('
Zweiter Button', 10, 40, Datensatz);
Datensatz := TDatensatz.Create;
Datensatz.StringValue := '
Dideldum, Dideldei';
Datensatz.IntValue := 42;
InsertButton('
Dritter Button', 10, 70, Datensatz);
end;
procedure TfrmDynamicButtons.FormDestroy(Sender: TObject);
var
i: integer;
Datensatz: TDatensatz;
Button: TButton;
begin
(* Liste durchgehen und zugeordnete Daten freigeben *)
for i := 0
to FButtons.Count - 1
do
begin
Button := FButtons[i]
as TButton;
Datensatz := TDatensatz(Button.Tag);
Datensatz.Free;
end;
(* Die Liste selbst nicht vergessen *)
FButtons.Free;
end;
procedure TfrmDynamicButtons.InsertButton(
const ACaption:
string; X, Y: integer;
Datensatz: TDatensatz);
var
Button: TButton;
begin
(* Erzeugen eines neuen Buttons *)
Button := TButton.Create(self);
Button.Left := X;
Button.Top := Y;
Button.Parent := self;
Button.OnClick := ShowData;
Button.Caption := ACaption;
(* und Zuordnen des Datensatzes *)
Button.Tag := integer(Datensatz);
(* Ab in die Liste damit *)
FButtons.Add(Button);
end;
procedure TfrmDynamicButtons.ShowData(Sender: TObject);
var
Datensatz: TDatensatz;
Button: TButton;
begin
(* Anzeigen der zugeordneten Werte *)
if (Sender
is TButton)
then
begin
Button := TButton(Sender);
if (FButtons.IndexOf(Button) > -1)
then
begin
Datensatz := TDatensatz(Button.Tag);
if Assigned(Datensatz)
then
ShowMessage(Format('
Stringwert: %s; Zahlwert: %d',
[Datensatz.StringValue, Datensatz.IntValue]));
end;
end;
end;
end.