|
|
TToolBar megjelenítése egy TSpeedButton sarkára történő kattintáskor
2. rész
|
|
Példaprogram letöltése
8189 bájt
|
A CorelDraw, PhotoPaint vagy PhotoShop programok eszköztárain találhatók olyan gombok, amelyekre kattintva egy ToolBar jelenik meg. Cikkünk első részében a ToolBar-t készítettük el, most elkészítjük magát a gombot, ami az eszköztárt megjeleníti.
A mellékelt példaprogram megnyitása előtt a PopupButton.pas-ban lévő komponenst telepítenie kell a Delphi alá, valamint szükség lesz az előző héten bemutatott PopupToolbar komponensre is.
A komponens lényege az, hogy önálló gombként is használható legyen, de legyen egy property-je, amin keresztül egy PopupToolbar komponenst hozzá tudunk kapcsolni. Ha ezt megtesszük, akkor a gombnak kétféle üzemmódja lesz: egyszer megmarad a régi, tehát mint önálló gomb, másodszor pedig a gomb jobb alsó sarkában megjelenő kis nyílra kattintva megjeleníti a ToolBar-t.
Az új komponenst a TSpeedButton osztályból származtatjuk, és ezt egészítjük ki a szükséges változtatásokkal. Létrehozunk 3 új property-t. Az egyik természetesen egy PopupToolbar nevű property, amin keresztül megadhatjuk, hogy melyik ToolBar-t kell megjeleníteni. Az ArrowSize property a gomb sarkában megjelenő kis nyíl méretét határozza meg. Amikor a gombot lenyomják, és nem engedik fel, akkor egy idő múlva meg kell jeleníteni a ToolBar-t. Az Interval property a várakozás idejét adja meg.
A gomb tehát a következőképpen működik:
1. Ha a jobb alsó fekete nyílon kattintunk, akkor megjelenik a ToolBar;
2. Ha lenyomjuk a gombot, de nem engedjük fel azonnal, akkor egy bizonyos idő múlva meg kell jeleníteni a ToolBar-t;
3. Minden más esetben, ha kattintunk a gombon, akkor a gomb OnClick eseményét kell végrehajtani.
A ToolBar megjelenítését az OpenToolbar eljárás végzi el.
procedure TPopupButton.OpenToolbar;
var px, py:integer;
begin
Első lépésben ellenőrizni kell, hogy van-e a gombhoz kapcsolva PopupToolbar.
if Assigned(FPopupToolbar) then begin
Megnézzük, hogy a ToolBar függőlegesen, vagy vízszintesen jelenik-e meg, és ennek megfelelően állítjuk be a koordinátákat. Ha vízszintesen jelenik meg, akkor a gomb jobb széléhez, ha függőleges, akkor az alsó széléhez igazítjuk.
if FPopupToolbar.Orientation=poHorizontal then begin
px:=ClientOrigin.x+Width; py:=ClientOrigin.y;
end else begin
px:=ClientOrigin.x; py:=ClientOrigin.y+Height;
end;
Meghívjuk a PopupToolbar Popup metódusát a kiszámolt koordinátákkal.
FPopupToolbar.Popup(px, py);
end;
end;
A MouseDown eljárás akkor hajtódik végre, amikor valamelyik egérgombot lenyomták a komponensen.
procedure TPopupButton.MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
…
Ellenőrizzük, hogy a bal egérgombot nyomták-e le.
if Button=mbLeft then begin
Kiszámoljuk annak a területnek a koordinátáit, ahol a nyíl van. Ezt az ArrowRect változóban tároljuk.
with ArrowRect do begin
Left:=Width-FArrowSize*2-2;
Top:=Height-FArrowSize*2-3;
Right:=Width;
Bottom:=Height;
end;
Ellenőrizzük, hogy az egér koordinátái a nyíl területén belülre esnek-e. Ha igen, akkor meghívjuk az OpenToolbar eljárást, ami megjeleníti a ToolBar-t. Ha a gomb egy más területén kattintottak, akkor elindítjuk a Timer-t.
if (x>=ArrowRect.Left) and (x<=ArrowRect.Right) and
(y>=Arrowrect.Top) and (y<=ArrowRect.Bottom) then
begin
Application.ProcessMessages;
OpenToolbar;
end else begin;
FTimer.Enabled:=True; FMouseDown:=True;
end;
end;
end;
A Click metódus akkor hajtódik végre, amikor a bal egérgombbal kattintanak a gombon. Ekkor kikapcsoljuk a Timer-t, mivel az egérgombot felengedték, így ha még eddig nem jelent meg a ToolBar, akkor már nem is fogjuk megjeleníteni. Ha a ToolBar még nem lett megjelenítve, akkor meghívjuk az eredeti Click metódust, vagyis a gomb OnClick eseménye hajtódik végre.
procedure TPopupButton.Click;
var ok:boolean;
begin
FTimer.Enabled:=False;
if Assigned(FPopupToolbar) then begin
ok:=not FPopupToolbar.Visible;
end else ok:=true;
if ok then inherited Click;
end;
Amikor a komponenshez kapcsolunk egy PopupToolbar-t, akkor a gomb jobb alsó sarkában megjelenik egy kis fekete nyíl, ha viszont nincs ToolBar kapcsolva a gombhoz, akkor ezt nem kell megjeleníteni. A komponens kirajzolását a Paint eljárás végzi, ezért itt kell a kis nyilat is megrajzoltatnunk.
procedure TPopupButton.Paint;
…
Ellenőrizzük, hogy van-e ToolBar kapcsolva a gombhoz, és ha igen, akkor megrajzoljuk a nyilat az FArrowSize property-ben megadott méretben.
if Assigned(FPopupToolbar) then begin
i:=0; ax:=Width-4; ay:=height-5-FArrowSize div 2; ah:=1;
while i<FArrowSize do begin
if ah>1 then begin
Canvas.MoveTo(ax, ay); Canvas.LineTo(ax, ay+ah)
end else begin
Canvas.Pixels[ax, ay]:=clBlack;
end;
inc(ah, 2); dec(ax); dec(ay); inc(i);
end;
end;
end;
|
Könyv
Ez a cikk megtalálható ebben a könyvben:
Delphi Software Offline 2001 évkönyv 452. 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!
|