Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Menüeditor mit Listbox / automatisches resize (https://www.delphipraxis.net/92432-menueeditor-mit-listbox-automatisches-resize.html)

_frank_ 19. Mai 2007 17:23


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:
  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
Delphi-Quellcode:
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

_frank_ 22. Mai 2007 10:43

Re: Menüeditor mit Listbox / automatisches resize
 
ich hab es mit einer hintergrundklasse für die Items hinbekommen.
wen es interessiert:
http://www.fw-web.de/download.php?file=menueditor.zip
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

_frank_ 29. Mai 2007 16:42

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