Sign in Join
Wiki copytemporary

Extending the IDE/ru: what changed

Revision 2 to 3. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-## Contents
2-
3- * 1 Расширение IDE
4- * 1.1 Обзор
5- * 1.2 Пакеты и зависимости Makefile
6- * 2 Пункты меню
7- * 2.1 Добавление пункта меню
8- * 3 Сочетания клавиш
9- * 4 Конфигурационные файлы
10- * 4.1 Загрузка/Сохранение настроек
11- * 5 Компоненты
12- * 5.1 Расширение существующих компонентов
13- * 5.2 Написание компонент
14- * 5.2.1 Предоставление новому компоненту иконки для палитры компонентов
15- * 5.2.2 Скрытие компонента в палитре компонентов
16- * 5.3 Написание редактора компонента
17- * 5.4 Написание редакторов свойств
18- * 5.4.1 Сокрытие свойства в инспекторе объектов
19- * 5.4.2 Поиск редактора свойств, используемого для свойства
20- * 6 Формы
21- * 7 Дизайнер
22- * 7.1 Написание дизайнера-посредника
23- * 7.2 Создание нового уникального имени компонента
24- * 7.3 Выбор компонента в конструкторе/инспекторе объектов
25- * 7.4 Получение файла модуля, дизайнера формы
26- * 7.5 Сохранение модуля, дизайнера формы
27- * 7.6 Сохранение формы дизайнера как кода Паскаль
28- * 8 Обработчики событий
29- * 8.1 События дизайнера
30- * 8.1.1 Примеры для событий дизайнера
31- * 8.1.1.1 Пример: когда [на родителя] помещается новый компонент, перемещать элемент управления в дочерний элемент
32- * 8.1.2 Отключение обработчика мыши в [режиме] дизайнера
33- * 8.2 Получение уведомлений при изменении дизайнера форм
34- * 8.3 События проекта
35- * 8.4 Другие события IDE
36- * 9 Проект
37- * 9.1 Текущий проект
38- * 9.2 Все модули текущего проекта
39- * 9.2.1 Все модули инспектора проекта
40- * 9.2.2 Все используемые модули проекта
41- * 9.3 Файлы .lpr, .lpi и .lps проекта
42- * 9.4 Имя исполняемого / целевого файла проекта
43- * 9.5 Добавление своего собственного типа проекта
44- * 9.6 Добавление своих собственных типов файлов
45- * 9.6.1 Добавление нового типа файла
46- * 9.6.2 Добавление нового типа формы
47- * 9.7 Сохранение пользовательских значений в [файлах] lpi/lps
48- * 10 Пакеты
49- * 10.1 Поиск во всех пакетах
50- * 10.2 Поиск в пакетах с [определенным] именем
51- * 10.3 Получение имени файла lpk установленного пакета
52- * 10.4 Установка пакетов
53- * 10.5 Открытие файла пакета (lpk)
54- * 10.6 Поиск пакета(-ов) модуля
55- * 11 Окна
56- * 11.1 Добавление нового закрепляемого окна IDE
57- * 11.1.1 Как зарегистрировать закрепляемое окно IDE
58- * 11.1.2 Отображение окна IDE
59- * 11.1.3 Заметки о IDEWindowCreators и SimpleLayoutStorage
60- * 12 CodeTools
61- * 12.1 Добавление директивы ресурса в файл
62- * 12.2 Получение путей поиска для модулей и включаемых файлов
63- * 13 Редактор исходного кода
64- * 13.1 Активный редактор исходного кода
65- * 14 SynEdit
66- * 14.1 Получение настроек для TSynEdit
67- * 14.2 Получение настроек для подсветки SynEdit
68- * 15 Справка
69- * 15.1 Добавление справки для исходников
70- * 15.2 Добавление строк в окно сообщений
71- * 16 Окно настроек IDE
72- * 16.1 Открытие параметров в определенном кадре
73- * 17 Прочее
74- * 17.1 Добавление макроса
75- * 17.2 Отладка IDE
76- * 17.3 См. также
77-
78-
79-
801# Расширение IDE
812
823## Обзор
834
84-Lazarus IDE поддерживает несколько типов плагинов:
5+Lazarus IDE поддерживает несколько типов плагинов:
856
86-Компоненты
87- это элементы, найденные в палитре компонентов. Например, TButton (находится на странице Standard) можно использовать для создания кнопок.
7+Компоненты
8+это элементы, найденные в палитре компонентов. Например, TButton (находится на странице Standard) можно использовать для создания кнопок.
889
89-Редакторы компонентов
90- при двойном щелчке по компоненту в Дизайнере вызывается редактор компонентов. Редактор компонента также может добавить дополнительный элемент во всплывающее меню Дизайнера (доступ к нему осуществляется по щелчку правой кнопкой мыши на компоненте в конструкторе).
10+Редакторы компонентов
11+при двойном щелчке по компоненту в Дизайнере вызывается редактор компонентов. Редактор компонента также может добавить дополнительный элемент во всплывающее меню Дизайнера (доступ к нему осуществляется по щелчку правой кнопкой мыши на компоненте в конструкторе).
9112
92-Редакторы свойств
93- Каждая строка в разделе сетки Инспектора объектов использует редактор свойств, чтобы разрешить установку или изменение значения этого свойства.
13+Редакторы свойств
14+Каждая строка в разделе сетки Инспектора объектов использует редактор свойств, чтобы разрешить установку или изменение значения этого свойства.
9415
95-Эксперты
96- Эксперты охватывают все другие типы плагинов. Они могут регистрировать новые пункты меню, регистрировать ярлыки или расширять другие функции IDE.
16+Эксперты
17+Эксперты охватывают все другие типы плагинов. Они могут регистрировать новые пункты меню, регистрировать ярлыки или расширять другие функции IDE.
9718
98-Есть два возможных способа добавить свои собственные плагины в IDE Lazarus:
19+Есть два возможных способа добавить свои собственные плагины в IDE Lazarus:
9920
100- 1. Напишите пакет, установите его и зарегистрируйте ваши плагины в процедуре 'Register' модуля.
101- 2. Расширьте код Lazarus и отправьте свой svn diff в список рассылки Lazarus.
21+1. Напишите пакет, установите его и зарегистрируйте ваши плагины в процедуре 'Register' модуля.
22+2. Расширьте код Lazarus и отправьте свой svn diff в список рассылки Lazarus.
10223
10324## Пакеты и зависимости Makefile
10425
105-Следующие шаги необходимы, если добавляются новые зависимости пакета.
26+Следующие шаги необходимы, если добавляются новые зависимости пакета.
10627
107- * Создание/Обновление Makefile для пакета через Package editor / More ... / Create Makefile.
108- * Исправление всех зависимостей. См. tools/updatemakefiles.lpi
28+- Создание/Обновление Makefile для пакета через Package editor / More ... / Create Makefile.
29+- Исправление всех зависимостей. См. tools/updatemakefiles.lpi
10930
11031# Пункты меню
11132
112-Вы можете добавлять новые пункты меню, скрывать или перемещать существующие и добавлять подменю, разделы. Для ваших собственных форм вы можете зарегистрировать TMainMenu/TPopupMenu, чтобы другие пакеты могли расширять вашу форму дальше. Модуль **MenuIntf** пакета IDEIntf содержит всю регистрацию для меню и множество стандартных пунктов меню самой IDE.
33+Вы можете добавлять новые пункты меню, скрывать или перемещать существующие и добавлять подменю, разделы. Для ваших собственных форм вы можете зарегистрировать TMainMenu/TPopupMenu, чтобы другие пакеты могли расширять вашу форму дальше. Модуль **MenuIntf** пакета IDEIntf содержит всю регистрацию для меню и множество стандартных пунктов меню самой IDE.
11334
11435## Добавление пункта меню
11536
116-Одиночный элемент меню, такой как [, например,] 'View Object Inspector', называется **TIDEMenuCommand**. Вы можете создать его с помощью **RegisterIDEMenuCommand** , который имеет две формы с большим количеством параметров:
117-```
37+Одиночный элемент меню, такой как \[, например,\] 'View Object Inspector', называется **TIDEMenuCommand**. Вы можете создать его с помощью **RegisterIDEMenuCommand**, который имеет две формы с большим количеством параметров:
38+
39+``` pascal
11840function RegisterIDEMenuCommand(Parent: TIDEMenuSection;
119- const Name, Caption: string;
120- const OnClickMethod: TNotifyEvent = nil;
121- const OnClickProc: TNotifyProcedure = nil;
122- const Command: TIDECommand = nil;
123- const ResourceName: String = ''
124- ): TIDEMenuCommand; overload;
125- function RegisterIDEMenuCommand(const Path, Name, Caption: string;
126- const OnClickMethod: TNotifyEvent = nil;
127- const OnClickProc: TNotifyProcedure = nil;
128- const Command: TIDECommand = nil;
129- const ResourceName: String = ''
130- ): TIDEMenuCommand; overload;
41+ const Name, Caption: string;
42+ const OnClickMethod: TNotifyEvent = nil;
43+ const OnClickProc: TNotifyProcedure = nil;
44+ const Command: TIDECommand = nil;
45+ const ResourceName: String = ''
46+ ): TIDEMenuCommand; overload;
47+function RegisterIDEMenuCommand(const Path, Name, Caption: string;
48+ const OnClickMethod: TNotifyEvent = nil;
49+ const OnClickProc: TNotifyProcedure = nil;
50+ const Command: TIDECommand = nil;
51+ const ResourceName: String = ''
52+ ): TIDEMenuCommand; overload;
13153```
13254
133-Разница между этими двумя [функциями] только в том, как вы указываете родительский раздел меню. Вы можете указать раздел меню прямо или косвенно через путь. Многие стандартные разделы можно найти в модуле _MenuIntf_. Например, раздел **mnuTools** , который является [пунктом] меню _Tools_ главной панели IDE. Он содержит раздел **itmSecondaryTools** , рекомендуемый для сторонних инструментов.
55+Разница между этими двумя \[функциями\] только в том, как вы указываете родительский раздел меню. Вы можете указать раздел меню прямо или косвенно через путь. Многие стандартные разделы можно найти в модуле *MenuIntf*. Например, раздел **mnuTools**, который является \[пунктом\] меню *Tools* главной панели IDE. Он содержит раздел **itmSecondaryTools**, рекомендуемый для сторонних инструментов.
13456
135-Следующий [код] регистрирует новую команду меню с именем 'MyTool', с заголовком 'Start my tool' и при нажатии выполняет процедуру _StartMyTool_ :
136-```
57+Следующий \[код\] регистрирует новую команду меню с именем 'MyTool', с заголовком 'Start my tool' и при нажатии выполняет процедуру *StartMyTool*:
58+
59+``` pascal
13760procedure StartMyTool;
138- begin
139- ... выполняется при нажатии на пункт меню ...
140- end;
141-
142- procedure Register;
143- begin
144- RegisterIDEMenuCommand(itmSecondaryTools, 'MyTool','Start my tool',nil,@StartMyTool);
145- end;
61+begin
62+ ... выполняется при нажатии на пункт меню ...
63+end;
64+
65+procedure Register;
66+begin
67+ RegisterIDEMenuCommand(itmSecondaryTools, 'MyTool','Start my tool',nil,@StartMyTool);
68+end;
14669```
14770
148-Если вы хотите вызвать метод вместо процедуры, используйте параметр **OnClickMethod**.
71+Если вы хотите вызвать метод вместо процедуры, используйте параметр **OnClickMethod**.
14972
150-Этот пункт меню не имеет сочетания клавиш. Если вы хотите [назначить ему] сочетание клавиш, вы должны создать **TIDECommand** и передать его в параметре **Command**. Например:
151-```
73+Этот пункт меню не имеет сочетания клавиш. Если вы хотите \[назначить ему\] сочетание клавиш, вы должны создать **TIDECommand** и передать его в параметре **Command**. Например:
74+
75+``` pascal
15276uses ... IDECommands, MenuIntf;
153- ...
154- var
155- Key: TIDEShortCut;
156- Cat: TIDECommandCategory;
157- CmdMyTool: TIDECommand;
158- begin
159- // регистрация сочетаний клавиш IDE и пункта меню
160- Key := IDEShortCut(VK_UNKNOWN,[],VK_UNKNOWN,[]);
161- Cat:=IDECommandList.FindCategoryByName(CommandCategoryToolMenuName);
162- CmdMyTool := RegisterIDECommand(Cat,'Start my tool', 'Starts my tool to do some stuff', Key, nil, @StartMyTool);
163- RegisterIDEMenuCommand(itmSecondaryTools, 'MyTool', 'Start my tool', nil, nil, CmdMyTool);
164- end;
77+...
78+var
79+ Key: TIDEShortCut;
80+ Cat: TIDECommandCategory;
81+ CmdMyTool: TIDECommand;
82+begin
83+ // регистрация сочетаний клавиш IDE и пункта меню
84+ Key := IDEShortCut(VK_UNKNOWN,[],VK_UNKNOWN,[]);
85+ Cat:=IDECommandList.FindCategoryByName(CommandCategoryToolMenuName);
86+ CmdMyTool := RegisterIDECommand(Cat,'Start my tool', 'Starts my tool to do some stuff', Key, nil, @StartMyTool);
87+ RegisterIDEMenuCommand(itmSecondaryTools, 'MyTool', 'Start my tool', nil, nil, CmdMyTool);
88+end;
16589```
16690
16791# Сочетания клавиш
16892
169-Все сочетания клавиш (ключи, которые вызывают какое-либо действие) зарегистрированы в IDECommandList. Вот пример того, как найти все команды, которые реагируют на клавиши `Ctrl`+`D` или две комбинации клавиш, начинающиеся с `Ctrl`+`D`:
170-```
93+Все сочетания клавиш (ключи, которые вызывают какое-либо действие) зарегистрированы в IDECommandList. Вот пример того, как найти все команды, которые реагируют на клавиши `Ctrl`+`D` или две комбинации клавиш, начинающиеся с `Ctrl`+`D`:
94+
95+``` pascal
17196uses
172- Classes, SysUtils, LCLProc, IDECommands;
173-
174- procedure ListCtrlD;
175- // список всех команд IDE с комбинациями клавиш <Ctrl>+<D>
176- var
177- i: integer;
178- Cmd: TIDECommand;
179- Commands: TFPList;
180- begin
181- Commands:=IDECommandList.FindCommandsByShortCut(IDEShortCut(VK_D,[],VK_UNKNOWN,[]));
182- try
183- for i:=0 to Commands.Count-1 do begin
184- Cmd:=TIDECommand(Commands[i]);
185- writeln('Cmd: ',Cmd.Name,
186- ' A=',dbgs(Cmd.ShortcutA.Shift1),'-',Cmd.ShortcutA.Key1,
187- ',',dbgs(Cmd.ShortcutA.Shift2),'-',Cmd.ShortcutA.Key2,
188- ' B=',dbgs(Cmd.ShortcutB.Shift1),'-',Cmd.ShortcutB.Key1,
189- ',',dbgs(Cmd.ShortcutB.Shift2),'-',Cmd.ShortcutB.Key2
190- );
191- end;
192- finally
193- Commands.Free;
194- end;
97+ Classes, SysUtils, LCLProc, IDECommands;
98+
99+procedure ListCtrlD;
100+// список всех команд IDE с комбинациями клавиш <Ctrl>+<D>
101+var
102+ i: integer;
103+ Cmd: TIDECommand;
104+ Commands: TFPList;
105+begin
106+ Commands:=IDECommandList.FindCommandsByShortCut(IDEShortCut(VK_D,[],VK_UNKNOWN,[]));
107+ try
108+ for i:=0 to Commands.Count-1 do begin
109+ Cmd:=TIDECommand(Commands[i]);
110+ writeln('Cmd: ',Cmd.Name,
111+ ' A=',dbgs(Cmd.ShortcutA.Shift1),'-',Cmd.ShortcutA.Key1,
112+ ',',dbgs(Cmd.ShortcutA.Shift2),'-',Cmd.ShortcutA.Key2,
113+ ' B=',dbgs(Cmd.ShortcutB.Shift1),'-',Cmd.ShortcutB.Key1,
114+ ',',dbgs(Cmd.ShortcutB.Shift2),'-',Cmd.ShortcutB.Key2
115+ );
195116 end;
117+ finally
118+ Commands.Free;
119+ end;
120+end;
196121```
197122
198123# Конфигурационные файлы
199124
200125## Загрузка/Сохранение настроек
201126
202-Все конфигурационные файлы IDE хранятся в одном каталоге в виде XML-файлов. Пакеты также могут добавлять свои собственные файлы туда. Каталог [[pcp|primary config path]] можно прочитать с помощью:
203-```
127+Все конфигурационные файлы IDE хранятся в одном каталоге в виде XML-файлов. Пакеты также могут добавлять свои собственные файлы туда. Каталог [[pcp|primary config path]] можно прочитать с помощью:
128+
129+``` pascal
204130uses LazIDEIntf;
205- ...
206- Directory := LazarusIDE.GetPrimaryConfigPath;
131+...
132+ Directory := LazarusIDE.GetPrimaryConfigPath;
207133```
208134
209-Пакеты могут создавать свои собственные файлы XML с помощью:
210-```
135+Пакеты могут создавать свои собственные файлы XML с помощью:
136+
137+``` pascal
211138uses
212- ..., LCLProc, BaseIDEIntf, LazConfigStorage;
213-
214- const
215- Version = 1;
216- var
217- Config: TConfigStorage;
218- SomeValue: String;
219- SomeInteger: Integer;
220- SomeBoolean: Boolean;
221- FileVersion: LongInt;
222- begin
223- SomeValue:='Default';
224- SomeInteger:=3;
225- SomeBoolean:=true;
226-
227- // сохранение настроек
228- try
229- Config:=GetIDEConfigStorage('mysettings.xml',false);
230- try
231- // сохраняем номер версии, чтобы будущие расширения могли обрабатывать старые файлы конфигурации
232- Config.SetDeleteValue('Path/To/The/Version',Version,0);
233- // сохраняем строковую переменную "SomeValue"
234- // если SomeValue имеет значение по умолчанию, запись не сохраняется,
235- // поэтому сохраняются только [значения,] отличающиеся от значения по умолчанию.
236- // Таким образом, xml остается коротким, и значения по умолчанию могут измениться в будущем.
237- Config.SetDeleteValue('Path/To/Some/Value',SomeValue,'Default');
238- Config.SetDeleteValue('Path/To/Some/Integer',SomeInteger,3);
239- Config.SetDeleteValue('Path/To/Some/Boolean',SomeBoolean,true);
240- // далее [по коду] еще overloads-инструкции для SetDeleteValue,
241- // которые [всплывают в редакторе кода по нажатию] <Ctrl>+<Space>
242- finally
243- Config.Free;
244- end;
245-
246- except
247- on E: Exception do begin
248- DebugLn(['Saving mysettings.xml failed: ',E.Message]);
249- end;
250- end;
251-
252- // загрузка настроек
253- try
254- Config:=GetIDEConfigStorage('mysettings.xml',true);
255- try
256- // чтение версии конфигурации
257- FileVersion:=Config.GetValue('Path/To/The/Version',0);
258- // чтение строковой переменной "SomeValue". Если запись не существует, используется
259- // значение по умолчанию
260- SomeValue:=Config.GetValue('Path/To/Some/Value','Default');
261- SomeInteger:=Config.GetValue('Path/To/Some/Integer',3);
262- SomeBoolean:=Config.GetValue('Path/To/Some/Boolean',true);
263- finally
264- Config.Free;
265- end;
266- except
267- on E: Exception do begin
268- DebugLn(['Loading mysettings.xml failed: ',E.Message]);
269- end;
270- end;
139+ ..., LCLProc, BaseIDEIntf, LazConfigStorage;
140+
141+const
142+ Version = 1;
143+var
144+ Config: TConfigStorage;
145+ SomeValue: String;
146+ SomeInteger: Integer;
147+ SomeBoolean: Boolean;
148+ FileVersion: LongInt;
149+begin
150+ SomeValue:='Default';
151+ SomeInteger:=3;
152+ SomeBoolean:=true;
153+
154+ // сохранение настроек
155+ try
156+ Config:=GetIDEConfigStorage('mysettings.xml',false);
157+ try
158+ // сохраняем номер версии, чтобы будущие расширения могли обрабатывать старые файлы конфигурации
159+ Config.SetDeleteValue('Path/To/The/Version',Version,0);
160+ // сохраняем строковую переменную "SomeValue"
161+ // если SomeValue имеет значение по умолчанию, запись не сохраняется,
162+ // поэтому сохраняются только [значения,] отличающиеся от значения по умолчанию.
163+ // Таким образом, xml остается коротким, и значения по умолчанию могут измениться в будущем.
164+ Config.SetDeleteValue('Path/To/Some/Value',SomeValue,'Default');
165+ Config.SetDeleteValue('Path/To/Some/Integer',SomeInteger,3);
166+ Config.SetDeleteValue('Path/To/Some/Boolean',SomeBoolean,true);
167+ // далее [по коду] еще overloads-инструкции для SetDeleteValue,
168+ // которые [всплывают в редакторе кода по нажатию] <Ctrl>+<Space>
169+ finally
170+ Config.Free;
271171 end;
172+
173+ except
174+ on E: Exception do begin
175+ DebugLn(['Saving mysettings.xml failed: ',E.Message]);
176+ end;
177+ end;
178+
179+ // загрузка настроек
180+ try
181+ Config:=GetIDEConfigStorage('mysettings.xml',true);
182+ try
183+ // чтение версии конфигурации
184+ FileVersion:=Config.GetValue('Path/To/The/Version',0);
185+ // чтение строковой переменной "SomeValue". Если запись не существует, используется
186+ // значение по умолчанию
187+ SomeValue:=Config.GetValue('Path/To/Some/Value','Default');
188+ SomeInteger:=Config.GetValue('Path/To/Some/Integer',3);
189+ SomeBoolean:=Config.GetValue('Path/To/Some/Boolean',true);
190+ finally
191+ Config.Free;
192+ end;
193+ except
194+ on E: Exception do begin
195+ DebugLn(['Loading mysettings.xml failed: ',E.Message]);
196+ end;
197+ end;
198+end;
272199```
273200
274-На заметку:
201+На заметку:
275202
276- * Каждый плагин IDE должен использовать свой собственный файл конфигурации. Особенно вы не должны использовать стандартные файлы опций IDE, такие как [editoroptions.xml](</index.php?title=editoroptions.xml&action=edit&redlink=1> "editoroptions.xml \(page does not exist\)") или [environmentmentoptions.xml](</index.php?title=environmentmentoptions.xml&action=edit&redlink=1> "environmentmentoptions.xml \(page does not exist\)").
277- * GetIDEConfigStorage при загрузке проверяет, существует ли файл и, если нет, копирует шаблон из вторичного каталога конфигурации.
278- * Начиная с версии 0.9.31 вы можете использовать эту функцию для загрузки файла вне основного каталога конфигурации.
203+- Каждый плагин IDE должен использовать свой собственный файл конфигурации. Особенно вы не должны использовать стандартные файлы опций IDE, такие как [[editoroptions.xml]] или [[environmentmentoptions.xml]].
204+- GetIDEConfigStorage при загрузке проверяет, существует ли файл и, если нет, копирует шаблон из вторичного каталога конфигурации.
205+- Начиная с версии 0.9.31 вы можете использовать эту функцию для загрузки файла вне основного каталога конфигурации.
279206
280207# Компоненты
281208
282209## Расширение существующих компонентов
283210
284-Источник: [[1]](<http://lazarus.freepascal.org/index.php/topic,17733.msg98425.html#msg98425>) Это обычная настройка существующих компонентов LCL, например, если вы хотите добавить свойства.
211+Источник: [1](http://lazarus.freepascal.org/index.php/topic,17733.msg98425.html#msg98425) Это обычная настройка существующих компонентов LCL, например, если вы хотите добавить свойства.
285212
286-Добавьте необходимые свойства с соответствующими методами установки и получения и полями хранения.
213+Добавьте необходимые свойства с соответствующими методами установки и получения и полями хранения.
287214
288-Затем создайте их экземпляр «вручную», предоставив компонент-владелец (для последующей обработки), и установите [свойство] Parent и, возможно, [свойства] Top и Left и любые другие значения по умолчанию, необходимые для вашего компонента при инициализации.
215+Затем создайте их экземпляр «вручную», предоставив компонент-владелец (для последующей обработки), и установите \[свойство\] Parent и, возможно, \[свойства\] Top и Left и любые другие значения по умолчанию, необходимые для вашего компонента при инициализации.
289216
290-Когда вы убедитесь, что ваш настроенный компонент отлажен, добавьте вызов `RegisterComponent()`, чтобы прикрепить его к палитре компонентов IDE и избавьте вас от необходимости выполнять код установки вручную (посмотрите на исходник любого компонента, чтобы узнать, как это сделать).
217+Когда вы убедитесь, что ваш настроенный компонент отлажен, добавьте вызов `RegisterComponent()`, чтобы прикрепить его к палитре компонентов IDE и избавьте вас от необходимости выполнять код установки вручную (посмотрите на исходник любого компонента, чтобы узнать, как это сделать).
291218
292-Вот простой пример:
293-```
219+Вот простой пример:
220+
221+``` pascal
294222unit Unit1;
295-
296- {$mode objfpc}{$H+}
297-
298- interface
299-
300- uses
301- Classes, SysUtils, Forms, StdCtrls;
302-
303- type
304- TEdX = class(TEdit)
305- private
306- FNewIntProp: integer;
307- FNewStrProp: string;
308- procedure SetNewIntProp(AValue: integer);
309- procedure SetNewStrProp(AValue: string);
310- public
311- constructor Create(theComponent: TComponent); override;
312- property NewIntProp: integer read FNewIntProp write SetNewIntProp;
313- property NewStrProp: string read FNewStrProp write SetNewStrProp;
314- end;
315-
316- TForm1 = class(TForm)
317- procedure FormCreate(Sender: TObject);
318- private
319- edX: TEdX;
320- public
321- end;
322-
323- var
324- Form1: TForm1;
325-
326- implementation
327-
328- { TForm1 }
329-
330- procedure TForm1.FormCreate(Sender: TObject);
331- begin
332- edX:= TEdX.Create(Self);
333- edX.Parent:= Self;
334- edX.Caption:= IntToStr(edX.NewIntProp);
335- Caption:= edX.NewStrProp;
336- end;
337-
338- {$R *.lfm}
339-
340- { TEdX }
341-
342- procedure TEdX.SetNewIntProp(AValue: integer);
343- begin
344- if FNewIntProp=AValue then Exit;
345- FNewIntProp:=AValue;
346- // добавьте свой код здесь
347- end;
348-
349- procedure TEdX.SetNewStrProp(AValue: string);
350- begin
351- if FNewStrProp=AValue then Exit;
352- FNewStrProp:=AValue;
353- // добавьте свой код здесь
354- end;
355-
356- constructor TEdX.Create(theComponent: TComponent);
357- begin
358- inherited Create(theComponent);
359- FNewStrProp:= 'new string property value';
360- FNewIntProp:= 99;
361- end;
362-
363- end.
223+
224+{$mode objfpc}{$H+}
225+
226+interface
227+
228+uses
229+ Classes, SysUtils, Forms, StdCtrls;
230+
231+type
232+ TEdX = class(TEdit)
233+ private
234+ FNewIntProp: integer;
235+ FNewStrProp: string;
236+ procedure SetNewIntProp(AValue: integer);
237+ procedure SetNewStrProp(AValue: string);
238+ public
239+ constructor Create(theComponent: TComponent); override;
240+ property NewIntProp: integer read FNewIntProp write SetNewIntProp;
241+ property NewStrProp: string read FNewStrProp write SetNewStrProp;
242+ end;
243+
244+ TForm1 = class(TForm)
245+ procedure FormCreate(Sender: TObject);
246+ private
247+ edX: TEdX;
248+ public
249+ end;
250+
251+var
252+ Form1: TForm1;
253+
254+implementation
255+
256+{ TForm1 }
257+
258+procedure TForm1.FormCreate(Sender: TObject);
259+begin
260+ edX:= TEdX.Create(Self);
261+ edX.Parent:= Self;
262+ edX.Caption:= IntToStr(edX.NewIntProp);
263+ Caption:= edX.NewStrProp;
264+end;
265+
266+{$R *.lfm}
267+
268+{ TEdX }
269+
270+procedure TEdX.SetNewIntProp(AValue: integer);
271+begin
272+ if FNewIntProp=AValue then Exit;
273+ FNewIntProp:=AValue;
274+ // добавьте свой код здесь
275+end;
276+
277+procedure TEdX.SetNewStrProp(AValue: string);
278+begin
279+ if FNewStrProp=AValue then Exit;
280+ FNewStrProp:=AValue;
281+ // добавьте свой код здесь
282+end;
283+
284+constructor TEdX.Create(theComponent: TComponent);
285+begin
286+ inherited Create(theComponent);
287+ FNewStrProp:= 'new string property value';
288+ FNewIntProp:= 99;
289+end;
290+
291+end.
364292```
365293
366294## Написание компонент
367295
368-_Основная статья:[[How To Write Lazarus Component/ru|How To Write Lazarus Component]]_
296+*Основная статья: [[How To Write Lazarus Component/ru|How To Write Lazarus Component]]*
369297
370-Вы можете создавать новые компоненты через редактор пакетов.
298+Вы можете создавать новые компоненты через редактор пакетов.
371299
372-Создайте или откройте пакет, нажмите **add**(добавить), нажмите **New Component** (Новый компонент), заполните пункты: Ancestor Type(Тип предка) = TButton, New class name (Имя нового класса) = TMyButton, palette page (страница палитры) = Misc, Unit file name (имя файла модуля) = mybutton.pas (этот файл будет создан), имя модуля MyButton, и нажмите кнопку **ok**.
300+Создайте или откройте пакет, нажмите **add**(добавить), нажмите **New Component** (Новый компонент), заполните пункты: Ancestor Type(Тип предка) = TButton, New class name (Имя нового класса) = TMyButton, palette page (страница палитры) = Misc, Unit file name (имя файла модуля) = mybutton.pas (этот файл будет создан), имя модуля MyButton, и нажмите кнопку **ok**.
373301
374302### Предоставление новому компоненту иконки для палитры компонентов
375303
376-Создайте файл изображения в формате .bmp, .xpm или .png с тем же именем, что и класс компонента. Например, _tmybutton.png_ и сохраните его в исходном каталоге пакета. Изображение может быть создано любой графической программой (например, GIMP [или IncScape]) и должно быть не больше 24x24 пикселей. Затем преобразуйте изображение в файл ресурсов с помощью инструмента lazres, который можно найти в каталоге lazarus/tools:
377-```
304+Создайте файл изображения в формате .bmp, .xpm или .png с тем же именем, что и класс компонента. Например, *tmybutton.png* и сохраните его в исходном каталоге пакета. Изображение может быть создано любой графической программой (например, GIMP \[или IncScape\]) и должно быть не больше 24x24 пикселей. Затем преобразуйте изображение в файл ресурсов с помощью инструмента lazres, который можно найти в каталоге lazarus/tools:
305+
306+``` bash
378307~/lazarus/tools/lazres mybutton.lrs tmybutton.png
379308```
380309
381-![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Примечание:** Лаззарус trunk/1.4+? использует файлы ресурсов .res взамен .lrs-файлов
382-```
310+> **Note:** Лаззарус trunk/1.4+? использует файлы ресурсов .res взамен .lrs-файлов
311+
312+``` bash
383313~/lazarus/tools/lazres mybutton.res tmybutton.png
384314```
385315
386-Это создаст include-файл паскаля, который используется в разделе initialization mybutton.pas:
387-```
316+Это создаст include-файл паскаля, который используется в разделе initialization mybutton.pas:
317+
318+``` pascal
388319initialization
389- {$I mybutton.lrs}
390- // или в более новой версии Lazarus - синтаксис docheck
391- {$R mybutton.res}
320+ {$I mybutton.lrs}
321+ // или в более новой версии Lazarus - синтаксис docheck
322+ {$R mybutton.res}
392323```
393324
394-Установите пакет.
325+Установите пакет.
395326
396327### Скрытие компонента в палитре компонентов
397328
398-Пакет IDEIntf, модуль componentreg:
399-```
400-IDEComponentPalette.FindComponent('TButton').Visible:=false;
401-```
329+Пакет IDEIntf, модуль componentreg:
402330
331+`IDEComponentPalette.FindComponent('TButton').Visible:=false;`
332+
403333## Написание редактора компонента
404334
405-Редактор компонента обрабатывает такие вещи, как двойной щелчок по компоненту в конструкторе или добавление пунктов меню при щелчке правой кнопкой мыши по компоненту. Написать редактор компонентов легко. Посмотрите модуль componententeditors.pas пакета IDEIntf для [просмотра] кучи примеров. Например, чтобы показать редактор при двойном щелчке, см. TCheckListBoxComponentEditor.
335+Редактор компонента обрабатывает такие вещи, как двойной щелчок по компоненту в конструкторе или добавление пунктов меню при щелчке правой кнопкой мыши по компоненту. Написать редактор компонентов легко. Посмотрите модуль componententeditors.pas пакета IDEIntf для \[просмотра\] кучи примеров. Например, чтобы показать редактор при двойном щелчке, см. TCheckListBoxComponentEditor.
406336
407337## Написание редакторов свойств
408338
409-Каждый тип свойства (integer, string, TFont, ...) в Инспекторе объектов нуждается в редакторе свойств. Если у вашего компонента есть свойство _Password_ типа string, вы можете определить редактор свойств для вашего конкретного класса компонента со именем свойства _Password_ типа string. Модуль propedits.pp пакета IDEIntf содержит многие стандартные редакторы свойств, используемые самой IDE. Например, TStringPropertyEditor является редактором свойств по умолчанию для всех строк, в то время как TComponentNamePropertyEditor является более конкретным и обрабатывает только TComponent.Name. Смотрите [исходный код] модуля для [получения] множества примеров.
339+Каждый тип свойства (integer, string, TFont, ...) в Инспекторе объектов нуждается в редакторе свойств. Если у вашего компонента есть свойство *Password* типа string, вы можете определить редактор свойств для вашего конкретного класса компонента со именем свойства *Password* типа string. Модуль propedits.pp пакета IDEIntf содержит многие стандартные редакторы свойств, используемые самой IDE. Например, TStringPropertyEditor является редактором свойств по умолчанию для всех строк, в то время как TComponentNamePropertyEditor является более конкретным и обрабатывает только TComponent.Name. Смотрите \[исходный код\] модуля для \[получения\] множества примеров.
410340
411341### Сокрытие свойства в инспекторе объектов
412342
413-Существует специальный редактор свойств для сокрытия [свойств]:
414-```
415-RegisterPropertyEditor(TypeInfo(TAnchorSide), TControl, 'AnchorSideLeft', THiddenPropertyEditor);
343+Существует специальный редактор свойств для сокрытия \[свойств\]:
344+
345+``` pascal
346+ RegisterPropertyEditor(TypeInfo(TAnchorSide), TControl, 'AnchorSideLeft', THiddenPropertyEditor);
416347```
417348
418349### Поиск редактора свойств, используемого для свойства
419-```
350+
351+``` pascal
420352uses Classes, TypInfo;
421- var
422- Instance: TPersistent; // ваш экземпляр
423- PropInfo: PPropInfo;
424- EdClass: TPropertyEditorClass;
425- begin
426- PropInfo:=GetPropInfo(Instance.ClassType,'Name'); // замените Name именем свойства, которое вы ищете
427- GetEditorClass(PropInfo, Instance);
428- end;
353+var
354+ Instance: TPersistent; // ваш экземпляр
355+ PropInfo: PPropInfo;
356+ EdClass: TPropertyEditorClass;
357+begin
358+ PropInfo:=GetPropInfo(Instance.ClassType,'Name'); // замените Name именем свойства, которое вы ищете
359+ GetEditorClass(PropInfo, Instance);
360+end;
429361```
430362
431363# Формы
432364
433-IDE позволяет легко создавать потомков форм и фреймов. Эти формы могут иметь новые published-компоненты и новые published-методы. Но, когда вы добавляете новые published-свойства, они не доступны через инспектор объектов. Они работают только во время выполнения [приложения]. Методы в IDE являются поддельными, они не могут быть выполнены. В среде IDE можно создавать компоненты, поскольку их классы зарегистрированы в палитре компонентов. Ваши новые свойства существуют только в вашем исходном коде. IDE пока не может их подделать. Вот почему вы должны зарегистрировать новый класс. Это означает [, что вы должны]:
365+IDE позволяет легко создавать потомков форм и фреймов. Эти формы могут иметь новые published-компоненты и новые published-методы. Но, когда вы добавляете новые published-свойства, они не доступны через инспектор объектов. Они работают только во время выполнения \[приложения\]. Методы в IDE являются поддельными, они не могут быть выполнены. В среде IDE можно создавать компоненты, поскольку их классы зарегистрированы в палитре компонентов. Ваши новые свойства существуют только в вашем исходном коде. IDE пока не может их подделать. Вот почему вы должны зарегистрировать новый класс. Это означает \[, что вы должны\]:
434366
435- * Создать пакет времени разработки (или расширить существующий)
436- * Ваша форма должна быть в модуле этого пакета
367+- Создать пакет времени разработки (или расширить существующий)
368+- Ваша форма должна быть в модуле этого пакета
437369
438-```
370+``` pascal
439371...
440- interface
441-
442- uses FormEditingIntf, Forms;
443-
444- type
445- TYourForm = class(TForm)
446- private
447- FYourProperty: integer;
448- published
449- property YourProperty: integer read FYourProperty write FYourProperty;
450- end;
451-
452- procedure Register;
453-
454- implementation
455-
456- procedure Register;
457- begin
458- FormEditingHook.RegisterDesignerBaseClass(TYourForm);
459- end;
460- ...
372+interface
373+
374+uses FormEditingIntf, Forms;
375+
376+type
377+ TYourForm = class(TForm)
378+ private
379+ FYourProperty: integer;
380+ published
381+ property YourProperty: integer read FYourProperty write FYourProperty;
382+ end;
383+
384+procedure Register;
385+
386+implementation
387+
388+procedure Register;
389+begin
390+ FormEditingHook.RegisterDesignerBaseClass(TYourForm);
391+end;
392+...
461393```
462394
463- * Проверить [наличие процедуры] "Register" в редакторе пакетов для этого модуля.
464- * Установить пакет в IDE
395+- Проверить \[наличие процедуры\] "Register" в редакторе пакетов для этого модуля.
396+- Установить пакет в IDE
465397
466398# Дизайнер
467399
468400## Написание дизайнера-посредника
469401
470-Стандартный конструктор позволяет визуально редактировать элементы управления LCL, тогда как все остальные отображаются в виде значков (например, TOpenDialog или TDataSource). Чтобы визуально редактировать элемент управления не [из библиотеки] LCL, вам нужно создать **designer mediator** (дизайнер-посредник). Он может быть использован для разработки веб-страниц, диаграмм UML или других наборов виджетов, таких как [[fpGUI]]. Полный пример приведен в examples/designnonlcl/.
402+Стандартный конструктор позволяет визуально редактировать элементы управления LCL, тогда как все остальные отображаются в виде значков (например, TOpenDialog или TDataSource). Чтобы визуально редактировать элемент управления не \[из библиотеки\] LCL, вам нужно создать **designer mediator** (дизайнер-посредник). Он может быть использован для разработки веб-страниц, диаграмм UML или других наборов виджетов, таких как [[fpGUI]]. Полный пример приведен в examples/designnonlcl/.
471403
472- * Установите пакет с примерами examples/designnonlcl/notlcldesigner.lpk и перезапустите IDE. Это зарегистрирует дизайнер-посредник для компонентов TMyWidget и добавит новые компоненты TMyButton, TMyGroupBox в палитру компонентов.
473- * Откройте проект с примерами examples/designnonlcl/project/NonLCL1.lpi.
474- * Откройте unit1.pas и покажите дизайнер форм (F12). Вы должны увидеть компоненты в виде красных прямоугольников, которые можно выделять, перемещать и изменять их размер, как элементы управления LCL.
404+- Установите пакет с примерами examples/designnonlcl/notlcldesigner.lpk и перезапустите IDE. Это зарегистрирует дизайнер-посредник для компонентов TMyWidget и добавит новые компоненты TMyButton, TMyGroupBox в палитру компонентов.
405+- Откройте проект с примерами examples/designnonlcl/project/NonLCL1.lpi.
406+- Откройте unit1.pas и покажите дизайнер форм (F12). Вы должны увидеть компоненты в виде красных прямоугольников, которые можно выделять, перемещать и изменять их размер, как элементы управления LCL.
475407
476408## Создание нового уникального имени компонента
477-```
409+
410+``` pascal
478411uses FormEditingIntf;
479-
480- ...
481-
482- NewName:=FormEditingHook.CreateUniqueComponentName(AComponent);
483-
484- // Или, если вам нужно создать имя перед созданием компонента:
485-
486- NewName:=FormEditingHook.CreateUniqueComponentName(ComponentClassName,OwnerComponent);
487- // ComponentClassName будет использоваться в качестве префикса без начального T.
488- // OwnerComponent является новым владельцем нового компонента.
412+
413+...
414+
415+NewName:=FormEditingHook.CreateUniqueComponentName(AComponent);
416+
417+// Или, если вам нужно создать имя перед созданием компонента:
418+
419+NewName:=FormEditingHook.CreateUniqueComponentName(ComponentClassName,OwnerComponent);
420+// ComponentClassName будет использоваться в качестве префикса без начального T.
421+// OwnerComponent является новым владельцем нового компонента.
489422```
490423
491424## Выбор компонента в конструкторе/инспекторе объектов
492-```
425+
426+``` pascal
493427uses propedits;
494- ..
495- GlobalDesignHook.SelectOnlyThis(AComponent);
428+..
429+GlobalDesignHook.SelectOnlyThis(AComponent);
496430```
497431
498432## Получение файла модуля, дизайнера формы
499-```
433+
434+``` pascal
500435uses ProjectIntf, LazIDEIntf, ComponentEditors;
501- ...
502- // открываем файл
503- if LazarusIDE.DoOpenEditorFile(Filename,-1,-1,[ofAddToRecent])<>mrOk then exit;
504- // получаем интерфейс файла
505- aFile:=LazarusIDE.ActiveProject.FindFile(Filename,[]);
506- // получаем дизайнер
507- aDesigner:=TComponentEditorDesigner(LazarusIDE.GetDesignerWithProjectFile(AFile,true));
508- if aDesigner=nil then
509- exit; // этот модуль не имеет ресурса (форма, фрейм, модуль данных и т.д.)
510- // получаем форму
511- aForm:=aDesigner.Form;
436+...
437+// открываем файл
438+if LazarusIDE.DoOpenEditorFile(Filename,-1,-1,[ofAddToRecent])<>mrOk then exit;
439+// получаем интерфейс файла
440+aFile:=LazarusIDE.ActiveProject.FindFile(Filename,[]);
441+// получаем дизайнер
442+aDesigner:=TComponentEditorDesigner(LazarusIDE.GetDesignerWithProjectFile(AFile,true));
443+if aDesigner=nil then
444+ exit; // этот модуль не имеет ресурса (форма, фрейм, модуль данных и т.д.)
445+// получаем форму
446+aForm:=aDesigner.Form;
512447```
513448
514449## Сохранение модуля, дизайнера формы
515-```
450+
451+``` pascal
516452uses LazIDEIntf;
517- ...
518- if LazarusIDE.DoSaveEditorFile(Filename,[])<>mrOk then exit;
453+...
454+if LazarusIDE.DoSaveEditorFile(Filename,[])<>mrOk then exit;
519455```
520456
521457## Сохранение формы дизайнера как кода Паскаль
522458
523- * Используйте функцию **FormEditingHook.SaveComponentAsPascal** модуля _FormEditingfIntf_. См. _examples/pascalstream/CopyAsPasPkg/copyaspasdemounit1.pas_.
459+- Используйте функцию **FormEditingHook.SaveComponentAsPascal** модуля *FormEditingfIntf*. См. *examples/pascalstream/CopyAsPasPkg/copyaspasdemounit1.pas*.
524460
525461# Обработчики событий
526462
527-В IDE есть несколько событий, для которых плагины могут добавлять свои собственные обработчики.
463+В IDE есть несколько событий, для которых плагины могут добавлять свои собственные обработчики.
528464
529465## События дизайнера
530466
531-В propedits.pp есть объект "GlobalDesignHook", который поддерживает несколько событий для проектирования. Каждое событие вызывает список обработчиков. Обработчики по умолчанию добавляются в среду IDE. Вы можете добавить свои собственные обработчики с помощью методов AddHandlerXXX и RemoveHandlerXXX. Они будут вызваны перед обработчиками по умолчанию.
467+В propedits.pp есть объект "GlobalDesignHook", который поддерживает несколько событий для проектирования. Каждое событие вызывает список обработчиков. Обработчики по умолчанию добавляются в среду IDE. Вы можете добавить свои собственные обработчики с помощью методов AddHandlerXXX и RemoveHandlerXXX. Они будут вызваны перед обработчиками по умолчанию.
532468
533-Примеры:
469+Примеры:
534470
535- * Добавление вашего обработчика (это обычно делается в конструкторе вашего объекта):
471+- Добавление вашего обработчика (это обычно делается в конструкторе вашего объекта):
536472
537-```
538-GlobalDesignHook.AddHandlerPersistentAdded(@YourOnPersistentAdded);
539-```
473+` GlobalDesignHook.AddHandlerPersistentAdded(@YourOnPersistentAdded);`
540474
541- * Удаление вашего обработчика:
475+- Удаление вашего обработчика:
542476
543-```
544-GlobalDesignHook.RemoveHandlerPersistentAdded(@YourOnPersistentAdded);
545-```
477+` GlobalDesignHook.RemoveHandlerPersistentAdded(@YourOnPersistentAdded);`
546478
547- * Вы можете удалить все обработчики одновременно. Например, это хорошая идея - добавить эту строку в деструктор вашего объекта:
479+- Вы можете удалить все обработчики одновременно. Например, это хорошая идея - добавить эту строку в деструктор вашего объекта:
548480
549-```
550-GlobalDesignHook.RemoveAllHandlersForObject(Self);
551-```
481+` GlobalDesignHook.RemoveAllHandlersForObject(Self);`
552482
553-Обработчики GlobalDesignHook:
483+Обработчики GlobalDesignHook:
554484
555- * Поиск корня
556- * ChangeLookupRoot - Вызывается при изменении "LookupRoot". "LookupRoot" является объектом-владельцем выбранных компонентов. Обычно это TForm.
557- * Методы
558- * CreateMethod
559- * GetMethodName
560- * GetMethods
561- * MethodExists
562- * RenameMethod
563- * ShowMethod
564- * MethodFromAncestor
565- * ChainCall
566- * Компоненты
567- * GetComponent
568- * GetComponentName
569- * GetComponentNames
570- * GetRootClassName
571- * AddClicked - Вызывается, когда пользователь выбирает класс компонента и щелкает дизайнер, чтобы добавить новый компонент. Вы можете изменить класс компонента и родительский элемент.
572- * ComponentRenamed - Вызывается, когда компонент был переименован
573- * Объекты TPersistent
574- * PersistentAdded - Вызывается при добавлении нового TPersistent в LookupRoot
575- * PersistentDeleting - Вызывается до освобождения TPersistent.
576- * DeletePersistent - Вызывается IDE для удаления TPersistent.
577- * GetSelectedPersistents - Вызывается при получении текущего выбора TPersistent.
578- * SetSelectedPersistents - Вызывается при настройке текущего выбора TPersistent.
579- * GetObject
580- * GetObjectName
581- * GetObjectNames
582- * Изменение
583- * Modified
584- * Revert
585- * RefreshPropertyValues
586- * Выбор
587- * SetSelection
588- * GetSelection
485+- Поиск корня
486+ - ChangeLookupRoot - Вызывается при изменении "LookupRoot". "LookupRoot" является объектом-владельцем выбранных компонентов. Обычно это TForm.
487+- Методы
488+ - CreateMethod
489+ - GetMethodName
490+ - GetMethods
491+ - MethodExists
492+ - RenameMethod
493+ - ShowMethod
494+ - MethodFromAncestor
495+ - ChainCall
496+- Компоненты
497+ - GetComponent
498+ - GetComponentName
499+ - GetComponentNames
500+ - GetRootClassName
501+ - AddClicked - Вызывается, когда пользователь выбирает класс компонента и щелкает дизайнер, чтобы добавить новый компонент. Вы можете изменить класс компонента и родительский элемент.
502+ - ComponentRenamed - Вызывается, когда компонент был переименован
503+- Объекты TPersistent
504+ - PersistentAdded - Вызывается при добавлении нового TPersistent в LookupRoot
505+ - PersistentDeleting - Вызывается до освобождения TPersistent.
506+ - DeletePersistent - Вызывается IDE для удаления TPersistent.
507+ - GetSelectedPersistents - Вызывается при получении текущего выбора TPersistent.
508+ - SetSelectedPersistents - Вызывается при настройке текущего выбора TPersistent.
509+ - GetObject
510+ - GetObjectName
511+ - GetObjectNames
512+- Изменение
513+ - Modified
514+ - Revert
515+ - RefreshPropertyValues
516+- Выбор
517+ - SetSelection
518+ - GetSelection
589519
590520### Примеры для событий дизайнера
591521
592-#### Пример: когда [на родителя] помещается новый компонент, перемещать элемент управления в дочерний элемент
593-```
522+#### Пример: когда \[на родителя\] помещается новый компонент, перемещать элемент управления в дочерний элемент
523+
524+``` pascal
594525...
595- type
596- TYourDesignerExtension = class
597- private
598- function AddClicked(ADesigner: TIDesigner;
599- MouseDownComponent: TComponent; Button: TMouseButton;
600- Shift: TShiftState; X, Y: Integer;
601- var AComponentClass: TComponentClass;
602- var NewParent: TComponent): boolean of object;
603- public
604- constructor Create;
605- destructor Destroy; override;
606- end;
607-
608- ...
609- constructor TYourDesignerExtension.Create;
610- begin
611- // регистрация вашего обработчика
612- GlobalDesignHook.AddHandlerAddClicked(@AddClicked);
613- end;
614-
615- destructor TYourDesignerExtension.Destroy;
616- begin
617- // удаление вашего обработчика
618- GlobalDesignHook.RemoveHandlerAddClicked(@AddClicked);
619- end;
620-
621- function TYourDesignerExtension.AddClicked(ADesigner: TIDesigner;
622- MouseDownComponent: TComponent; Button: TMouseButton;
623- Shift: TShiftState; X, Y: Integer;
624- var AComponentClass: TComponentClass;
625- var NewParent: TComponent): boolean of object;
626- begin
627- // в этом примере TYourControl - это пользовательский элемент управления с ChildControl.
628- // Всякий раз, когда пользователь помещает элемент управления на TYourControl, вместо добавления
629-   // нового элемента управления на TYourControl, [этот] новый элемент управления добавляется как дочерний элемент
630-   // [имеющегося] ChildControl.
631- // создание
632- if MouseDownComponent is TYourControl then
633- NewParent:=TYourControl(MouseDownComponent).ChildControl;
634- Result:=true;
635- end;
636-```
526+type
527+ TYourDesignerExtension = class
528+ private
529+ function AddClicked(ADesigner: TIDesigner;
530+ MouseDownComponent: TComponent; Button: TMouseButton;
531+ Shift: TShiftState; X, Y: Integer;
532+ var AComponentClass: TComponentClass;
533+ var NewParent: TComponent): boolean of object;
534+ public
535+ constructor Create;
536+ destructor Destroy; override;
537+ end;
637538
638-### Отключение обработчика мыши в [режиме] дизайнера
539+...
540+constructor TYourDesignerExtension.Create;
541+begin
542+ // регистрация вашего обработчика
543+ GlobalDesignHook.AddHandlerAddClicked(@AddClicked);
544+end;
639545
640-Обычно дизайнер ловит все события мыши компонента. Если ваш пользовательский элемент управления должен обрабатывать дескриптор событий мыши, вы можете либо установить **csDesignInteractive** **ControlStyle** , либо вы можете точно управлять им через сообщение _CM_DESIGNHITTEST_ в вашем элементе управления:
546+destructor TYourDesignerExtension.Destroy;
547+begin
548+ // удаление вашего обработчика
549+ GlobalDesignHook.RemoveHandlerAddClicked(@AddClicked);
550+end;
551+
552+function TYourDesignerExtension.AddClicked(ADesigner: TIDesigner;
553+ MouseDownComponent: TComponent; Button: TMouseButton;
554+ Shift: TShiftState; X, Y: Integer;
555+ var AComponentClass: TComponentClass;
556+ var NewParent: TComponent): boolean of object;
557+begin
558+ // в этом примере TYourControl - это пользовательский элемент управления с ChildControl.
559+ // Всякий раз, когда пользователь помещает элемент управления на TYourControl, вместо добавления
560+  // нового элемента управления на TYourControl, [этот] новый элемент управления добавляется как дочерний элемент
561+  // [имеющегося] ChildControl.
562+ // создание
563+ if MouseDownComponent is TYourControl then
564+ NewParent:=TYourControl(MouseDownComponent).ChildControl;
565+ Result:=true;
566+end;
641567```
568+
569+### Отключение обработчика мыши в \[режиме\] дизайнера
570+
571+Обычно дизайнер ловит все события мыши компонента. Если ваш пользовательский элемент управления должен обрабатывать дескриптор событий мыши, вы можете либо установить **csDesignInteractive** **ControlStyle**, либо вы можете точно управлять им через сообщение *CM_DESIGNHITTEST* в вашем элементе управления:
572+
573+``` pascal
642574type
643- TYourControl = class(TCustomControl)
644- protected
645- procedure CMDesignHitTest(var Message: TLMessage); message CM_DESIGNHITTEST;
646- end;
647- ...
648- procedure TYourControl.CMDesignHitTest(var Message: TLMessage);
649- var
650- p: TSmallPoint;
651- aShiftState: TShiftState;
652- begin
653- aShiftState:=KeysToShiftState(PtrUInt(Message.WParam));
654- p:=TSmallPoint(longint(Message.LParam));
655- debugln(['TForm1.CMDesignHitTest ShiftState=',dbgs(aShiftState),' x=',p.x,' y=',p.y]);
656- if SkipDesignerMouseHandler then
657- Message.Result:=1; // теперь дизайнер вызывает обычные методы MouseUp, MouseMove и MouseDown.
658- end;
575+ TYourControl = class(TCustomControl)
576+ protected
577+ procedure CMDesignHitTest(var Message: TLMessage); message CM_DESIGNHITTEST;
578+ end;
579+...
580+procedure TYourControl.CMDesignHitTest(var Message: TLMessage);
581+var
582+ p: TSmallPoint;
583+ aShiftState: TShiftState;
584+begin
585+ aShiftState:=KeysToShiftState(PtrUInt(Message.WParam));
586+ p:=TSmallPoint(longint(Message.LParam));
587+ debugln(['TForm1.CMDesignHitTest ShiftState=',dbgs(aShiftState),' x=',p.x,' y=',p.y]);
588+ if SkipDesignerMouseHandler then
589+ Message.Result:=1; // теперь дизайнер вызывает обычные методы MouseUp, MouseMove и MouseDown.
590+end;
659591```
660592
661593## Получение уведомлений при изменении дизайнера форм
662594
663-Каждая разработанная форма LCL имеет конструктор типа TIDesigner. В среде IDE создаются конструкторы типа TComponentEditorDesigner, определенные в компонентных компонентах модуля IDEIntf. Например:
664-```
595+Каждая разработанная форма LCL имеет конструктор типа TIDesigner. В среде IDE создаются конструкторы типа TComponentEditorDesigner, определенные в компонентных компонентах модуля IDEIntf. Например:
596+
597+``` pascal
665598procedure TYourAddOn.OnDesignerModified(Sender: TObject);
666- var
667- IDEDesigner: TComponentEditorDesigner;
668- begin
669- IDEDesigner:=TComponentEditorDesigner(Sender);
670- ...
671- end;
672-
673- procedure TYourAddOn.ConnectDesignerForm(Form1: TCustomForm);
674- var
675- IDEDesigner: TComponentEditorDesigner;
676- begin
677- IDEDesigner:=TComponentEditorDesigner(Form1.Designer);
678- IDEDesigner.AddHandlerModified(@OnDesignerModified);
679- end;
599+var
600+ IDEDesigner: TComponentEditorDesigner;
601+begin
602+ IDEDesigner:=TComponentEditorDesigner(Sender);
603+ ...
604+end;
605+
606+procedure TYourAddOn.ConnectDesignerForm(Form1: TCustomForm);
607+var
608+ IDEDesigner: TComponentEditorDesigner;
609+begin
610+ IDEDesigner:=TComponentEditorDesigner(Form1.Designer);
611+ IDEDesigner.AddHandlerModified(@OnDesignerModified);
612+end;
680613```
681614
682615## События проекта
683616
684-Эти события определены в модуле LazIDEIntf.
617+Эти события определены в модуле LazIDEIntf.
685618
686- * **LazarusIDE.AddHandlerOnProjectClose** : вызывается перед закрытием проекта
687- * **LazarusIDE.AddHandlerOnProjectOpened** : вызывается после полного открытия проекта (например, все необходимые пакеты были загружены, модули были открыты в редакторе исходного кода)
688- * **LazarusIDE.AddHandlerOnSavingAll** : вызывается перед тем, как IDE сохраняет все
689- * **LazarusIDE.AddHandlerOnSavedAll** : вызывается после того, как IDE сохранил все
690- * **LazarusIDE.AddHandlerOnProjectBuilding** : вызывается перед тем, как IDE создаст проект
691- * **LazarusIDE.AddHandlerOnProjectDependenciesCompiling** : вызывается перед тем, как IDE компилирует пакетные зависимости проекта
692- * **LazarusIDE.AddHandlerOnProjectDependenciesCompiled** : вызывается после компиляции зависимостей пакета IDE проекта
693- * **LazarusIDE.AddHandlerOnProjectBuildingFinished** : вызывается после того, как IDE собрал проект (успешно или нет) (начиная с 1.5)
619+- **LazarusIDE.AddHandlerOnProjectClose**: вызывается перед закрытием проекта
620+- **LazarusIDE.AddHandlerOnProjectOpened**: вызывается после полного открытия проекта (например, все необходимые пакеты были загружены, модули были открыты в редакторе исходного кода)
621+- **LazarusIDE.AddHandlerOnSavingAll**: вызывается перед тем, как IDE сохраняет все
622+- **LazarusIDE.AddHandlerOnSavedAll**: вызывается после того, как IDE сохранил все
623+- **LazarusIDE.AddHandlerOnProjectBuilding**: вызывается перед тем, как IDE создаст проект
624+- **LazarusIDE.AddHandlerOnProjectDependenciesCompiling**: вызывается перед тем, как IDE компилирует пакетные зависимости проекта
625+- **LazarusIDE.AddHandlerOnProjectDependenciesCompiled**: вызывается после компиляции зависимостей пакета IDE проекта
626+- **LazarusIDE.AddHandlerOnProjectBuildingFinished**: вызывается после того, как IDE собрал проект (успешно или нет) (начиная с 1.5)
694627
695628## Другие события IDE
696629
697-**uses** _LazIDEIntf;_
630+**uses** *LazIDEIntf;*
698631
699-Вызовите их в процедуре регистрации вашего пакета:
632+Вызовите их в процедуре регистрации вашего пакета:
700633
701- * **LazarusIDE.AddHandlerOnIDERestoreWindows** : вызывается, когда IDE восстанавливает свои окна (перед открытием первого проекта)
702- * **LazarusIDE.AddHandlerOnIDEClose** : вызывается, когда IDE закрывается (после запроса закрытия, поэтому больше нет интерактивности)
703- * **LazarusIDE.AddHandlerOnQuickSyntaxCheck** : вызывается при выполнении пункта меню или ярлыка для быстрой проверки синтаксиса
704- * **LazarusIDE.AddHandlerOnLazarusBuilding** : вызывается перед тем, как IDE собирает Lazarus IDE (начиная с 1.5)
705- * **LazarusIDE.AddHandlerOnLazarusBuildingFinished** : вызывается после того, как IDE собирает Lazarus IDE (начиная с 1.5)
706- * **LazarusIDE.AddHandlerGetFPCFrontEndParams** : вызывается, когда IDE получает параметры клиентского инструмента интерфейса 'fpc' (начиная с 1.5)
707- * **LazarusIDE.AddHandlerGetFPCFrontEndPath** : вызывается, когда IDE получает параметры клиентского инструмента интерфейса 'fpc' (начиная с 1.5)
708- * **LazarusIDE.AddHandlerOnUpdateIDEComponentPalette** : ?
709- * **LazarusIDE.AddHandlerOnUpdateComponentPageControl** : ?
710- * **LazarusIDE.AddHandlerOnShowDesignerFormOfSource** : вызывается после показа конструктора формы для редактора кода (AEditor может быть nil!) (начиная с 1.5)
711- * **LazarusIDE.AddHandlerOnShowSourceOfActiveDesignerForm** : вызывается после показа кода формы дизайнера (начиная с 1.5)
712- * **LazarusIDE.AddHandlerOnChangeToolStatus** : вызывается, когда IDEToolStatus изменяется (например, itNone-> itBuilder и т. д.) (начиная с 1.5)
634+- **LazarusIDE.AddHandlerOnIDERestoreWindows**: вызывается, когда IDE восстанавливает свои окна (перед открытием первого проекта)
635+- **LazarusIDE.AddHandlerOnIDEClose**: вызывается, когда IDE закрывается (после запроса закрытия, поэтому больше нет интерактивности)
636+- **LazarusIDE.AddHandlerOnQuickSyntaxCheck**: вызывается при выполнении пункта меню или ярлыка для быстрой проверки синтаксиса
637+- **LazarusIDE.AddHandlerOnLazarusBuilding**: вызывается перед тем, как IDE собирает Lazarus IDE (начиная с 1.5)
638+- **LazarusIDE.AddHandlerOnLazarusBuildingFinished**: вызывается после того, как IDE собирает Lazarus IDE (начиная с 1.5)
639+- **LazarusIDE.AddHandlerGetFPCFrontEndParams**: вызывается, когда IDE получает параметры клиентского инструмента интерфейса 'fpc' (начиная с 1.5)
640+- **LazarusIDE.AddHandlerGetFPCFrontEndPath**: вызывается, когда IDE получает параметры клиентского инструмента интерфейса 'fpc' (начиная с 1.5)
641+- **LazarusIDE.AddHandlerOnUpdateIDEComponentPalette**: ?
642+- **LazarusIDE.AddHandlerOnUpdateComponentPageControl**: ?
643+- **LazarusIDE.AddHandlerOnShowDesignerFormOfSource**: вызывается после показа конструктора формы для редактора кода (AEditor может быть nil!) (начиная с 1.5)
644+- **LazarusIDE.AddHandlerOnShowSourceOfActiveDesignerForm**: вызывается после показа кода формы дизайнера (начиная с 1.5)
645+- **LazarusIDE.AddHandlerOnChangeToolStatus**: вызывается, когда IDEToolStatus изменяется (например, itNone-\> itBuilder и т. д.) (начиная с 1.5)
713646
714-Вызовите их в разделе инициализации одного из модулей:
647+Вызовите их в разделе инициализации одного из модулей:
715648
716- * **AddBootHandler**
717- * AddBootHandler(**libhTransferMacrosCreated** ,@YourProc): вызывается после создания IDEMacros (начиная с версии 1.3)
718- * AddBootHandler(**libhEnvironmentOptionsLoaded** ,@YourProc): вызывается после загрузки параметров среды (начиная с версии 1.3)
649+- **AddBootHandler**
650+ - AddBootHandler(**libhTransferMacrosCreated**,@YourProc): вызывается после создания IDEMacros (начиная с версии 1.3)
651+ - AddBootHandler(**libhEnvironmentOptionsLoaded**,@YourProc): вызывается после загрузки параметров среды (начиная с версии 1.3)
719652
720653# Проект
721654
722655## Текущий проект
723656
724-Текущий основной проект может быть получен [при помощи] LazarusIDE.ActiveProject. (модуль LazIDEIntf)
657+Текущий основной проект может быть получен \[при помощи\] LazarusIDE.ActiveProject. (модуль LazIDEIntf)
725658
726659## Все модули текущего проекта
727660
728-Обратите внимание, что термин «юниты проекта» неоднозначен.
661+Обратите внимание, что термин «юниты проекта» неоднозначен.
729662
730- * Инспектор проектов показывает список файлов .lpi. Проект может не использовать все эти модули на всех платформах, и, возможно, разработчик забыл добавить все используемые модули.
731- * Модули из использованных пакетов не являются модулями проекта.
663+- Инспектор проектов показывает список файлов .lpi. Проект может не использовать все эти модули на всех платформах, и, возможно, разработчик забыл добавить все используемые модули.
664+- Модули из использованных пакетов не являются модулями проекта.
732665
733666### Все модули инспектора проекта
734667
735-Чтобы перебрать все паскалевские модули, перечисленные в инспекторе проектов, вы можете использовать, например:
736-```
668+Чтобы перебрать все паскалевские модули, перечисленные в инспекторе проектов, вы можете использовать, например:
669+
670+``` pascal
737671uses
738- LCLProc, FileUtil, LazIDEIntf, ProjectIntf;
739-
740- procedure ListProjectUnits;
741- var
742- LazProject: TLazProject;
743- i: Integer;
744- LazFile: TLazProjectFile;
672+ LCLProc, FileUtil, LazIDEIntf, ProjectIntf;
673+
674+procedure ListProjectUnits;
675+var
676+ LazProject: TLazProject;
677+ i: Integer;
678+ LazFile: TLazProjectFile;
679+begin
680+ LazProject:=LazarusIDE.ActiveProject;
681+ if LazProject<>nil then
682+ for i:=0 to LazProject.FileCount-1 do
745683 begin
746- LazProject:=LazarusIDE.ActiveProject;
747- if LazProject<>nil then
748- for i:=0 to LazProject.FileCount-1 do
749- begin
750- LazFile:=LazProject.Files[i];
751- if LazFile.IsPartOfProject
752- and FilenameIsPascalUnit(LazFile.Filename)
753- then
754- debugln(LazFile.Filename);
755- end;
684+ LazFile:=LazProject.Files[i];
685+ if LazFile.IsPartOfProject
686+ and FilenameIsPascalUnit(LazFile.Filename)
687+ then
688+ debugln(LazFile.Filename);
756689 end;
690+end;
757691```
758692
759693### Все используемые модули проекта
760694
761-Чтобы найти все используемые в настоящее время модули проекта/пакета, вы можете использовать следующее. Обратите внимание, что в среде IDE необходимо проанализировать все модули, поэтому это может занять некоторое время.
762-```
695+Чтобы найти все используемые в настоящее время модули проекта/пакета, вы можете использовать следующее. Обратите внимание, что в среде IDE необходимо проанализировать все модули, поэтому это может занять некоторое время.
696+
697+``` pascal
763698uses
764- LazLoggerBase, LazIDEIntf, ProjectIntf;
765-
766- procedure ListProjectUnits;
767- var
768- LazProject: TLazProject;
769- i: Integer;
770- begin
771- LazProject:=LazarusIDE.ActiveProject;
772- if LazProject<>nil then
773- begin
774- Units:=LazarusIDE.FindUnitsOfOwner(LazProject,[fuooListed,fuooUsed]); // добавьте fuooPackages, чтобы включить модули из пакетов
775- try
776- for i:=0 to Units.Count-1 do
777- debugln('Filename=',Units[i]);
778- finally
779- Units.Free;
780- end;
781- end;
699+ LazLoggerBase, LazIDEIntf, ProjectIntf;
700+
701+procedure ListProjectUnits;
702+var
703+ LazProject: TLazProject;
704+ i: Integer;
705+begin
706+ LazProject:=LazarusIDE.ActiveProject;
707+ if LazProject<>nil then
708+ begin
709+ Units:=LazarusIDE.FindUnitsOfOwner(LazProject,[fuooListed,fuooUsed]); // добавьте fuooPackages, чтобы включить модули из пакетов
710+ try
711+ for i:=0 to Units.Count-1 do
712+ debugln('Filename=',Units[i]);
713+ finally
714+ Units.Free;
782715 end;
716+ end;
717+end;
783718```
784719
785720## Файлы .lpr, .lpi и .lps проекта
786-```
721+
722+``` pascal
787723uses
788- LCLProc, FileUtil, ProjectIntf, LazIDEIntf;
789- var
790- LazProject: TLazProject;
791- begin
792- LazProject:=LazarusIDE.ActiveProject;
793- // у каждого проекта есть файл .lpi:
794- DebugLn(['Файл проекта lpi: ',LazProject.ProjectInfoFile]);
795-
796- // если информация о сеансе проекта хранится в отдельном файле .lps:
797- if LazProject.SessionStorage<>pssNone then
798- DebugLn(['Файл проекта lps: ',LazProject.ProjectSessionFile]);
799-
800- // Если у проекта есть файл .lpr, то он является основным исходным файлом:
801- if (LazProject.MainFile<>nil)
802- and (CompareFileExt(LazProject.MainFile.Filename,'lpr')=0) then
803- DebugLn(['Проект имеет файл lpr: ',LazProject.MainFile.Filename]);
804- end;
724+ LCLProc, FileUtil, ProjectIntf, LazIDEIntf;
725+var
726+ LazProject: TLazProject;
727+begin
728+ LazProject:=LazarusIDE.ActiveProject;
729+ // у каждого проекта есть файл .lpi:
730+ DebugLn(['Файл проекта lpi: ',LazProject.ProjectInfoFile]);
731+
732+ // если информация о сеансе проекта хранится в отдельном файле .lps:
733+ if LazProject.SessionStorage<>pssNone then
734+ DebugLn(['Файл проекта lps: ',LazProject.ProjectSessionFile]);
735+
736+ // Если у проекта есть файл .lpr, то он является основным исходным файлом:
737+ if (LazProject.MainFile<>nil)
738+ and (CompareFileExt(LazProject.MainFile.Filename,'lpr')=0) then
739+ DebugLn(['Проект имеет файл lpr: ',LazProject.MainFile.Filename]);
740+end;
805741```
806742
807743## Имя исполняемого / целевого файла проекта
808744
809-Существует макрос $(TargetFile), который можно использовать в путях и внешних инструментах. Вы можете запросить макрос в коде:
810-```
745+Существует макрос \$(TargetFile), который можно использовать в путях и внешних инструментах. Вы можете запросить макрос в коде:
746+
747+``` pascal
811748uses MacroIntf;
812-
813- function MyGetProjectTargetFile: string;
814- begin
815- Result:='$(TargetFile)';
816- if not IDEMacros.SubstituteMacros(Result) then
817- raise Exception.Create('невозможно получить целевой файл проекта');
818- end;
749+
750+function MyGetProjectTargetFile: string;
751+begin
752+ Result:='$(TargetFile)';
753+ if not IDEMacros.SubstituteMacros(Result) then
754+ raise Exception.Create('невозможно получить целевой файл проекта');
755+end;
819756```
820757
821-См. здесь для более полной информации по макросам: [[IDE Macros in paths and filenames/ru|Макросы IDE в путях и именах файлов]].
758+См. здесь для более полной информации по макросам: [[IDE Macros in paths and filenames/ru|Макросы IDE в путях и именах файлов]].
822759
823760## Добавление своего собственного типа проекта
824761
825-Вы можете добавлять [свои] пункты в диалоговое окно 'New ...':
762+Вы можете добавлять \[свои\] пункты в диалоговое окно 'New ...':
826763
827- * Смотрите модуль ProjectIntf пакета IDEIntf.
828- * См. [[Project Templates/ru|Шаблоны проекта]]
764+- Смотрите модуль ProjectIntf пакета IDEIntf.
765+- См. [[Project Templates/ru|Шаблоны проекта]]
829766
830767## Добавление своих собственных типов файлов
831768
832-Вы можете добавлять [свои] пункты в диалоговое окно 'New ...':
769+Вы можете добавлять \[свои\] пункты в диалоговое окно 'New ...':
833770
834- * Смотрите модуль ProjectIntf пакета IDEIntf.
835- * Выбрав базовый класс TFileDescPascalUnit для обычных модулей или TFileDescPascalUnitWithResource для новой формы/модуля данных.
771+- Смотрите модуль ProjectIntf пакета IDEIntf.
772+- Выбрав базовый класс TFileDescPascalUnit для обычных модулей или TFileDescPascalUnitWithResource для новой формы/модуля данных.
836773
837774### Добавление нового типа файла
838-```
775+
776+``` pascal
839777uses ProjectIntf;
840- ...
841- { TFileDescText }
842-
843- TFileDescMyText = class(TProjectFileDescriptor)
844- public
845- constructor Create; override;
846- function GetLocalizedName: string; override;
847- function GetLocalizedDescription: string; override;
848- end;
849- ...
850-
851- procedure Register;
852-
853- implementation
854-
855- procedure Register;
856- begin
857- RegisterProjectFileDescriptor(TFileDescMyText.Create,FileDescGroupName);
858- end;
859-
860- { TFileDescMyText }
861-
862- constructor TFileDescMyText.Create;
863- begin
864- inherited Create;
865- Name:='MyText'; // не переводите эту [строку]
866- DefaultFilename:='text.txt';
867- AddToProject:=false;
868- end;
869-
870- function TFileDescText.GetLocalizedName: string;
871- begin
872- Result:='My Text'; // замените это строкой из resourcestring
873- end;
874-
875- function TFileDescText.GetLocalizedDescription: string;
876- begin
877- Result:='Пустой текстовый файл';
878- end;
778+...
779+ { TFileDescText }
780+
781+ TFileDescMyText = class(TProjectFileDescriptor)
782+ public
783+ constructor Create; override;
784+ function GetLocalizedName: string; override;
785+ function GetLocalizedDescription: string; override;
786+ end;
787+...
788+
789+procedure Register;
790+
791+implementation
792+
793+procedure Register;
794+begin
795+ RegisterProjectFileDescriptor(TFileDescMyText.Create,FileDescGroupName);
796+end;
797+
798+{ TFileDescMyText }
799+
800+constructor TFileDescMyText.Create;
801+begin
802+ inherited Create;
803+ Name:='MyText'; // не переводите эту [строку]
804+ DefaultFilename:='text.txt';
805+ AddToProject:=false;
806+end;
807+
808+function TFileDescText.GetLocalizedName: string;
809+begin
810+ Result:='My Text'; // замените это строкой из resourcestring
811+end;
812+
813+function TFileDescText.GetLocalizedDescription: string;
814+begin
815+ Result:='Пустой текстовый файл';
816+end;
879817```
880818
881819### Добавление нового типа формы
882-```
820+
821+``` pascal
883822uses ProjectIntf;
884-
885- ...
886- TFileDescPascalUnitWithMyForm = class(TFileDescPascalUnitWithResource)
887- public
888- constructor Create; override;
889- function GetInterfaceUsesSection: string; override;
890- function GetLocalizedName: string; override;
891- function GetLocalizedDescription: string; override;
892- end;
893- ...
894-
895- procedure Register;
896-
897- implementation
898-
899- procedure Register;
900- begin
901- RegisterProjectFileDescriptor(TFileDescPascalUnitWithMyForm.Create,FileDescGroupName);
902- end;
903-
904- { TFileDescPascalUnitWithMyForm }
905-
906- constructor TFileDescPascalUnitWithMyForm.Create;
907- begin
908- inherited Create;
909- Name:='MyForm'; // не переводите эту [строку]
910- ResourceClass:=TMyForm;
911- UseCreateFormStatements:=true;
912- end;
913-
914- function TFileDescPascalUnitWithMyForm.GetInterfaceUsesSection: string;
915- begin
916- Result:='Classes, SysUtils, MyWidgetSet';
917- end;
918-
919- function TFileDescPascalUnitWithForm.GetLocalizedName: string;
920- begin
921- Result:='MyForm'; // замените это строкой из resourcestring
922- end;
923-
924- function TFileDescPascalUnitWithForm.GetLocalizedDescription: string;
925- begin
926- Result:='Создать новую MyForm из примера пакета NotLCLDesigner';
927- end;
928-```
929823
930-## Сохранение пользовательских значений в [файлах] lpi/lps
824+...
825+ TFileDescPascalUnitWithMyForm = class(TFileDescPascalUnitWithResource)
826+ public
827+ constructor Create; override;
828+ function GetInterfaceUsesSection: string; override;
829+ function GetLocalizedName: string; override;
830+ function GetLocalizedDescription: string; override;
831+ end;
832+...
931833
932-Вы можете хранить свои собственные данные с помощью пар имя/значение в CustomData и CustomSessionData.
933-```
934-LazarusIDE.ActiveProject.CustomData['Name']:=Value; // хранится в lpi - x-platform, общие данные
935- LazarusIDE.ActiveProject.CustomSessionData['Name']:=Value; // хранится в lpi - x-platform, общие данные
834+procedure Register;
835+
836+implementation
837+
838+procedure Register;
839+begin
840+ RegisterProjectFileDescriptor(TFileDescPascalUnitWithMyForm.Create,FileDescGroupName);
841+end;
842+
843+{ TFileDescPascalUnitWithMyForm }
844+
845+constructor TFileDescPascalUnitWithMyForm.Create;
846+begin
847+ inherited Create;
848+ Name:='MyForm'; // не переводите эту [строку]
849+ ResourceClass:=TMyForm;
850+ UseCreateFormStatements:=true;
851+end;
852+
853+function TFileDescPascalUnitWithMyForm.GetInterfaceUsesSection: string;
854+begin
855+ Result:='Classes, SysUtils, MyWidgetSet';
856+end;
857+
858+function TFileDescPascalUnitWithForm.GetLocalizedName: string;
859+begin
860+ Result:='MyForm'; // замените это строкой из resourcestring
861+end;
862+
863+function TFileDescPascalUnitWithForm.GetLocalizedDescription: string;
864+begin
865+ Result:='Создать новую MyForm из примера пакета NotLCLDesigner';
866+end;
936867```
937868
869+## Сохранение пользовательских значений в \[файлах\] lpi/lps
870+
871+Вы можете хранить свои собственные данные с помощью пар имя/значение в CustomData и CustomSessionData.
872+
873+`LazarusIDE.ActiveProject.CustomData['Name']:=Value; // хранится в lpi - x-platform, общие данные`\
874+`LazarusIDE.ActiveProject.CustomSessionData['Name']:=Value; // хранится в lpi - x-platform, общие данные`
875+
938876# Пакеты
939877
940-Вы можете выполнять различные действия с [[Lazarus Packages/ru|пакетами]]:
878+Вы можете выполнять различные действия с [[Lazarus Packages/ru|пакетами]]:
941879
942880## Поиск во всех пакетах
943881
944-Переберите все пакеты, загруженные в IDE (начиная с 0.9.29).
945-```
882+Переберите все пакеты, загруженные в IDE (начиная с 0.9.29).
883+
884+``` pascal
946885uses PackageIntf;
947- ...
948- for i:=0 to PackageEditingInterface.GetPackageCount-1 do
949- writeln(PackageEditingInterface.GetPackages(i).Name);
886+...
887+for i:=0 to PackageEditingInterface.GetPackageCount-1 do
888+ writeln(PackageEditingInterface.GetPackages(i).Name);
950889```
951890
952-## Поиск в пакетах с [определенным] именем
953-```
891+## Поиск в пакетах с \[определенным\] именем
892+
893+``` pascal
954894uses PackageIntf;
895+...
896+var
897+ Pkg: TIDEPackage;
898+begin
899+ Pkg:=PackageEditingInterface.FindPackageWithName('LCL');
900+ if Pkg<>nil then
955901 ...
956- var
957- Pkg: TIDEPackage;
958- begin
959- Pkg:=PackageEditingInterface.FindPackageWithName('LCL');
960- if Pkg<>nil then
961- ...
962- end;
902+end;
963903```
964904
965-![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Примечание:** FindPackageWithName не открывает редактор пакетов. Для этого используйте DoOpenPackageWithName.
905+> **Note:** FindPackageWithName не открывает редактор пакетов. Для этого используйте DoOpenPackageWithName.
966906
967907## Получение имени файла lpk установленного пакета
968-```
908+
909+``` pascal
969910uses PackageIntf;
970- ...
971- var
972- Pkg: TIDEPackage;
973- begin
974- Pkg:=PackageEditingInterface.FindPackageWithName('LCL');
975- if Pkg<>nil then
976- LPKFilename:=Pkg.Filename;
977- end;
911+...
912+var
913+ Pkg: TIDEPackage;
914+begin
915+ Pkg:=PackageEditingInterface.FindPackageWithName('LCL');
916+ if Pkg<>nil then
917+ LPKFilename:=Pkg.Filename;
918+end;
978919```
979920
980921## Установка пакетов
981922
982-![Light bulb](https://upload.wikimedia.org/wikipedia/commons/d/d8/Nuvola_apps_ktip.png) **Примечание:** Устанавливайте только пакеты с плагинами IDE. Установка других пакетов может привести к нестабильной работе среды IDE.
983-```
923+> **Note:** Устанавливайте только пакеты с плагинами IDE. Установка других пакетов может привести к нестабильной работе среды IDE.
924+
925+``` pascal
984926uses PackageIntf, contnrs;
985- ...
986- PkgList:=TObjectList.create(true);
987- try
988- Pkg:=TLazPackageID.Create;
989- Pkg.Name:='Cody';
990- PkgList.Add(Pkg);
991- // проверьте, может ли IDE найти cody.lpk и все зависимости
992- // Среда IDE покажет некоторые предупреждения/подтверждения, если что-то выглядит странно.
993- if not PackageEditingInterface.CheckInstallPackageList(PkgList,[]) then
994- exit;
995- // в этом примере мы [это] уже проверили, поэтому пропустите предупреждения
996- // и пересоберите IDE
997- if PackageEditingInterface.InstallPackages(PkgList,[piiifSkipChecks,piiifRebuildIDE])<>mrOK then
998- exit;
999- finally
1000- PkgList.Free;
1001- end;
927+...
928+ PkgList:=TObjectList.create(true);
929+ try
930+ Pkg:=TLazPackageID.Create;
931+ Pkg.Name:='Cody';
932+ PkgList.Add(Pkg);
933+ // проверьте, может ли IDE найти cody.lpk и все зависимости
934+ // Среда IDE покажет некоторые предупреждения/подтверждения, если что-то выглядит странно.
935+ if not PackageEditingInterface.CheckInstallPackageList(PkgList,[]) then
936+ exit;
937+ // в этом примере мы [это] уже проверили, поэтому пропустите предупреждения
938+ // и пересоберите IDE
939+ if PackageEditingInterface.InstallPackages(PkgList,[piiifSkipChecks,piiifRebuildIDE])<>mrOK then
940+ exit;
941+ finally
942+ PkgList.Free;
943+ end;
1002944```
1003945
1004946## Открытие файла пакета (lpk)
1005-```
947+
948+``` pascal
1006949uses PackageIntf, FileUtil;
1007- ...
1008- var
1009- pkg: TIDEPackage;
1010- begin
1011- if PackageEditingInterface.DoOpenPackageFile(LPKFilename,[pofAddToRecent],false)<>mrOk then
1012- exit;
1013- Pkg:=PackageEditingInterface.FindPackageWithName(ExtractFilenameOnly(LPKFilename));
1014- ...
1015- end;
950+...
951+var
952+ pkg: TIDEPackage;
953+begin
954+ if PackageEditingInterface.DoOpenPackageFile(LPKFilename,[pofAddToRecent],false)<>mrOk then
955+ exit;
956+ Pkg:=PackageEditingInterface.FindPackageWithName(ExtractFilenameOnly(LPKFilename));
957+ ...
958+end;
1016959```
1017960
1018-[![Warning-icon.png](/wiki-images/b/b2/Warning-icon.png)](</File:Warning-icon.png>)
1019-
1020-**Предупреждение:** Среда IDE автоматически закрывает неиспользуемые пакеты в режиме ожидания. Никогда не храните ссылку на TIDEPackage.
961+> **Warning:** Среда IDE автоматически закрывает неиспользуемые пакеты в режиме ожидания. Никогда не храните ссылку на TIDEPackage.
1021962
1022963## Поиск пакета(-ов) модуля
1023964
1024-У вас есть имя файла модуля, например '/home/user/unit.pas', и [если] вы хотите знать, какому пакету(-ам) и проекту(-ам) он принадлежит, используйте это:
1025-```
965+У вас есть имя файла модуля, например '/home/user/unit.pas', и \[если\] вы хотите знать, какому пакету(-ам) и проекту(-ам) он принадлежит, используйте это:
966+
967+``` pascal
1026968uses Classes, PackageIntf, ProjectIntf;
1027- ...
1028- var
1029- Owners: TFPList;
1030- i: Integer;
1031- o: TObject;
1032- begin
1033- Owners:=PackageEditingInterface.GetPossibleOwnersOfUnit('/full/path/of/unit.pas',[]);
1034- if Owners=nil then begin
1035- // модуль не связан напрямую с проектом/пакетом
1036- // возможно модуль был по какой-то причине не добавлен, но доступен
1037- // поиск по всем путям модулей всех проектов/пакетов
1038- // Осторожно: это может привести к ложным попаданиям
1039- Owners:=PackageEditingInterface.GetPossibleOwnersOfUnit('/full/path/of/unit.pas',
1040- [piosfExcludeOwned,piosfIncludeSourceDirectories]);
1041- end;
1042- if Owners=nil then exit;
1043- try
1044- for i:=0 to Owners.Count-1 do begin
1045- o:=TObject(Owners[i]);
1046- if o is TIDEPackage then begin
1047- writeln('Owner is package ',TIDEPackage(o).Name);
1048- end else if o is TLazProject then begin
1049- writeln('Owner is project ',TLazProject(o).ProjectInfoFile);
1050- end;
1051- end;
1052- finally
1053- Owners.Free;
969+...
970+var
971+ Owners: TFPList;
972+ i: Integer;
973+ o: TObject;
974+begin
975+ Owners:=PackageEditingInterface.GetPossibleOwnersOfUnit('/full/path/of/unit.pas',[]);
976+ if Owners=nil then begin
977+ // модуль не связан напрямую с проектом/пакетом
978+ // возможно модуль был по какой-то причине не добавлен, но доступен
979+ // поиск по всем путям модулей всех проектов/пакетов
980+ // Осторожно: это может привести к ложным попаданиям
981+ Owners:=PackageEditingInterface.GetPossibleOwnersOfUnit('/full/path/of/unit.pas',
982+ [piosfExcludeOwned,piosfIncludeSourceDirectories]);
983+ end;
984+ if Owners=nil then exit;
985+ try
986+ for i:=0 to Owners.Count-1 do begin
987+ o:=TObject(Owners[i]);
988+ if o is TIDEPackage then begin
989+ writeln('Owner is package ',TIDEPackage(o).Name);
990+ end else if o is TLazProject then begin
991+ writeln('Owner is project ',TLazProject(o).ProjectInfoFile);
1054992 end;
993+ end;
994+ finally
995+ Owners.Free;
996+ end;
1055997```
1056998
1057999# Окна
10581000
1059-Есть четыре основных типа окон IDE.
1001+Есть четыре основных типа окон IDE.
10601002
1061- * основная панель IDE - это Application.MainForm. Оно всегда присутствует.
1062- * плавающие / закрепляемые окна, такие как Редактор исходного кода, Инспекторы объектов и Сообщения.
1063- * модальные формы, такие как диалог поиска, диалоги настроек и вопросы.
1064- * подсказки и заполнение форм
1003+- основная панель IDE - это Application.MainForm. Оно всегда присутствует.
1004+- плавающие / закрепляемые окна, такие как Редактор исходного кода, Инспекторы объектов и Сообщения.
1005+- модальные формы, такие как диалог поиска, диалоги настроек и вопросы.
1006+- подсказки и заполнение форм
10651007
10661008## Добавление нового закрепляемого окна IDE
10671009
1068-Что такое закрепляемое окно IDE: Окна, такие как Редактор исходного кода или Инспектор объектов, являются плавающими окнами, которые можно закрепить, если установлен пакет закрепления, а его состояние, положение и размер сохраняются и восстанавливаются при следующем запуске IDE. Для восстановления окна IDE нужен создатель, как определено в модуле **IDEWindowIntf** пакета IDEIntf. Каждое закрепляемое окно должно иметь уникальное имя. Не используйте общие имена, такие как 'FileBrowser', потому что это будет легко конфликтовать с другими пакетами. И не используйте короткие имена, такие как 'XYZ', потому что создатель отвечает за все формы, начинающиеся с этого имени.
1010+Что такое закрепляемое окно IDE: Окна, такие как Редактор исходного кода или Инспектор объектов, являются плавающими окнами, которые можно закрепить, если установлен пакет закрепления, а его состояние, положение и размер сохраняются и восстанавливаются при следующем запуске IDE. Для восстановления окна IDE нужен создатель, как определено в модуле **IDEWindowIntf** пакета IDEIntf. Каждое закрепляемое окно должно иметь уникальное имя. Не используйте общие имена, такие как 'FileBrowser', потому что это будет легко конфликтовать с другими пакетами. И не используйте короткие имена, такие как 'XYZ', потому что создатель отвечает за все формы, начинающиеся с этого имени.
10691011
10701012### Как зарегистрировать закрепляемое окно IDE
10711013
1072-Не забудьте выбрать длинное уникальное имя, которое является действительным идентификатором Паскаля. Ваше окно может иметь любой заголовок, который вы хотите.
1073-```
1014+Не забудьте выбрать длинное уникальное имя, которое является действительным идентификатором Паскаля. Ваше окно может иметь любой заголовок, который вы хотите.
1015+
1016+``` pascal
10741017uses SysUtils, IDEWindowIntf;
1075- ...
1076- var MyIDEWindow: TMyIDEWindow = nil;
1077-
1078- procedure CreateMyIDEWindow(Sender: TObject; aFormName: string; var AForm: TCustomForm; DoDisableAutoSizing: boolean);
1079- begin
1080- // проверяем имя
1081- if CompareText(aFormName,MyIDEWindowName)<>0 then exit;
1082- // создаем форму, если это еще не сделано, и отключаем автомасштабирование
1083- IDEWindowCreators.CreateForm(MyIDEWindow,TMyIDEWindowm,DoDisableAutosizing,Application);
1084- ... инициируем окно ...
1085- AForm:=MyIDEWindow;
1086- end;
1087-
1088- procedure Register;
1089- begin
1090- IDEWindowCreators.Add('MyIDEWindow',@CreateMyIDEWindow,nil,'100','50%','+300','+20%');
1091- // стандартная граница формы - это:
1092- // Left=100, Top=50% от [величины] Screen.Height, Width=300, Height=20% от [величины] Screen.Height
1093- // когда IDE требуется экземпляр этого окна, она вызывает процедуру CreateMyIDEWindow.
1094- end;
1018+...
1019+var MyIDEWindow: TMyIDEWindow = nil;
1020+
1021+procedure CreateMyIDEWindow(Sender: TObject; aFormName: string; var AForm: TCustomForm; DoDisableAutoSizing: boolean);
1022+begin
1023+ // проверяем имя
1024+ if CompareText(aFormName,MyIDEWindowName)<>0 then exit;
1025+ // создаем форму, если это еще не сделано, и отключаем автомасштабирование
1026+ IDEWindowCreators.CreateForm(MyIDEWindow,TMyIDEWindowm,DoDisableAutosizing,Application);
1027+ ... инициируем окно ...
1028+ AForm:=MyIDEWindow;
1029+end;
1030+
1031+procedure Register;
1032+begin
1033+ IDEWindowCreators.Add('MyIDEWindow',@CreateMyIDEWindow,nil,'100','50%','+300','+20%');
1034+ // стандартная граница формы - это:
1035+ // Left=100, Top=50% от [величины] Screen.Height, Width=300, Height=20% от [величины] Screen.Height
1036+ // когда IDE требуется экземпляр этого окна, она вызывает процедуру CreateMyIDEWindow.
1037+end;
10951038```
10961039
10971040### Отображение окна IDE
10981041
1099-[![Warning-icon.png](/wiki-images/b/b2/Warning-icon.png)](</File:Warning-icon.png>)
1042+> **Warning:** Не используйте \[процедуру\] Show.
11001043
1101-**Предупреждение:** Не используйте [процедуру] Show.
1044+`Используйте:`
11021045
1103-Используйте:
1104-```
1046+``` pascal
11051047IDEWindowCreators.ShowForm(MyIDEWindow,false);
11061048```
11071049
1108-Это будет работать с [механизмом] пристыковки. Система пристыковки может обернуть форму в стыковочный узел. Параметр BringToFront указывает системе закрепления сделать форму и все ее родительские сайты видимыми и вывести сайт верхнего уровня вперед.
1050+Это будет работать с \[механизмом\] пристыковки. Система пристыковки может обернуть форму в стыковочный узел. Параметр BringToFront указывает системе закрепления сделать форму и все ее родительские сайты видимыми и вывести сайт верхнего уровня вперед.
11091051
11101052### Заметки о IDEWindowCreators и SimpleLayoutStorage
11111053
1112-IDEWindowCreators.SimpleLayoutStorage просто хранит BoundsRect и WindowState всех форм, которые когда-то были открыты. Он используется как запасной вариант, если не установлен док-мастер. Он сохраняет состояние, даже если установлен DockMaster, поэтому, когда dockmaster удален, границы форм восстанавливаются.
1054+IDEWindowCreators.SimpleLayoutStorage просто хранит BoundsRect и WindowState всех форм, которые когда-то были открыты. Он используется как запасной вариант, если не установлен док-мастер. Он сохраняет состояние, даже если установлен DockMaster, поэтому, когда dockmaster удален, границы форм восстанавливаются.
11131055
1114-IDEWindowCreators используется всеми присоединяемыми формами для регистрации и отображения форм. При показе формы Создатель проверяет, установлен ли IDEDockMaster, и передает ему отображение. Если IDEDockMaster не установлен, он просто показывает форму. IDEDockMaster может использовать информацию в IDEWindowCreators для создания форм по именам и получить представление о том, где разместить форму при ее первом отображении. Для более подробной информации смотрите пакеты AnchorDockingDsgn и EasyDockMgDsgn.
1056+IDEWindowCreators используется всеми присоединяемыми формами для регистрации и отображения форм. При показе формы Создатель проверяет, установлен ли IDEDockMaster, и передает ему отображение. Если IDEDockMaster не установлен, он просто показывает форму. IDEDockMaster может использовать информацию в IDEWindowCreators для создания форм по именам и получить представление о том, где разместить форму при ее первом отображении. Для более подробной информации смотрите пакеты AnchorDockingDsgn и EasyDockMgDsgn.
11151057
11161058# CodeTools
11171059
1118-CodeTools - это пакет, предоставляющий огромное количество функций для анализа, поиска и изменения исходных текстов, а также некоторые основные функции для других языков. Вы можете использовать их также и без IDE. Рекомендуется сначала прочитать о CodeTools в целом, прежде чем использовать их в IDE: [[Codetools]].
1060+CodeTools - это пакет, предоставляющий огромное количество функций для анализа, поиска и изменения исходных текстов, а также некоторые основные функции для других языков. Вы можете использовать их также и без IDE. Рекомендуется сначала прочитать о CodeTools в целом, прежде чем использовать их в IDE: [[Codetools]].
11191061
1120-Перед вызовом любой из функций CodeTools в IDE вы должны зафиксировать текущие изменения редактора исходного кода в буферах CodeTools:
1121-```
1062+Перед вызовом любой из функций CodeTools в IDE вы должны зафиксировать текущие изменения редактора исходного кода в буферах CodeTools:
1063+
1064+``` pascal
11221065uses LazIDEIntf;
1123- ...
1124- // сохраняем изменения в редакторе исходного кода в codetools
1125- LazarusIDE.SaveSourceEditorChangesToCodeCache(-1); // -1: фиксируем все редакторы исходного кода
1066+...
1067+ // сохраняем изменения в редакторе исходного кода в codetools
1068+ LazarusIDE.SaveSourceEditorChangesToCodeCache(-1); // -1: фиксируем все редакторы исходного кода
11261069```
11271070
11281071## Добавление директивы ресурса в файл
11291072
1130-Это добавляет {$R example.res} к модулю паскаля:
1131-```
1073+Это добавляет {\$R example.res} к модулю паскаля:
1074+
1075+``` pascal
11321076procedure AddResourceDirectiveToPascalSource(const Filename: string);
1133- var
1134- ExpandedFilename: String;
1135- CodeBuf: TCodeBuffer;
1136- begin
1137- // убеждаемся, что имя файла обрезано [от концевых пробелов] и содержит полный путь
1138- ExpandedFilename:=CleanAndExpandFilename(Filename);
1139-
1140- // сохраняем изменения в редакторе исходного кода в codetools
1141- LazarusIDE.SaveSourceEditorChangesToCodeCache(-1);
1142-
1143- // загружаем файл
1144- CodeBuf:=CodeToolBoss.LoadFile(ExpandedFilename,true,false);
1145-
1146- // добавляем директиву ресурса
1147- if not CodeToolBoss.AddResourceDirective(CodeBuf,'example.res') then
1148- LazarusIDE.DoJumpToCodeToolBossError;
1149- end;
1077+var
1078+ ExpandedFilename: String;
1079+ CodeBuf: TCodeBuffer;
1080+begin
1081+ // убеждаемся, что имя файла обрезано [от концевых пробелов] и содержит полный путь
1082+ ExpandedFilename:=CleanAndExpandFilename(Filename);
1083+
1084+ // сохраняем изменения в редакторе исходного кода в codetools
1085+ LazarusIDE.SaveSourceEditorChangesToCodeCache(-1);
1086+
1087+ // загружаем файл
1088+ CodeBuf:=CodeToolBoss.LoadFile(ExpandedFilename,true,false);
1089+
1090+ // добавляем директиву ресурса
1091+ if not CodeToolBoss.AddResourceDirective(CodeBuf,'example.res') then
1092+ LazarusIDE.DoJumpToCodeToolBossError;
1093+end;
11501094```
11511095
1152-Codetools также предоставляет такие функции, как FindResourceDirective и RemoveDirective.
1096+Codetools также предоставляет такие функции, как FindResourceDirective и RemoveDirective.
11531097
11541098## Получение путей поиска для модулей и включаемых файлов
11551099
1156-В среде IDE существует множество различных путей поиска из проектов, пакетов, каталога fpc и lazarus, и существует множество типов путей: до или после разрешения макросов, с унаследованными путями поиска или без них, как относительными или абсолютными путями. Все файлы в каталоге имеют одинаковый набор путей поиска. Вы можете получить пути поиска для каждого каталога, полностью решенного путем запроса codetools:
1157-```
1100+В среде IDE существует множество различных путей поиска из проектов, пакетов, каталога fpc и lazarus, и существует множество типов путей: до или после разрешения макросов, с унаследованными путями поиска или без них, как относительными или абсолютными путями. Все файлы в каталоге имеют одинаковый набор путей поиска. Вы можете получить пути поиска для каждого каталога, полностью решенного путем запроса codetools:
1101+
1102+``` pascal
11581103uses CodeToolManager;
1159- ...
1160-
1161- Dir:=''; // пустой каталог для новых файлов и имеет те же настройки, что и каталог проекта
1162-
1163- // Получение путей поиска для включаемых файлов:
1164- Path:=CodeToolBoss.GetIncludePathForDirectory(Dir);
1165-
1166- // Получение путей поиска для модулей:
1167- // Этот путь поиска передается компилятору.
1168- // Он содержит выходные каталоги пакетов, но не каталоги с исходниками пакетов.
1169- Path:=CodeToolBoss.GetUnitPathForDirectory(Dir);
1170-
1171- // Могут быть дополнительные пути поиска модулей только для IDE (не передаются компилятору)
1172- Path:=CodeToolBoss.GetSrcPathForDirectory(Dir);
1173-
1174- // Полный путь поиска содержит также все исходные пути пакета для модулей:
1175- Path:=CodeToolBoss.GetCompleteSrcPathForDirectory(Dir);
1104+...
1105+
1106+Dir:=''; // пустой каталог для новых файлов и имеет те же настройки, что и каталог проекта
1107+
1108+// Получение путей поиска для включаемых файлов:
1109+Path:=CodeToolBoss.GetIncludePathForDirectory(Dir);
1110+
1111+// Получение путей поиска для модулей:
1112+// Этот путь поиска передается компилятору.
1113+// Он содержит выходные каталоги пакетов, но не каталоги с исходниками пакетов.
1114+Path:=CodeToolBoss.GetUnitPathForDirectory(Dir);
1115+
1116+// Могут быть дополнительные пути поиска модулей только для IDE (не передаются компилятору)
1117+Path:=CodeToolBoss.GetSrcPathForDirectory(Dir);
1118+
1119+// Полный путь поиска содержит также все исходные пути пакета для модулей:
1120+Path:=CodeToolBoss.GetCompleteSrcPathForDirectory(Dir);
11761121```
11771122
11781123# Редактор исходного кода
11791124
11801125## Активный редактор исходного кода
1181-```
1126+
1127+``` pascal
11821128uses SrcEditorIntf;
1183- ...
1184- Editor:=SourceEditorManagerIntf.ActiveEditor;
1185- if Editor=nil then exit;
1186- Filename:=Editor.FileName;
1187- ScreenPos:=Editor.CursorScreenXY;
1188- TextPos:=Editor.CursorTextXY;
1129+...
1130+Editor:=SourceEditorManagerIntf.ActiveEditor;
1131+if Editor=nil then exit;
1132+Filename:=Editor.FileName;
1133+ScreenPos:=Editor.CursorScreenXY;
1134+TextPos:=Editor.CursorTextXY;
11891135```
11901136
11911137# SynEdit
11921138
11931139## Получение настроек для TSynEdit
11941140
1195-Если у вас есть диалог с использованием TSynEdit, и вы хотите использовать тот же шрифт и настройки, которые использует редактор исходного кода:
1196-```
1141+Если у вас есть диалог с использованием TSynEdit, и вы хотите использовать тот же шрифт и настройки, которые использует редактор исходного кода:
1142+
1143+``` pascal
11971144uses SrcEditorIntf;
1198- ...
1199- SourceEditorManagerIntf.GetEditorControlSettings(ASynEdit);
1145+...
1146+SourceEditorManagerIntf.GetEditorControlSettings(ASynEdit);
12001147```
12011148
12021149## Получение настроек для подсветки SynEdit
12031150
1204-Если у вас есть диалог, использующий TSynEdit с подсветкой, и вы хотите использовать те же цвета, что и для подсветки редактора исходного кода для этого языка, используйте:
1205-```
1151+Если у вас есть диалог, использующий TSynEdit с подсветкой, и вы хотите использовать те же цвета, что и для подсветки редактора исходного кода для этого языка, используйте:
1152+
1153+``` pascal
12061154uses SrcEditorIntf;
1207- ...
1208- SourceEditorManagerIntf.GetHighlighterSettings(ASynHighlighter);
1155+...
1156+SourceEditorManagerIntf.GetHighlighterSettings(ASynHighlighter);
12091157```
12101158
1211-См. пример: TSQLStringsPropertyEditorDlg.Create in the unit [SQLStringsPropertyEditorDlg](<http://svn.freepascal.org/svn/lazarus/trunk/components/sqldb/sqlstringspropertyeditordlg.pas>).
1159+См. пример: TSQLStringsPropertyEditorDlg.Create in the unit [SQLStringsPropertyEditorDlg](http://svn.freepascal.org/svn/lazarus/trunk/components/sqldb/sqlstringspropertyeditordlg.pas).
12121160
12131161# Справка
12141162
12151163## Добавление справки для исходников
12161164
1217-Сначала создаем THelpDatabase:
1218-```
1165+Сначала создаем THelpDatabase:
1166+
1167+``` pascal
12191168HelpDB := TFPDocHTMLHelpDatabase(
1220- HelpDatabases.CreateHelpDatabase('ANameOfYourChoiceForTheDatabase',
1221- TFPDocHTMLHelpDatabase,true));
1222- HelpDB.DefaultBaseURL := 'http://your.help.org/';
1223-
1224- FPDocNode := THelpNode.CreateURL(HelpDB,
1225- 'Package1 - A new package',
1226- 'file://index.html');
1227- HelpDB.TOCNode := THelpNode.Create(HelpDB,FPDocNode);// один раз как оглавление TOC
1228- DirectoryItem := THelpDBISourceDirectory.Create(FPDocNode,'$(PkgDir)/lcl',
1229- '*.pp;*.pas',false);// и один раз как обычная страница
1230- HelpDB.RegisterItem(DirectoryItem);
1169+ HelpDatabases.CreateHelpDatabase('ANameOfYourChoiceForTheDatabase',
1170+ TFPDocHTMLHelpDatabase,true));
1171+HelpDB.DefaultBaseURL := 'http://your.help.org/';
1172+
1173+FPDocNode := THelpNode.CreateURL(HelpDB,
1174+ 'Package1 - A new package',
1175+ 'file://index.html');
1176+HelpDB.TOCNode := THelpNode.Create(HelpDB,FPDocNode);// один раз как оглавление TOC
1177+DirectoryItem := THelpDBISourceDirectory.Create(FPDocNode,'$(PkgDir)/lcl',
1178+ '*.pp;*.pas',false);// и один раз как обычная страница
1179+HelpDB.RegisterItem(DirectoryItem);
12311180```
12321181
12331182## Добавление строк в окно сообщений
1234-```
1183+
1184+``` pascal
12351185unit IDEMsgIntf;
1236- ...
1237- var Dir: String;
1238- begin
1239- Dir:=GetCurrentDir;
1240- IDEMessagesWindow.BeginBlock;
1241- IDEMessagesWindow.AddMsg('unit1.pas(30,4) Error: Identifier not found "a"',Dir,0);
1242- IDEMessagesWindow.EndBlock;
1243- end;
1186+...
1187+var Dir: String;
1188+begin
1189+ Dir:=GetCurrentDir;
1190+ IDEMessagesWindow.BeginBlock;
1191+ IDEMessagesWindow.AddMsg('unit1.pas(30,4) Error: Identifier not found "a"',Dir,0);
1192+ IDEMessagesWindow.EndBlock;
1193+end;
12441194```
12451195
12461196# Окно настроек IDE
12471197
12481198## Открытие параметров в определенном кадре
1249-```
1199+
1200+``` pascal
12501201uses LazIDEIntf;
1251- ...
1252- LazarusIDE.DoOpenIDEOptions(TYourIDEOptionsFrame);
1202+...
1203+LazarusIDE.DoOpenIDEOptions(TYourIDEOptionsFrame);
12531204```
12541205
12551206# Прочее
12561207
12571208## Добавление макроса
12581209
1259-Вы можете добавить свои собственные макросы IDE:
1260-```
1210+Вы можете добавить свои собственные макросы IDE:
1211+
1212+``` pascal
12611213uses MacroIntf, MacroDefIntf;
1262-
1263- procedure Register;
1264- begin
1265- // регистрация макроса с фиксированным значением:
1266- IDEMacros.Add(TTransferMacro.Create('MyMacro1','Value','Description',nil,[]));
1267- end;
1268-
1269- // регистрация макроса с динамическим значением требует метода объекта
1270- procedure TForm1.Init;
1271- begin
1272- IDEMacros.Add(TTransferMacro.Create('MyMacro','Value','Description',@OnResolveMyMacro,[]));
1273- end;
1274-
1275- function TForm1.OnResolveMyMacro(const s: string; const Data: PtrInt;
1276- var Abort: boolean): string;
1277- // s - это параметр. Например, $MyMacro(parameter)
1278- // Data - это экземпляр запроса. Может быть nil.
1279- // Если есть ошибка, установите Abort в true.
1280- // Результирующая строка может содержать макросы. Например, Result:='$(FPCVer)/$(TargetOS)';
1281- begin
1282- Result:='MyValue';
1283- end;
1214+
1215+procedure Register;
1216+begin
1217+ // регистрация макроса с фиксированным значением:
1218+ IDEMacros.Add(TTransferMacro.Create('MyMacro1','Value','Description',nil,[]));
1219+end;
1220+
1221+// регистрация макроса с динамическим значением требует метода объекта
1222+procedure TForm1.Init;
1223+begin
1224+ IDEMacros.Add(TTransferMacro.Create('MyMacro','Value','Description',@OnResolveMyMacro,[]));
1225+end;
1226+
1227+function TForm1.OnResolveMyMacro(const s: string; const Data: PtrInt;
1228+ var Abort: boolean): string;
1229+// s - это параметр. Например, $MyMacro(parameter)
1230+// Data - это экземпляр запроса. Может быть nil.
1231+// Если есть ошибка, установите Abort в true.
1232+// Результирующая строка может содержать макросы. Например, Result:='$(FPCVer)/$(TargetOS)';
1233+begin
1234+ Result:='MyValue';
1235+end;
12841236```
12851237
12861238## Отладка IDE
12871239
1288- * Скомпилируйте IDE как обычно, например, с помощью Tools/Build Lazarus. Убедитесь, что вы установили отладочные флаги, такие как -g или -gw2. Лучше всего использовать профиль "Debug IDE", который содержит много флагов, полезных для отладки.
1289- * Откройте проект ide\lazarus.lpi. Вы не можете напрямую скомпилировать этот проект.
1290- * Установите точки останова и пр. И запустите проект.
1240+- Скомпилируйте IDE как обычно, например, с помощью Tools/Build Lazarus. Убедитесь, что вы установили отладочные флаги, такие как -g или -gw2. Лучше всего использовать профиль "Debug IDE", который содержит много флагов, полезных для отладки.
1241+- Откройте проект ide\lazarus.lpi. Вы не можете напрямую скомпилировать этот проект.
1242+- Установите точки останова и пр. И запустите проект.
12911243
12921244## См. также
12931245
1294- * [[Creating IDE Help]]
1295- * [[Help protocol]]
1296- * [[How To Write Lazarus Component]]
1246+- [[Creating IDE Help]]
1247+- [[Help protocol]]
1248+- [[How To Write Lazarus Component]]
12971249
12981250---
1299-*From the Free Pascal wiki, page "Extending the IDE/ru", as the Internet Archive kept it on 2023-12-03. 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](/wiki-contact).*
1251+*From the Free Pascal wiki, page "Extending the IDE/ru", as it stood on 2020-02-14 after a change by Trev, out of the wiki's dump of 2024-05-26. 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](/wiki-contact).*

Back to history