|
|
|
|
Példaprogram letöltése
21452 bájt
|
Ha a CorelDraw, PhotoPaint vagy akár a PhotoShop programokkal dolgozunk, akkor ezek eszköztárán találhatunk olyan gombokat, amelyek önmagukban is használhatók, de ha a jobb alsó sarokban található kis nyílra kattintunk, vagy hosszabb ideig tartjuk lenyomva, akkor megjelenik egy ToolBar, amin további gombok találhatók. Egy kis trükkel mi is készíthetünk ilyen gombokat.
A mellékelt példaprogram megnyitása előtt a PopupToolbar.pas-ban lévő komponenst telepítenie kell a Delphi alá.
Cikkünk első részében a ToolBar-t készítjük el. A Buttons property-n keresztül adhatjuk meg a ToolBar-on megjelenő gombokat. A ButtonWidth és ButtonHeight property-k a gombok szélességét és magasságát határozzák meg. A FlatButtons property a gombok kinézetét befolyásolja, hatása ugyanaz, mint a TSpeedButton-nál. Később látni fogjuk, hogy ez nem véletlen. Az Orientation property határozza meg a gombok elrendezését. Ha az értéke poHorizontal, akkor egymás mellett, ha poVertical akkor egymás alatt jelennek meg.
A property-k ismertetése után rátérhetünk a komponens megvalósítására. A komponenst a TComponent osztályból származtatjuk. A megjelenítendő gombokat tartalmazó Buttons property a TOwnedCollection osztályból származik. Ennek köszönhetően tetszőleges számú gombot felvehetünk, persze a használhatóságot figyelembe véve, hiszen nem biztos, hogy sok gomb elhelyezése megkönnyíti a felhasználó életét, valamint a ToolBar ki is lóghat a képernyőből. Maga a ToolBar egy Form lesz, amin futásidőben hozzuk létre a gombokat. A megjelenítést a Popup metódus végzi el. Ennek két paramétere van: a ToolBar X és Y koordinátája.
procedure TPopupToolbar.Popup;
var i, bx: integer;
sb: TSpeedButton;
begin
Ellenőrizzük, hogy van-e létrehozandó gomb, mert ha nincs, akkor nem is érdemes megjeleníteni a ToolBart.
if FButtons.Count=0 then Exit;
Beállítjuk a Form koordinátáit és méreteit. A méretet kezdetben a keret szélességére állítjuk, viszont amikor a gombokat létrehozzuk a Form szélessége és magassága ennek megfelelően fog változni, méghozzá automatikusan, mivel az AutoSize property-t true-ra állítottuk.
FForm.Left:=X;
FForm.Top:=Y;
FForm.Height:=6;
FForm.Width:=6;
FForm.ShowHint:=FShowHint;
Ha előzőleg már legalább egyszer megnyitottuk a Form-ot, akkor azon biztos, hogy vannak létrehozva gombok. Mivel azt semmi sem garantálja, hogy a gombok nem változtak az utolsó megjelenítés előtt, ezért ezeket törölni kell. A Form ControlCount property-je megadja, hogy hány komponens található a Form-on. Amíg ez nagyobb, mint 0, addig az elsőt mindig töröljük. Ha töröltük az elsőt, akkor a másodikból lesz az első, és így tovább, egészen addig, amíg el nem fogynak.
while FForm.ControlCount>0 do begin
FForm.Controls[0].Free;
end;
Mielőtt létrehoznánk a gombokat, megjelenítjük a Form-ot. Ez azért jó, mert így a gombok létrehozásával egy időben egy animációt fogunk látni, amint a Form automatikusan változtatja a méretét, hogy minden gomb elférjen rajta.
Egy ciklusban létrehozzuk a TSpeedButton típusú gombokat.
i:=0;
bx:=1;
while i<FButtons.Count do begin
sb:=TSpeedButton.Create(NIL);
Az Orientation property értékétől függően kiszámoljuk az új gomb koordinátáit.
if FOrientation=poHorizontal then begin
sb.Left:=bx;
sb.Top:=0;
FForm.ClientWidth:=(i+1)*FButtonWidth+2;
end else begin
sb.Left:=0;
sb.Top:=bx;
FForm.ClientHeight:=(i+1)*FButtonHeight+2;
end;
A Buttons property-ből kiolvassuk a megfelelő sorszámú gomb adatait, és átadjuk azokat az újonnan létrehozott SpeedButton-nak.
sb.Glyph.Assign(FButtons[i].Glyph);
sb.NumGlyphs:=FButtons[i].NumGlyphs;
sb.Flat:=FlatButtons;
sb.Parent:=FForm;
sb.Width:=FButtonWidth;
sb.Height:=FButtonheight;
sb.Tag:=FButtons[i].Tag;
sb.Enabled:=FButtons[i].Enabled;
sb.Hint:=FButtons[i].Hint;
sb.ShowHint:=FButtons[i].FShowHint;
sb.ParentShowHint:=FButtons[i].ParentShowHint;
sb.OnClick:=FButtons[i].FOnClick;
Frissítjük a Form-ot, majd várakozunk egy kicsit, hogy ne legyen nagyon gyors az animáció.
FForm.Refresh;
Sleep(10);
inc(bx, FButtonWidth);
inc(i);
end;
Végül generálunk egy OnPopup eseményt.
if Assigned(FOnPopup) then FOnPopup(self);
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 250. oldal
Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!
|