Difference between revisions of "Extending the IDE/ru"
Line 198: | Line 198: | ||
{ TFileDescText } | { TFileDescText } | ||
− | + | TFileDescMyText = class(TProjectFileDescriptor) | |
public | public | ||
constructor Create; override; | constructor Create; override; | ||
Line 205: | Line 205: | ||
end; | end; | ||
... | ... | ||
− | |||
− | constructor | + | procedure Register; |
+ | |||
+ | implementation | ||
+ | |||
+ | procedure Register; | ||
+ | begin | ||
+ | RegisterProjectFileDescriptor(TFileDescMyText.Create,FileDescGroupName); | ||
+ | end; | ||
+ | |||
+ | { TFileDescMyText } | ||
+ | |||
+ | constructor TFileDescMyText.Create; | ||
begin | begin | ||
inherited Create; | inherited Create; | ||
− | Name:= | + | Name:='MyText'; // do not translate this |
DefaultFilename:='text.txt'; | DefaultFilename:='text.txt'; | ||
AddToProject:=false; | AddToProject:=false; | ||
Line 217: | Line 227: | ||
function TFileDescText.GetLocalizedName: string; | function TFileDescText.GetLocalizedName: string; | ||
begin | begin | ||
− | Result:='Text'; | + | Result:='My Text'; // replace this with a resourcestring |
end; | end; | ||
function TFileDescText.GetLocalizedDescription: string; | function TFileDescText.GetLocalizedDescription: string; | ||
begin | begin | ||
− | Result:= | + | Result:='An empty text file'; |
end; | end; | ||
</Delphi> | </Delphi> |
Revision as of 11:01, 4 December 2010
│
Deutsch (de) │
English (en) │
español (es) │
français (fr) │
日本語 (ja) │
русский (ru) │
slovenčina (sk) │
中文(中国大陆) (zh_CN) │
Расширения среды разработки (IDE)
Обзор
Среда разработки (IDE) поддерживает несколько типов плагинов:
- Компоненты (Components)
- Это элементы палитры компонентов. Например, TButton может быть использован для создания кнопок.
- Редакторы компонентов (Component Editors)
- Редакторы компонентов используются когда вы выполняете двойной клик на компоненте в дизайнере формы или добавляете несколько новых пунктов в всплывающее меню дизайнера, когда вы нажимаете правую кнопку мыши в дизайнере формы.
- Редакторы свойств (Property Editors)
- Эти редакторы используются в инспекторе объектов.
- Эксперты (Experts)
- Все прочие плагины.
Существует две возможности добавить собственный плагин к среде разработке Lazarus:
- Написать пакет, установить его и зарегистрировать ваш плагин при помощи процедуры 'Register'.
- Дополнить код Lazarus и выслать вашу разницу SVN в список рассылки Lazarus.
Написание компонентов
Вы можете создавать новые компоненты при помощи редактора пакетов. Например: Создать или открыть пакет, нажать кнопку Добавить (Add), выбрать закладку Новый компонент (New Component), заполнить поля: Тип предка (Ancestor Type) = TButton, Новое имя класса (New class name) = TMyButton, Страница палитры (palette page) = Misc, Имя файла модуля (Unit file name) = mybutton.pas (этот файл будет создан), Имя модуля (unit name) MyButton и нажать кнопку ok.
Создание новому компоненту иконки для палитры компонентов
Например, необходимо создать иконмку для компонента TMyButton. Создаём графический файл форматов .bmp, .xpm или .png с таким же именем, что и имя класса компонента. Например tmybutton.png и сохраняем в каталоге и исходниками пакета. Картинка может быть создана любой графической программой (например gimp) и должна быть не больше чем 24x24 точки. После этого конвертируем картинку в файл ресурса .lrs при помощи инструмента lazres, который можно найти в каталоге lazarus/tools:
~/lazarus/tools/lazres mybutton.lrs tmybutton.png
Эта операция создаст файл, который нужно будет включить в секцию инициализации вашего модуля mybutton.pas:
initialization {$I mybutton.lrs}
Установите пакет.
Написание редактора компонента
ToDo Подсказка: смотри файл componenteditors.pas для примера
Написание редактора свойств
ToDo Hint: смотри файл propedits.pp for для примера
Регистрация обработчика событий
Существует некоторое количество событий в среде разработки (IDE), для который плагины могут добавлять свои собственные обработчики.
События дизайнера (Designer events)
В модуле propedits.pp имеется объект "GlobalDesignHook", который поддерживает несколько событий для дизайна. Каждое событие вызывает список обработчиков. Обработчики по умолчанию добавлены самой средой разработки (IDE). Вы можете добавить свои собственные обработчики при помощи методов AddHandlerXXX и RemoveHandlerXXX. Они будут вызваны прежде чем обработчики по умолчанию среды.
Примеры:
Добавление ваших обработчиков (это обычно производится в конструкторе вашего объекта): GlobalDesignHook.AddHandlerComponentAdded(@YourOnComponentAdded);
Удаление вашего обработчика: GlobalDesignHook.RemoveHandlerComponentAdded(@YourOnComponentAdded);
Вы можете удалить все обработчики сразу. Например, это будет хорошей идеей добавить следующую строку в деструктор вашего объекта: GlobalDesignHook.RemoveAllHandlersForObject(Self);
Обработчики событий объекта GlobalDesignHook:
// lookup root ChangeLookupRoot Вызывается, когда "LookupRoot" изменяется. "LookupRoot" - это объект владелец текущего выбранного компонента. Обычно это TForm.
// methods CreateMethod GetMethodName GetMethods MethodExists RenameMethod ShowMethod MethodFromAncestor ChainCall
// components GetComponent GetComponentName GetComponentNames GetRootClassName ComponentRenamed Вызывается, когда компонент был переименован ComponentAdded Вызывается когда новый компонент добавляется в LookupRoot ComponentDeleting Вызывается перед очисткой компонента. DeleteComponent Вызывается средой разработки (IDE) для того, чтобы удалить компонент. GetSelectedComponents Возвращает текущее выделение компонентов.
// persistent objects GetObject GetObjectName GetObjectNames
// modifing Modified Revert RefreshPropertyValues
События проекта (Project events)
Эти события определены в модуле LazIDEIntf.
LazarusIDE.AddHandlerOnProjectClose LazarusIDE.AddHandlerOnProjectOpened LazarusIDE.AddHandlerOnSavedAll LazarusIDE.AddHandlerOnSavingAll
Текущий проект (Current Project)
Текущий проект можно получить через LazarusIDE.ActiveProject. (модуль LazIDEIntf)
Все модули текущего проекта
Чтобы перебрать все паскалевские модули текущего проекта в среде разработки (IDE) вы можете использовать следующий пример:
<Delphi> uses LCLProc, FileUtil, LazIDEIntf, ProjectIntf;
procedure ListProjectUnits; var
LazProject: TLazProject; i: Integer; LazFile: TLazProjectFile;
begin
LazProject:=LazarusIDE.ActiveProject; if LazProject<>nil then for i:=0 to LazProject.FileCount-1 do begin LazFile:=LazProject.Files[i]; if LazFile.IsPartOfProject and FilenameIsPascalUnit(LazFile.Filename) then debugln(LazFile.Filename); end;
end; </Delphi>
Служебные файлы .lpr, .lpi и .lps проекта
<Delphi> uses LCLProc, FileUtil, ProjectIntf, LazIDEIntf; var
LazProject: TLazProject;
begin
LazProject:=LazarusIDE.ActiveProject; // every project has a .lpi file: DebugLn(['Project lpi file: ',LazProject.ProjectInfoFile]);
// if the project session information is stored in a separate .lps file: if LazProject.SessionStorage<>pssNone then DebugLn(['Project lps file: ',LazProject.ProjectSessionFile]);
// If the project has a .lpr file it is the main source file: if (LazProject.MainFile<>nil) and (CompareFileExt(LazProject.MainFile.Filename,'lpr')=0) then DebugLn(['Project has lpr file: ',LazProject.MainFile.Filename]);
end; </Delphi>
Исполняемый файл / целевой файл проекта
Существует макро $(TargetFile), которым могут воспользоваться пути и врешние инструменты. Вы можете так же запросить этот макрос в коде:
<Delphi> uses MacroIntf;
function MyGetProjectTargetFile: string; begin
Result:='$(TargetFile)'; if not IDEMacros.SubstituteMacros(Result) then raise Exception.Create('unable to retrieve target file of project');
end; </Delphi>
Добавление ваших собственных типов файлов
Вы можете добавлять свои собственный пункты в диалог 'Файл/Создать ...':
- Смотрите модуль ProjectIntf пакета IDEIntf.
- Выберите базовый класс TFileDescPascalUnit для обычных модулей или TFileDescPascalUnitWithResource для новый модулей форм/модулей данных.
Добавление нового типа файла
Этот пример из модуля ide/mainintf.pas регистрирует простой текстовый файл:
<Delphi> uses ProjectIntf; ...
{ TFileDescText }
TFileDescMyText = class(TProjectFileDescriptor) public constructor Create; override; function GetLocalizedName: string; override; function GetLocalizedDescription: string; override; end;
...
procedure Register;
implementation
procedure Register; begin
RegisterProjectFileDescriptor(TFileDescMyText.Create,FileDescGroupName);
end;
{ TFileDescMyText }
constructor TFileDescMyText.Create; begin
inherited Create; Name:='MyText'; // do not translate this DefaultFilename:='text.txt'; AddToProject:=false;
end;
function TFileDescText.GetLocalizedName: string; begin
Result:='My Text'; // replace this with a resourcestring
end;
function TFileDescText.GetLocalizedDescription: string; begin
Result:='An empty text file';
end; </Delphi>
Add a new form type
This example is from the ide/mainintf.pas and registers the normal form:
<Delphi> uses ProjectIntf;
...
TFileDescPascalUnitWithForm = class(TFileDescPascalUnitWithResource) public constructor Create; override; function GetInterfaceUsesSection: string; override; function GetLocalizedName: string; override; function GetLocalizedDescription: string; override; end;
...
{ TFileDescPascalUnitWithForm }
constructor TFileDescPascalUnitWithForm.Create; begin
inherited Create; Name:=FileDescNameLCLForm; ResourceClass:=TForm; UseCreateFormStatements:=true;
end;
function TFileDescPascalUnitWithForm.GetInterfaceUsesSection: string; begin
Result:='Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs';
end;
function TFileDescPascalUnitWithForm.GetLocalizedName: string; begin
Result:='Form';
end;
function TFileDescPascalUnitWithForm.GetLocalizedDescription: string; begin
Result:=lisNewDlgCreateANewUnitWithALCLForm;
end; </Delphi>
CodeTools в среде разработки (IDE)
Прежде чем использовать codetools вам необходимо сохранить ваши текущие изменения в редакторе кода в буферах codetool:
<Delphi> uses LazIDEIntf; ...
// save changes in source editor to codetools LazarusIDE.SaveSourceEditorChangesToCodeCache(-1); // -1: commit all source editors
</Delphi>
Добавление директивы ресурсов в файл
Этот пример добавляет {$R example.res} в паскалевский модуль:
<Delphi> procedure AddResourceDirectiveToPascalSource(const Filename: string); var
ExpandedFilename: String; CodeBuf: TCodeBuffer;
begin
// make sure the filename is trimmed and contains a full path ExpandedFilename:=CleanAndExpandFilename(Filename); // save changes in source editor to codetools LazarusIDE.SaveSourceEditorChangesToCodeCache(-1);
// load the file CodeBuf:=CodeToolBoss.LoadFile(ExpandedFilename,true,false);
// add the resource directive if not CodeToolBoss.AddResourceDirective(CodeBuf,'example.res') then LazarusIDE.DoJumpToCodeToolBossError;
end; </Delphi>
Утилиты codetools так же предоставляют функции вроде FindResourceDirective и RemoveDirective.
Добавление помощи к исходникам
Сначала создаём THelpDatabase:
HelpDB:=TFPDocHTMLHelpDatabase( HelpDatabases.CreateHelpDatabase('ANameOfYourChoiceForTheDatabase', TFPDocHTMLHelpDatabase,true)); HelpDB.DefaultBaseURL:='http://your.help.org/';
FPDocNode:=THelpNode.CreateURL(HelpDB, 'Package1 - A new package', 'file://index.html'); HelpDB.TOCNode:=THelpNode.Create(HelpDB,FPDocNode);// once as TOC DirectoryItem:=THelpDBISourceDirectory.Create(FPDocNode,'$(PkgDir)/lcl', '*.pp;*.pas',false);// and once as normal page HelpDB.RegisterItem(DirectoryItem);