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]