На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Обязательно выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Этот раздел предназначен для вопросов, посвященных разработке компонентов, а также для тестирования собственных бесплатных компонентов с открытым исходным кодом.

Здесь запрещается:
1. Размещать ссылки на какие-либо коммерческие компоненты, реализующие требуемую функциональность.
2. Обсуждать и тестировать коммерческие компоненты или компоненты с закрытым кодом.
3. Давать ссылки на сайты с исходным кодом компонентов. Все тестируемые исходные коды должы быть размещены на сайте ИСХОДНИКИ.RU.
Модераторы: Rouse_, DimaBr
  
> Как получить список форм приложеня в Design-time?
    Здравствуйте, коллеги!

    Пишу компонент. Необходимо получить список всех форм приложения в design-time.
    Т.е. такой список, который мы имеем в Project->Options->Forms.
    Кто-нибудь знает, как это можно сделать?

    вариант
    ExpandedWrap disabled
      for i := 0 to Application.ComponentCount-1 do
        if Application.Components[i] is TForm then {add to list};

    не подходит, т.к. в список попадает куча форм IDE, но совсем не те, что в проекте...

    Условие типа
    ExpandedWrap disabled
      if (Application.Components[i] is TForm) and (csDesigning in Application.Components[i].ComponentState) then {add to list};

    вообще не выполняется ни разу...

    код
    ExpandedWrap disabled
      for i := 0 to Screen.FormCount-1 do begin
        ...
        AddToList(Screen.Forms[i].Name);
        ...
      end;


    возвращает такой список (тоже не то, что нужно):
    ExpandedWrap disabled
      MessageViewForm
      ProjectManagerForm
      BorlandEditorCodeExplorer
      EditorStatusControlForm

    ...


    Есть идеи или советы?

    Спасибо за помощь!
      Ну так конечно, Application в дизайн-тайме может быть только один - и это IDE. А надежно получить список форм в проекте, думаю, нереально.
        Список форм проэкта в дизайнере можно получить через TooplsAPI

        Добавлено
        ExpandedWrap disabled
          IOTAProject40 = interface(IOTAModule)
              function GetModuleCount: Integer;
              function GetModule(Index: Integer): IOTAModuleInfo;
            end;
          А как насчет Designer.GetProjectModules и IOTAProject.GetModule - вроде как они должны возвращать FormName?

          Добавлено
          Уп-с. Опять прокопался и не обновил страничку... :blush:
            DimaBr,leo, спасибо за подсказки с IOTA. Мне удалось получить список форм! Ура! :)
            Теперь следующий момент - как получить список компонетов на этих формах?
            И еще лучше не просто список, а их экземпляр в памяти, со всеми загруженными настройками?
            Или, как вариант, как получить доступ к экземплярам форм? (А дальше по RTTI...)

            Спасибо за помощь!!!
              ExpandedWrap disabled
                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]
                DimaBr, вот это выручили!!! Огромное спасибо!

                Добавлено
                DimaBr, вот это выручили!!!
                ExpandedWrap disabled
                  SC := FE.GetRootComponent
                  ...
                  Form := TForm(SC.GetComponentHandle)
                - то, что надо!
                Огромное спасибо!!!!!
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0281 ]   [ 17 queries used ]   [ Generated: 19.04.24, 23:08 GMT ]