AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Menüeditor mit Listbox / automatisches resize
Thema durchsuchen
Ansicht
Themen-Optionen

Menüeditor mit Listbox / automatisches resize

Ein Thema von _frank_ · begonnen am 19. Mai 2007 · letzter Beitrag vom 29. Mai 2007
Antwort Antwort
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, 17: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
Benutzerbild von _frank_
_frank_

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

Re: Menüeditor mit Listbox / automatisches resize

  Alt 22. Mai 2007, 10:43
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
  Mit Zitat antworten Zitat
Benutzerbild von _frank_
_frank_

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

Re: Menüeditor mit Listbox / automatisches resize

  Alt 29. Mai 2007, 16:42
niemand eine Idee?? *push*
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz