Einzelnen Beitrag anzeigen

Benutzerbild von DeddyH
DeddyH

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

AW: Objekte zur Laufzeit erzeugen

  Alt 20. Mai 2014, 19:02
Ich habe zwar keine Styles, aber daran liegt es vermutlich nicht.

[edit]Ich habe mal schnell ein Beispiel geschrieben (unter Delphi 7, höher steht mir gerade nicht zur Verfügung). Mach doch mal ein Testprojekt mit einem Panel und einem Button auf dem Hauptformular. Das Panel ziehst Du ein bisschen auf, damit ein paar Buttons darauf Platz finden (siehe Screenshot). Im Code schreibst Du oberhalb der Form-Deklaration folgenden Code:
Delphi-Quellcode:
type
  TPanel = class(ExtCtrls.TPanel)
  private
    FButtons: TObjectList;
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
    procedure AddButtons(CountButtons: Cardinal; ClickEvent: TNotifyEvent);
  end;
Im Implementation-Teil dann das hier:
Delphi-Quellcode:
procedure TPanel.AddButtons(CountButtons: Cardinal;
  ClickEvent: TNotifyEvent);
const
  X_OFFSET = 10; //horizontaler Abstand
  Y_OFFSET = 10; //vertikaler Abstand
  BUTTONWIDTH = 75; //Breite jedes Buttons
  BUTTONHEIGHT = 25; //Höhe jedes Buttons
var
  i: integer;
  ButtonsPerRow: integer;
  NewButton: TButton;
begin
  //Evtl. schon vorhandene Buttons löschen
  FButtons.Clear;
  //Wieviele Buttons passen in eine Zeile bei Abstand rechts und links?
  ButtonsPerRow := (ClientWidth - X_OFFSET) div (X_OFFSET + BUTTONWIDTH);
  for i := 0 to CountButtons - 1 do
    begin
      //Neuen Button erzeugen, Eigenschaften zuweisen...
      NewButton := TButton.Create(nil);
      NewButton.Width := BUTTONWIDTH;
      NewButton.Height := BUTTONHEIGHT;
      NewButton.Caption := 'Button ' + IntToStr(Succ(i));
      NewButton.Left := X_OFFSET + (BUTTONWIDTH + X_OFFSET) * (i mod ButtonsPerRow);
      NewButton.Top := Y_OFFSET + (BUTTONHEIGHT + Y_OFFSET) * (i div ButtonsPerRow);
      NewButton.OnClick := ClickEvent;
      NewButton.Parent := self;
      //... und der Liste hinzufügen
      FButtons.Add(NewButton);
    end;
end;

constructor TPanel.Create(AOwner: TComponent);
begin
  inherited;
  FButtons := TObjectList.Create;
end;

destructor TPanel.Destroy;
begin
  FButtons.Free;
  inherited;
end;
Das Formular selbst wird noch um eine Methode erweitert:
Delphi-Quellcode:
  TForm1 = class(TForm)
    Panel1: TPanel;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
    //wird den Buttons als Click-Event zugewiesen
    procedure DoOnClick(Sender: TObject);
  public
    { Public-Deklarationen }
  end;
Und der Formular-Code sieht in der Implementation dann so aus:
Delphi-Quellcode:
procedure TForm1.DoOnClick(Sender: TObject);
begin
  if Sender is TButton then
    ShowMessage(TButton(Sender).Caption);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Panel1.AddButtons(100, DoOnClick);
end;
Tritt der Fehler damit auch auf? [/edit]
Miniaturansicht angehängter Grafiken
demo.png  
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

Geändert von DeddyH (20. Mai 2014 um 19:18 Uhr)
  Mit Zitat antworten Zitat