![]() |
Menüeditor mit Listbox / automatisches resize
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:
mir gehts da um die Zeile
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;
Delphi-Quellcode:
dieses würde ich meine Komponente selber eledigen lassen, nur wie?
me.Height:=me.ItemHeight*(me.Items.Count)+5;
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 |
Re: Menüeditor mit Listbox / automatisches resize
ich hab es mit einer hintergrundklasse für die Items hinbekommen.
wen es interessiert: ![]() funktioniert bisher ganz gut, submenüs, shortcuts und Drag&drop sind schon drin :) gibt es noch eine Möglichkeit, die spaltenbreite für jede spalte festzulegen? also dass nicht alle spalten gleich breit sind...OnMeasureItem funktioniert ja nur mit der Höhe....da ich grade dabei bin, die Darstellung des Mainmenüs hinzubekommen, wäre das sehr nützlich, auslesen der Breite müsste dann natürlich auch gehen :) Gruß Frank |
Re: Menüeditor mit Listbox / automatisches resize
niemand eine Idee?? *push*
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz