Aus meinem "Spiel"-Projekt:
Delphi-Quellcode:
TForm1 = class(TForm)
MyEditButton1: TSpeedButton;
MyEdit: TEdit;
MyEditButton2: TButton;
MyEditButton3: TSpeedButton;
// snip
end;
Delphi-Quellcode:
procedure UpdateButtonEdit(AEdit: TCustomEdit);
var
i: Integer;
c: TControl;
wr, wl: Integer;
begin
wr := 0;
wl := 0;
for i := 0 to Pred(AEdit.ControlCount) do
begin
c := AEdit.Controls[i];
if c.Visible then
case c.Align of
alLeft: Inc(wl, c.Width);
alRight: Inc(wr, c.Width);
end;
end;
SendMessage(TCustomEdit(AEdit).Handle, EM_SETMARGINS, EC_LEFTMARGIN or EC_RIGHTMARGIN, MAKELONG(wl, wr));
end;
procedure MakeButtonEdit(AEdit: TCustomEdit; AButton: TControl; AAlign: TAlign);
begin
AButton.Parent := AEdit;
AButton.Align := AAlign;
AButton.Cursor := crArrow;
UpdateButtonEdit(AEdit);
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
MakeButtonEdit(MyEdit, MyEditButton1, alRight);
MakeButtonEdit(MyEdit, MyEditButton2, alRight);
MakeButtonEdit(MyEdit, MyEditButton3, alLeft);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
MyEditButton1.Visible := not MyEditButton1.Visible;
UpdateButtonEdit(MyEdit);
end;
Das müsste natürlich alles noch schön gekapselt werden, funktioniert aber schon besser als ich gehofft hätte. Buttons am linken Rand verschwinden manchmal - vielleicht ist Align-en in einem Edit nicht sooo ne tolle Idee.