Sign in Join
Wiki copytemporary

Revision 2 of 4, by WikiArchive on 11-4-2026. The page as it is now.

Extending the IDE/sk

Contents

Rozširovanie IDE

Úvod

IDE podporuje niekoľko typov pluginov:

Komponenty Sú to položky Palety komponentov. Napríklad TButton môžete použiť na vytváranie tlačidiel.

Editory komponentov Tieto sú použité pri dvojkliku na komponent v návrhu alebo pridaním niektorých ďalších položiek do kontextového menu návrhu, ktoré vyvoláte pravým kliknutím na komponentu.

Editory vlastností Tieto sú použité riadkami v Inšpektorovi objektov (Object Inspector).

Experti Toto sú všetky ostatné typy.

Existujú dva spôsoby, ako pridať svoj vlastný plugin do IDE Lazarus:

  1. Napíšte balíček, nainštalujte ho a zaregistrujte svoj plugin v procedúre 'Register' jednotky.
  2. Rozšírte kód Lazarus a pošlite svoj CVS rozdiely do maillistu Lazarus.

Písanie komponentov

Vytvorte nový komponent pomocou Editora balíčkov.

Editory komponentov

Editory komponentov poskytované s Lazarus sú definované v jednotke componenteditors.pas. Editor komponentu je plugin použitý vývojárom na pridanie špeciálnych funkcií pre triedy komponentov.

Editor komponenty je vytvorený pre každý komponent, ktorý je vybratý v návrhu formulára a je založený na type komponentu (viz GetComponentEditor a RegisterComponentEditor). Pri dvojkliku na komponent je volaná metóda Edit. Pri vyvolaní kontextového menu komponentu, sú volané metódy GetVerbCount a GetVerb , ktoré vybudujú položky menu. Ak je niektorá položka vybratá, je volaná metóda ExecuteVerb. Metóda Paste je volaná vždy keď je komponent vložený do schránky.

Editor komponentu potrebujete vytvoriť len ak chcete pridať položku/y do kontextového menu, zmeniť predvolené správanie sa pri dvojkliku na komponent alebo pridať rozšírený formát schránky.

Predvolený editor komponentu (TDefaultEditor) implementuje metódu Edit na vyhľadávanie vlastností komponentu a generovanie (alebo navigádiu do) udalostí OnCreate , OnChanged alebo OnClick (ktorú nájde prvú). Vždy keď Editor komponentu modifikuje komponent, musí volať Designer.Modified na informovanie návrhára, že formulár bol modifikovaný. (Or else the user can not save the changes).

Všetky Editory komponentov sú odvodené od virtuálnej abstraktnej triedy TBaseComponentEditor.

Triedy Editorov komponentov

TDefaultComponentEditor Editor, ktorý poskytuje predvolené správanie pre dvojkliknutie, ktoré opakovane prechádza vlastnosti, hľadajúc najvhodnejšiu metódu vlastnosti na editovanie. TComponentEditor Táto trieda poskytuje základnú implementáciu pre rozhranie IComponentEditor. Nie je podmienkou odvodiť váš Editor vlastností od tejto triedy. IDE vyžaduje len dediť od TBaseComponentEditor a implementovať IComponentEditor, táto trieda pomáha pri implementácii triedy, ktorá vyhovuje týmto podmienkam. TNotebookComponentEditor Predvolený editor komponentu pre TCustomNotebook. TPageComponentEditor Predvolený editor komponentu pre TCustomPage. TStringGridComponentEditor Predvolený editor komponentu pre TStringGrid. TToolBarComponentEditor Predvolený editor komponentu pre TToolBar. TFileDialogComponentEditor Predvolený editor komponentu pre TFileDialog.

Metódy k predefinovaniu

Na zmenu správania štandartného Editora vlastností môžete predefinovať tieto metódy:

Create(AComponent, ADesigner) Konštruktor triedy je volaný na vytvorenie Editora komponentu. AComponent je komponent, ktorý má byť editovaný v editore. ADesigner je rozhranie pre nájdenie prvku a vytvorenie metód (často nie je použitý). Ak Editor komponentu akokoľvek modifikuje komponent, musí volať ADesigner.Modified. Edit Metóda je volaná pri dvojkliku na komponent. Editor komponenty môže vyvolať v tejto metóde napríkald vyvolať dialóg alebo nejaký typ návrhového experta. Ak je GetVerbCount väčší ako nula, Edit spustí obsluhu prvej položky (ExecuteVerb(0)). ExecuteVerb(Index) Je volaná vybratím položky kontextového menu, zvolená položka je udávaná pomocou Index. Jej správanie je určené Editorom komponentu. GetVerb Editor komponentu musí vrátiť reťazec, ktorý bude zobrazený v kontextovom menu. Editor komponentu je zodpovedný za vhodné umiestnenie znaku & a znakov '...'. GetVerbCount Počet platných indexov pre GetVerb a ExecuteVerb. Index začína nulou (tj. 0..GetVerbCount - 1). PrepareItem Pri vytváraní kontextového menu je pre každú položku volaná PrepareItem. Editor komponentu môže vhodne prispôsobovať položky menu, vrátane pridávania podpoložiek. Ak niektorú položku nechcete zobraziť, neuvoľňujte ju, jednoducho nastavte vlastnosť Visible na False. Copy Je volaná pri kopírovaní komponentu do schránky. Aj obrázok komponentu je vložený do schránky. Poskytuje možnosť Editoru komponentu vložiť iný typ formátu, ktorý je ignorovaný v Designer, ale môže byť podporovaný inou aplikáciou. IsInInlined Určuje či je komponent v Designer, ktorý ho vlastní. V podstate, komponenty nemôžu byť pridané do inštancie Frame (collections are fine though) tak táto funkcia určuje, či aktuálne vybratý komponent je nvútri inštancie Frame alebo nie. GetComponent Vracia editovaný komponent. GetDesigner Vracia aktuálny Designer formulára vlastniaceho komponent.

Registrácia Editora komponentu

Aby IDE vedelo, ktorý Editor komponentu má použiť, je nutné ho registrovať. Pre toto je v jednotke componenteditors.pas definovaný procedurálny typ:

pascal
type
      TRegisterComponentEditorProc 
        = procedure (ComponentClass: TComponentClass; ComponentEditor: TComponentEditorClass);
    var
      RegisterComponentEditorProc: TRegisterComponentEditorProc;

a jedna procedúra a jedna funkcia:

pascal
procedure RegisterComponentEditor(ComponentClass: TComponentClass; ComponentEditor: TComponentEditorClass);
     function GetComponentEditor(Component: TComponent; const Designer: TComponentEditorDesigner): TBaseComponentEditor;

Registráciu Editora komponentu urobíte jednoducho volaním funkcie RegisterComponentEditor, pričom do ComponentClass zadáte triedu komponentu a do ComponentEditor zadáte triedu Editora komponentu, napr.:

pascal
RegisterComponentEditor(TCustomNotebook, TNotebookComponentEditor);

Čím je zaregistrovaný Editor kompentu TNotebookComponentEditor pre komponenty typu TCustomNotebook.

Editory vlastností

Editory vlastností sú používané v Object Inspectore, pre editáciu jednotlivých vlastností. Sú vlastne rozhraním medzi riadkymi Inšpektora Objektov a vlastnosťou v RTTI. V jednotke propedits.pp je definovaných niekoľko základných Editorov vlastností, ktorých základom je TPropertyEditor.

Trieda TPropertyEditor

Edituje vlastnosť komponentu alebo zoznamu komponentov, vybratú v Inšpektore objektov. Príslušný Editor vlastnosti je vytvorený v závislosti na type editovanej vlastnosti, ktorý je určený registrácii Editora vlastností pomocou RegisterPropertyEditor. Inšpektor objektov používa TPropertyEditor pre všetky modifikácie vlastnosti. GetName a GetValue sú volané na zobrazenie mena a hodnoty vlastnosti. SetValue je volaná vždy, keď užívateľ požaduje zmeniť hodnotu vlastnosti. Edit je volaná keď užívateľ dvojklikne na vlastnosť v Inšpektore objektov. GetValues je volaná pri zobrazení rozbaľovacieho zoznamu. GetProperties pri rozbalení vlastnosti pre zobrazenie pod-vlastností. AllEqual je volané na určenie, či bude zobrazená hodnota vlastnosti prei výbere viac ako jedného komponentu.

Nasledujúce metódy môžu byť predefinované na zmenu správania Editora vlastnosti:

Activate Je volaná keď sa vlastnosť v Inšpektore objektov stáva vybratou. Je užitočná na povolenie určitých atribútov vlastnosti určených len keď je vlastnosť vybratá v Inšpektore objektov. Len paSubProperties a paMultiSelect, vrátené z GetAttributes, je vyžadované pred volaním tejto metódy. Deactivate Je volaná, keď vlastnosť v Inšpektore objektov prestáva byť vybratá. AllEqual Je volaná, keď je vybratý viac ako jeden komponent. Ak táto metóda vracia True, je volaná GetValue, inak je v Inšpektore objektov zobrazené prázdne políčko. Je volaná, len ak GetAttributes vracia paMultiSelect. AutoFill Je volaná na určenie či hodnoty vrátené pomocou GetValues môžu byť prírastkovo vybraté v Inšpektore objektov. Je volaná len keď GetAttributes vracia paValueList. Edit Je volaná pri stlačení tlačítka '...' alebo dvojkliku na vlastnosť. Môže, napríklad, vyvolať dialóg na editovanie komponentu v nejakom výstižnejšom štýle ako je textový (napr. vlastnosť Font). GetAttributes Vracia informáciu, ktorú Inšpektor objektov používa na zobrazenie príslušných nástrojov. GetAttributes vracia množinu typu TPropertyAttributes:

GetComponent Vracia Index-tý komponent, ktorý je editovaný Editorom vlastností. Je použitá na získanie komponentu. Editor vlastností môže odkazovať na viac komponentov len ak GetAttributes vracia paMultiSelect. GetEditLimit Vracia počet znakov, ktoré môže užívateľ zadať ako hodnotu. Príslušný editor Inšpektora objektov bude potrebovať obmedzenie pre svoj text nastavený na vrátenú hodnotu. Predvolený limit je 255. GetName Vracia meno vlastnosti. Predvolená hodnota je získaná z typovej informácie so všetkými podtržítkami '_' nahradenými medzerami. Táto metóda môže byť predefinovaná ak meno vlastnosti nie je menom, ktoré sa má objaviť v Inšpektore objektov. GetProperties Môže byť prepísaná na volanie PropertyProc pre každú sub-vlastnosť (alebo vnorenú vlastnosť) editovanej vlastnosti a poslaním nového TPropertyEdtior pre každú sub-vlastnosť. Predvolene nie je PropertyProc volaná a nie sú predpokladané sub-vlastnosti. TClassPropertyEditor pošle nový Editor vlastnosti pre každú publikovanú vlastnosť triedy. TSetPropertyEditor posiela nový editor pre každý prvok množiny. GetPropType Vracia ukazovateľ typovej informácie editovanej vlastnosti. GetValue Vracia reťazcovú hodnotu vlasntosti. Predvolene vracia '(unknown)'. Musí byť prepísaná, aby vracala príslušnú hodnotu. GetValues Je volaná keď GetAttributes vrátila paValueList. Musí volať Proc pre každú hodnotu, ktorá je akceptovateľná pre túto vlastnosť. TEnumPropertyEditor budeposielať každý vymenovaný prvok. Initialize Je volaná po vytvorení Editora vlastnosti, ale pred jeho prvým použitím. Veľakrát sú Editory vlastností vytvorené a pretože nemajú spoločnú vlastnosť vo výbere, sú vytvorené zbytočne. Initialize je volaná po určení, že Editor vlastností má byť použitý Inšpektorom objektov a nie zbytočne. SetValue(Value) Je volaná na nastavenie hodnoty vlastnosti. Editor vlastnosti nusí byť schopný preložiť reťazec a volať jednu z metód SetXxxValue. Ak reťazec nemá správny formát alebo má nepovolenú hodnotu, Editor vlastnosti musí generovať výnimku popisujúcu problém. SetValue môže ignorovať všetky zmeny a dovoliť všetky úpravy vlastnosti urobené pomocou metódy Edit (napr. vlastnosť Picture). ListMeasureWidth(Value,Canvas,AWidth) Je volaná počas výpočtu šírky rozbaľovacieho zoznamu. ListMeasureHeight(Value,Canvas,AHeight) Je volaná počas výpočtu výšky položky/hodnoty rozbaľovacieho zoznamu. Je veľmi podobná OnMeasureItem triedy TListBox, len s inými parametrami. ListDrawValue(Value,Canvas,Rect,Selected) Je volaná počas poskytovania položky/hodnoty rozbaľovacieho zoznamu. Je veľmi podobná OnDrawItem triedy TListBox, len s inými parametrami. PropMeasureHeight(Value,Canvas,AHeight) Je volaná počas výpočtu výšky položky/vlastnosti riadku Inšpektora objektov. Je veľmi podobná OnMeasureItem triedy TListBox, len s inými parametrami. PropDrawName(Canvas,Rect,Selected) Je volaná počas poskytovania stĺpca mena zoznamu vlastností. Je veľmi podobná OnDrawItem triedy TListBox, len s inými parametrami. PropDrawValue(Canvas,Rect,Selected) Je volaná počas poskytovania stĺpca hodnôt zoznamu vlastností. Je veľmi podobná PropDrawName. Ak sú zvolené viaceré položky a ich hodnoty sú rôzne, táto procedúra posiela prázdnu hodnotu.

Vlastnosti a metódy užitočné pri vytváraní nových tried TPropertyEditor:

property Name Vracia meno vlastnosti vrátené z GetName. property PrivateEditory TKonfiguračný adresár Lazarus. Ak Editor vlastnosti potrebuje pomocné alebo stavové súbory (šablóny, príklady, atď.) môžu byť uložené tu. property Value Aktuálny hodnota, v reťazcovom formáte, vlastnosti vrátená z GetValue. Modified Volaná na indikovanie, že hodnota vlastnosti bola zmenená. Je volaná automaticky z metódy SetXxxValue, ak voláte metódu SetXxxValue priamo, musíte volať aj Modified. GetXxxValue Vracia hodnotu prvej vlastnosti vo vlastnosti Properties. Volajte príslušnú metódu GetXxxValue na získanie hodnoty. SetXxxValue Nastavuje hodnotu všetkých vlastností vo vlastnosti Properties. Volajte príslušné metódy SetXxxxValue na nastavenie hodnoty. GetVisualValue Funkcia vráti zobraziteľnú hodnotu vlastnosti. Ak je vybratá len jedna položka alebo všetky položky viacnásobného výberu majú rovnakú hodnotu, potom táto funkcia vráti aktuálnu hodnotu vlastnosti. Inak vracia prázdny reťazec.

Registrovanie obslúh udalostí

V IDE je niekoľko udalostí, pre ktoré môže plugin pridať svoju vlastnú obsluhu. V súbore propedits.pp sa nachádza objekt GlobalDesignHook", ktorý obsluhuje neikoľko udalostí pre navrhovanie. Každá udalosť volá zoznam obslúh. Predvolené obsluhy sú pridané samotným IDE. Svoje vlastné obsluhy môžete pridať pomocou metód AddHandlerXXX a RemoveHandlerXXX. Tieto budú volané pred predvolenými obsluhami.

Príklady:

pascal
Pridanie svojej obsluhy (toto by mal vykonať konštruktor vášho objektu):
       GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);
     Odstránenie vašej obsluhy:
       GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);
     Môžete odstrániť všetky obsluhy naraz. Napríklad, je vhodé pridať do deštruktora objektu tentor riadok:
       GlobalDesignHook.RemoveAllHandlersForObject(Self);

Obsluhy GlobalDesignHook:

pascal
// lookup root
     ChangeLookupRoot
       Je volaná pri zmene "LookupRoot". "LookupRoot" je vlastník objektu aktuálne vybratého komponentu. Zvy�ajne to je TForm.
     // methods
     CreateMethod
     GetMethodName
     GetMethods
     MethodExists
     RenameMethod
     ShowMethod
     MethodFromAncestor
     ChainCall
     // components
     GetComponent
     GetComponentName
     GetComponentNames
     GetRootClassName
     ComponentRenamed
       Volaná pri premenovaní komponentu
     ComponentAdded
       Volaná pri priradní komponentu do LookupRoot
     ComponentDeleting
       VOlaná pred uvoľnením komponentu.
     DeleteComponent
       VOlaná pri odstráenní komponentu pomocou IDE.
     GetSelectedComponents
       Vracia aktuálny výber komponentov.
     // persistent objects
     GetObject
     GetObjectName
     GetObjectNames
     // modifing
     Modified
     Revert
     RefreshPropertyValues

Spolupracovníci a zmeny

This page has been converted from the epikwiki version.

This document was authored by Mattias Gaertner Initial import and formatted for Lazarus-CCR - VlxAdmin 9/26/2003


From the Free Pascal wiki, page "Extending the IDE/sk", as the Internet Archive kept it on 2022-09-25. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.