Einzelnen Beitrag anzeigen

Benutzerbild von _frank_
_frank_

Registriert seit: 21. Feb 2003
Ort: Plauen / Bamberg
922 Beiträge
 
Delphi 3 Professional
 
#1

Menüeditor mit Listbox / automatisches resize

  Alt 19. Mai 2007, 18:23
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
  Mit Zitat antworten Zitat