HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Saját akció osztály létrehozása Delphi-ben


Példaprogram letöltése

8424 bájt

A Delphi-ben találhatók ún. standard akciók, melyek segítségével akár egy egyszerűbb szövegszerkesztőt is létrehozhatunk anélkül, hogy egyetlen programsort is írtunk volna. Ez annak köszönhető, hogy az akcióban megtalálható a szükséges műveletek elvégzéséhez tartozó programrész, így elég az akciót például egy eszköztár gombhoz rendelni a felhasználáshoz. Ebben a példában készítünk mi is egy ilyen akciót, amely a szövegek bevitelére alkalmas komponenseknél használható fel, előre elkészített szövegek beszúrására. Ha például az aktív control egy Memo, akkor elég rákattintani arra az eszköztár gombra, amelyikhez az akciót rendeltük, és a megjelenő menüből kiválaszthatjuk az aktuális pozícióba beszúrandó szöveget.

A mellékelt példaprogram megnyitása előtt az EditInsertText.pas.-ban lévő akció osztályt telepítenie kell a Delphi alá. Ehhez válassza a Component - Install Component menüpontot.
Az új osztályt a TEditAction osztályból származtatjuk. Azért ezt használjuk, mert ez már alapban tartalmazza azt a lehetőséget, hogy az akciót egy TCustomEdit osztályból származó komponenshez rendeljük, hasonlóan a TEditCut, TEditCopy, stb. akciókhoz. Ebben felülírjuk az ExecuteTarget eljárást, ami akkor fut le, amikor az akciót futtatjuk. Ennek paraméterében megkapjuk azt az objektumot, amire az akciót futtatni kell (pl. egy Memo komponenst). Ezt az objektumot eltároljuk az FTargetControl globális változóban, majd az AddMenuItems eljárással létrehozzuk a menüt, és meg is jelenítjük. A menü pozícióját megadhatjuk a PopupX és PopupY property-kben. Ha valamelyikben 0-nál kisebb értéket adunk meg, akkor ott az egér aktuális pozícióját használjuk fel:
var
  p: TPoint;
  x, y: integer;
  ...
  if FTexts.Count>0 then begin
    FTargetControl:=GetControl(Target);
    AddMenuItems;
    GetCursorPos(p);
    if FPopupX<0 then x:=p.x else x:=FPopupX;
    if FPopupY<0 then y:=p.y else y:=FPopupY; 
    FPopupMenu.Popup(x, y);
  end;
A szövegeket a Texts property-ben adhatjuk meg. Ez a property TInsertTextItems típusú, amely a TOwnedCollection osztályból származik, és TInsertTextItem típusú elemeket tartalmaz. Egy-egy elem egy beszúrható szöveget tartalmaz. A Title property-ben adhatjuk meg a szöveg címét, ez jelenik meg a menüben. A Text property-ben adhatjuk meg a szöveget, ami akár több soros is lehet.
A menüt az AddMenuItems eljárással hozzuk létre. Ebből először meghívjuk a RemoveMenuItems eljárást, ami törli a menü elemeit, majd a Texts property minden eleméhez létrehozunk egy-egy menüpontot. A menüpontok OnClick eseményéhez hozzárendeljük a DoMenuItemClick eljárást, a Tag property-ben pedig megadjuk az elem sorszámát (indexét). Amikor a felhasználó kiválaszt egy menüpontot, akkor lefut a DoMenuItemClick eljárás, amelyben a Tag property segítségével azonosítjuk, hogy melyik elemet kell beszúrni az FTargetControl változóban eltárolt komponens szövegébe. A beszúrandó szövegből töröljük az utolsó soremelés karaktereket (#13#10), különben az egy soros szövegek után is mindig beszúrná ezeket:
var
  s: string;
  ...
  s:=FTexts[(Sender as TMenuItem).Tag].FText.Text;
  if s<>'' then begin
    if Copy(s, Length(s)-1, 2)=#13#10 then Delete(s, Length(s)-1, 2);
    FTargetControl.SelText:=s;
  end;
Mivel az új akció nem egy komponens, ezért a Register eljárásban nem a RegisterComponents, hanem a RegisterActions eljárással kell regisztrálnunk.
RegisterActions('Edit', [TEditInsertText], nil);
Az eljárás leírása a következő:
RegisterActions
Osztály:
procedure RegisterActions(
const CategoryName: string;
const AClasses: array of TBasicActionClass;
Resource: TComponentClass
);
Ezzel az eljárással tudunk új standard akciókat regisztrálni.
Paraméterek
const CategoryName: string
Az akció kategóriájának megnevezése (pl. „Edit”). Megadhatunk még nem létező kategóriákat is.
const AClasses: array of TBasicActionClass
A regisztrálni kívánt akció osztályok egy tömb paraméterben megadva.
Resource: TComponentClass
Ha az akciónak alapértelmezett értékeket akarunk átadni, akkor ebben megadhatunk egy TDataModule-ból származtatott objektumot. Ha nem akarunk alapértelmezett értékeket megadni, akkor adjunk meg nil-t.

Cikksorozat

#IDKategóriaCikk címeSorozat
1018DelphiVonalkód készítő komponens1. rész
1028DelphiVonalkód nyomtatása a QuickReport-al2. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: Delphi Software Offline 2002 évkönyv 105. 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!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |