Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.17.190.143] |
|
Сообщ.
#1
,
|
|
|
Здравствуйте, коллеги!
Пишу компонент. Необходимо получить список всех форм приложения в design-time. Т.е. такой список, который мы имеем в Project->Options->Forms. Кто-нибудь знает, как это можно сделать? вариант for i := 0 to Application.ComponentCount-1 do if Application.Components[i] is TForm then {add to list}; не подходит, т.к. в список попадает куча форм IDE, но совсем не те, что в проекте... Условие типа if (Application.Components[i] is TForm) and (csDesigning in Application.Components[i].ComponentState) then {add to list}; вообще не выполняется ни разу... код for i := 0 to Screen.FormCount-1 do begin ... AddToList(Screen.Forms[i].Name); ... end; возвращает такой список (тоже не то, что нужно): MessageViewForm ProjectManagerForm BorlandEditorCodeExplorer EditorStatusControlForm ... Есть идеи или советы? Спасибо за помощь! |
Сообщ.
#2
,
|
|
|
Ну так конечно, Application в дизайн-тайме может быть только один - и это IDE. А надежно получить список форм в проекте, думаю, нереально.
|
Сообщ.
#3
,
|
|
|
Список форм проэкта в дизайнере можно получить через TooplsAPI
Добавлено IOTAProject40 = interface(IOTAModule) function GetModuleCount: Integer; function GetModule(Index: Integer): IOTAModuleInfo; end; |
Сообщ.
#4
,
|
|
|
А как насчет Designer.GetProjectModules и IOTAProject.GetModule - вроде как они должны возвращать FormName?
Добавлено Уп-с. Опять прокопался и не обновил страничку... |
Сообщ.
#5
,
|
|
|
DimaBr,leo, спасибо за подсказки с IOTA. Мне удалось получить список форм! Ура!
Теперь следующий момент - как получить список компонетов на этих формах? И еще лучше не просто список, а их экземпляр в памяти, со всеми загруженными настройками? Или, как вариант, как получить доступ к экземплярам форм? (А дальше по RTTI...) Спасибо за помощь!!! |
Сообщ.
#6
,
|
|
|
function OTAModuleServices: IOTAModuleServices; begin Supports(BorlandIDEServices,IOTAModuleServices,Result) end; function GetFormEditor(Module: IOTAModule = nil): IOTAFormEditor; var i: integer; begin Result := nil; if not Assigned(Module) then Module := OTAModuleServices.CurrentModule; if not Assigned(Module) then Exit; for i := 0 to Module.GetModuleFileCount - 1 do if Supports(Module.GetModuleFileEditor(i),IOTAFormEditor, Result) then Break; end; var FE: IOTAFormEditor; SC: IOTAComponent; Form: TForm; begin FE := GetFormEditor; if not Assigned(FE) then Exit; SC := FE.GetRootComponent; if not Assigned(SC) then Exit; Form := TForm(SC.GetComponentHandle); if not Assigned(Form) then Exit; // вот сама форма в дизайнере for i := 0 to Form.ComponentCount-1 do Form.Components[i] |
Сообщ.
#7
,
|
|
|
DimaBr, вот это выручили!!! Огромное спасибо!
Добавлено DimaBr, вот это выручили!!! SC := FE.GetRootComponent ... Form := TForm(SC.GetComponentHandle) Огромное спасибо!!!!! |