Delphi-PRAXiS
Seite 1 von 2  1 2      

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 "echter" Dropdown-Toolbutton... (https://www.delphipraxis.net/14580-echter-dropdown-toolbutton.html)

FriFra 11. Jan 2004 20:09


"echter" Dropdown-Toolbutton...
 
Wie mache ich einen Toolbutton zu einem "echten" DropDown-Toolbutton (Abbildung links.; Explorer)? Unter Delphi bewirkt der Style tbsDropDown (Abblildung rechts) nur, dass beim Klick rechts auf den Button das Menü aufpoppt... aber im Explorer öffnet der komplette Button das Menü!
http://www.frifra.de/Temp/tbtest.jpg

mirage228 11. Jan 2004 20:14

Re: "echter" Dropdown-Toolbutton...
 
Du musst auch nicht Popup, sondern DropdownMenu im OI setzen... oder hast du das schon?

mfG
mirage228

FriFra 11. Jan 2004 20:22

Re: "echter" Dropdown-Toolbutton...
 
Das hab ich schon :? ...

jonny 11. Jan 2004 20:40

Re: "echter" Dropdown-Toolbutton...
 
Du kannst im OnClick Ereigniss des Buttons
folgendes angeben:

Code:
procedure btDropDownClick(Sender: TObject);
begin
  popmenueDropDownBtn.PopUp(Self.Left + btDropDown.Left + 5, Self.Top + (Self.Hight - Self.ClientHeight) + btDropDown.Top + btDropDown.Height);
end;
Dann Kommt das Menü ganz wie in dem Explorer genau unter dem Button. Wenn du den Button auf Panels sitzen hast und die Left eigenschaft nicht bei 0 liegt musst du die auch noch in die Formel einbauen.

FriFra 11. Jan 2004 20:45

Re: "echter" Dropdown-Toolbutton...
 
@Jonny: Dann hat der Button immernoch nicht den richtigen Style! Ich will auch den blöden "divider" innerhalb des Buttons weg haben... er wäre auch weg, wenn der Style stimmt.

jonny 11. Jan 2004 21:10

Re: "echter" Dropdown-Toolbutton...
 
Mann könnte höchstens mal einen eigenen Pfeil malen dann in ein BitBtn einfügen und dann wie oben beschrieben verfahren. ist zwar nicht die Eleganteste Lösung es ist aber eine.

FriFra 11. Jan 2004 21:16

Re: "echter" Dropdown-Toolbutton...
 
Nein, solche Basteleien will ich nicht...

Lt. MSDN gibt es einen Style BTNS_WHOLEDROPDOWN =$0080;... nur wie sende ich einem Toolbutton, das ja kein Handle hat, eine Message, dass es diesen Style verwenden soll?

scp 11. Jan 2004 21:45

Re: "echter" Dropdown-Toolbutton...
 
So gehts:
Delphi-Quellcode:
uses
  CommCtrl; // Nicht vergessen und nicht mit ComCtrls verwechseln

procedure TBSetWholeDropDown(hTB : THandle; iButton : integer);
var
  tBB : TTBBUTTON;
  tBI : TBBUTTONINFO;
const
  BTNS_WHOLEDROPDOWN =$0080;
begin
  FillChar(tBB, SizeOf(tBB), 0);
  SendMessage (hTB, TB_GETBUTTON, iButton, Integer(@tBB));
  FillChar(tBI, SizeOf(tBI), 0);
      tBI.cbSize := SizeOf(tBI);
      tBI.dwMask := TBIF_STYLE;
  SendMessage(hTB, TB_GETBUTTONINFO, tBB.idCommand, Integer(@tBI));
  tBI.fsStyle := tBI.fsStyle or BTNS_WHOLEDROPDOWN;
  SendMessage(hTB, TB_SETBUTTONINFO, tBB.idCommand, Integer(@tBI));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TBSetWholeDropDown(ToolBar1.Handle, 0);
end;
Wobei iButton der Index des Buttons ist.

FriFra 11. Jan 2004 22:05

Re: "echter" Dropdown-Toolbutton...
 
Danke ;)

Ich hab den Code noch etwas erweitert, da dieser Style erst ab IE5 verfügbar ist und es mit IE4 (oder früher) zu unerwarteten Verhalten kommen könte:
Delphi-Quellcode:
uses
  CommCtrl, Registry;


procedure TBSetWholeDropDown(hTB: THandle; iButton: integer);
  function IEReady: Boolean;
  var
    Reg: TRegistry;
    Tmp: string;
  begin
    Result := False;
    Reg := TRegistry.Create;
    try
      Reg.Access := KEY_READ;
      Reg.RootKey := HKEY_LOCAL_MACHINE;
      Reg.OpenKey('Software\Microsoft\Internet Explorer', False);
      Tmp := Reg.ReadString('Version');
      if pos('.', Tmp) > 0 then
        Tmp := copy(Tmp, 1, pos('.', Tmp) - 1);
      Result := StrToIntDef(Trim(Tmp), 0) >= 5;
      Reg.CloseKey;
    finally
      Reg.Free;
    end;
  end;
var
  tBB: TTBBUTTON;
  tBI: TBBUTTONINFO;
const
  BTNS_WHOLEDROPDOWN = $0080;
begin
  if IEReady then
  begin
    FillChar(tBB, SizeOf(tBB), 0);
    SendMessage(hTB, TB_GETBUTTON, iButton, Integer(@tBB));
    FillChar(tBI, SizeOf(tBI), 0);
    tBI.cbSize := SizeOf(tBI);
    tBI.dwMask := TBIF_STYLE;
    SendMessage(hTB, TB_GETBUTTONINFO, tBB.idCommand, Integer(@tBI));
    tBI.fsStyle := tBI.fsStyle or BTNS_WHOLEDROPDOWN;
    SendMessage(hTB, TB_SETBUTTONINFO, tBB.idCommand, Integer(@tBI));
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  TBSetWholeDropDown(ToolBar1.Handle, 0);
end;

FriFra 11. Jan 2004 23:30

Re: "echter" Dropdown-Toolbutton...
 
Ein kleines Schönheitsproblem gibt es noch...

Irgendwie ist der bettr. Toolbutton zu breit geraten:
http://www.frifra.de/Temp/tbalign.jpg

...obwohl AutoSize=True ist... Der Pfeil sollte schon näher am Glyphen sein :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:08 Uhr.
Seite 1 von 2  1 2      

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