Moin,
ich versuche grade einen Menueditor für meinen DFMeditor zu programmieren. Dieser soll ähnlich dem von delphi sein. Ich dachte mir als Basis ließe sich eine Listbox nehmen...funktioniert bisher ganz gut.
Nur möchte ich keine störende Scrollbalken haben, also muss die Listbox dynamisch "wachsen"
Ich bin schon den
vcl-quellcode durchgegangen, hab aber nirgends eine hinweis gefunden, wie ich das erweitern der Eigenschaft Items als "Eventmethode" abfangen/überschreiben kann.
bisher sieht das ganze so aus:
Delphi-Quellcode:
TMenuEditor=class(TListbox)
FMenuVisible:TMenuEditor;
protected
procedure Click; override;
public
constructor Create(AOwner:TComponent); override;
//destructor destroy; override;
procedure DrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState); override;
function AddSubMenu(Index:integer):TMenuEditor;
end;
...
constructor TMenuEditor.Create(AOwner:TComponent);
begin
inherited;
Style:=lbOwnerDrawFixed;
ItemHeight:=20;
Ctl3D:=false;
IntegralHeight:=true;
end;
procedure TMenuEditor.Click;
begin
inherited;
if assigned(FMenuVisible) then
begin
FMenuVisible.Visible:=false;
FMenuVisible:=nil;
end;
if Items.Objects[itemindex]<>nil then
begin
FMenuVisible:=Items.Objects[itemindex] as TMenuEditor;
FMenuVisible.Left:=left+width;
FmenuVisible.Top:=top+ItemRect(itemindex).top;
FMenuVisible.Visible:=true;
end;
end;
procedure TMenuEditor.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
canvas.brush.Color:=bgcolor;
Canvas.Font.Color:=clWindowText;
if odSelected in State then
begin
canvas.brush.Color:=clblue;
Canvas.Font.Color:=clWindow;
end;
canvas.FillRect(rect);
Canvas.TextOut(4,rect.top+4,items.strings[index]);
if Items.Objects[index]<>nil then
begin
Canvas.Font.Name:='Marlett';
Canvas.Font.Size:=10;
canvas.TextOut(rect.right-15,rect.top+4,'4');
Canvas.Font.Name:='MS Sans Serif';
Canvas.Font.Size:=8;
end;
end;
function TMenuEditor.AddSubMenu(Index:integer):TMenuEditor;
begin
result:=nil;
if (index<0) or (index>=Items.count) then exit;
if assigned(Items.Objects[index]) then exit;
result:=TMenuEditor.Create(self);
result.Visible:=false;
result.Parent:=parent;
Items.Objects[index]:=result;
end;
procedure TForm1.FormCreate(Sender: TObject);
var me2:TMenueditor;
begin
me:=TMenuEditor.Create(self);
me.Parent:=self;
me.Items.Assign(Listbox1.items);
me.Height:=me.ItemHeight*(me.Items.Count)+5;
me2:=me.AddSubMenu(5);
if assigned(me2) then
begin
me2.Items.Assign(Listbox1.items);
end;
end;
mir gehts da um die Zeile
me.Height:=me.ItemHeight*(me.Items.Count)+5;
dieses würde ich meine Komponente selber eledigen lassen, nur wie?
weiterhin setze ich ja Ctl3D im constructor auf false, welches den 3D-Rahmen eigentlich verhindern sollte, jedoch wird dieser trotzdem angezeigt, warum?
//edit
so wie es aussieht muss das ctl3d nach dem parent gesetzt werden...da beim setparent diese Eigenschaft vom Parent übernommen wird...
Gruß Frank