Einzelnen Beitrag anzeigen

schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#1

Hauptmenü mit Toolbar verbinden

  Alt 9. Feb 2005, 10:49
Hallo Delphi Kenner!

Ich will einen Toolbar verwenden, um ein Menü anzuzeigen. Es gibt ja diese schönen sogenannten Floating Toolbars. Mein Problem: Die ActionBand-Kompos fehlen in der D7 Personal. Es gibt zwar schöne Drittanbieterkompos für sowas. Aber wie macht man das selber. Kann man ja nur von lernen. Ich hab es zuerst mit Popup-Menüs versucht, da der ToolBar nur Popupmenüs zuläßt. Auch die Toolbuttons akzeptieren nur Popup-Menüs. Das Problem dabei ist, daß das Maustracking dann nicht optimal funzt. Wenn ich ein Menü in einer sonstigen Anwendung offen habe und mit der Maus die Menüleiste enltangfahre, öffnet sich jeweils dasjenige Menü, das ich mit dem Mauszeiger anwähle. Und genau dieses Verhalten kriege ich bei meinem Menü-ToolBar nicht hin. Will ich aber haben. Jedoch muß ich bisher jedes Menü neu anklicken, damit es sich öffnet. Deshalb habe ich folgendes versucht:

Delphi-Quellcode:
procedure TMenuToolBar.CreateButtons;
var btn: array of TMenuToolButton; i: Integer;

 function AssignedMenu(Src: TMenu; Index: Integer): TMenu;
 var j: Integer; Dst: TMainMenu;
 begin
    Dst := nil;
    Result := nil;
    if Assigned(Src) then
    begin
      if (Index >= 0) and (Index <= Src.Items.Count-1) then
      begin
        Dst := TMenu.Create(self);
        for j := 0 to Src.Items[Index].Count-1 do
        Dst.Items.Add(Src.Items[Index].Items[j]);
      end;
    end;
    Result := Dst;
 end;

begin
   if Menu <> NIL then
   begin
     SetLength(btn, Menu.Items.Count);
     for i:=0 to Menu.Items.Count-1 do
     begin
       btn[i] := TMenuToolButton.Create(self);
       btn[i].Parent := TMenuToolBar;
       btn[i].ToolBar := TMenuToolBar;
       btn[i].AutoSize := true;
       if Menu<>NIL then
       begin
         btn[i].Caption := Menu.Items[i].Caption;
         btn[i].Menu := AssignedMenu(Menu,i);
// btn[i].PopupMenu := TPopupMenu(btn[i].Menu);
// PopupMenü will ich eigentlch vermeiden, Es sei denn, das Maustracking ist irgenwie
// hinzukriegen. Dann konnte ich vielleicht auch ein Popup-Menü erzeugen, dem ich die
// Menu.Items vom entspr. Hauptmenü zuweise. Aber ohne Maustracking?
       end;
     end;
   end;
end;
Ich will damit erreichen, das einem ToolButton der Caption des jeweiligen Hauptmenüs zugewiesen wird und die Menüs, die dann aufklappen, dem jeweiligen Menü des ToolButtons zuweisen. Jedoch akzeptiert ein Standard-ToolButton nur Popup-Menüs, womit das Problem mit dem Maustracking bestehen bliebe. Deshalb habe ich die Unterfunktion AssignedMenu geschrieben, mit der ich ein generisches Menü zuweisen will. Aber Delphi beschwert sich mit EAbstractError. Wenn ich aber in AssignedMenu(src: TMainMenu; Index: Integer): TMenu; schreibe, gibt es Typkonflikt bzw. Feler: Menü wurde zweimal zugewiesen.

Ich will eine Toolbarkompo entwickeln, der ich ein TMainMenu zuweisen kann. Um alles andere soll sich die Methode CreateButtons kümmern. Die Klassendefinition ist wie folgt:

Delphi-Quellcode:
type
 TMenuToolbar = class(TToolbar)
   ..... //was sonst noch so geraucht wird
   FMenu: TMainMenu;
   procedure SetMenu: value: TMainMenu);
   procedure CreateButtons;
 public
   constructor create(AOwner: TComponent);
 published
   Menu: TMainMenu read FMenu write SetMenu;
   ..... //anderes Zeug
 end;

procedure SetMenu(value: TMainMenu);
begin
  if value <> nil then if value <> FMenu then FMenu := value;
  CreateButtons;
end;
Wer kann mir helfen?

In guter Hoffnung verbleibt

schöni
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat