Einzelnen Beitrag anzeigen

Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Buttons zur Laufzeit erstellen und mit Werten aus der Datenbank füllen?

  Alt 21. Feb 2014, 07:31
Man kann dem Button.Tag aber auch mittels Cast ein Objekt zuweisen. Allerdings weiß ich nicht, wie das unter 64 Bit aussieht, wenn Tag da nur 32-bittig ist, kann das danebengehen.
Delphi-Quellcode:
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat