Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить список ещё не созданных форм в Run Time?


mapnn ©   (2002-01-19 15:16:00) 

Как получить список ещё не созданных форм в Run Time?
Список AutoCreate Forms легко получить из Screen.Forms[]
а как здесь быть - в исходниках VCL ничего не нащёл :( ?


yaJohn   (2002-01-23 15:11:00) [1]

Sushestvuet RegisterClass i UnRegisterClass. Sootvetstvenno, gdeto est struktura gde hranitsia informacia o zaregestrirovannih klassah. Formi odnoznachno zaregestrirovani.
classes.pas
...
implementation

uses Consts, TypInfo;

const
FilerSignature: array[1..4] of Char = "TPF0";

var
ClassList: TThreadList;
....

Itak, kak dostat" ClassList, vernee k ClassList.LockList? V smisle kak poluchit ego element ne zakonno, po ClassName, a po indexu???


Digitman   (2002-01-23 13:41:00) [2]

>mapnn
Точно) .. Вот такие вот "слоны" в данном контексте (и - вообще) могут дать если не эксклюзивную сатисфакцию страждущему программеру, то хотя бы некие приятные ощущения, когда "дежурный" объект Application на поверку оказывается импотентом))))))))))))


mapnn   (2002-01-23 12:57:00) [3]

> Digitmap

Я собственно так и делаю, проблема мной слегка надумана,
но обсосать это было полезно (Слоны, например появились :-))


Digitman   (2002-01-23 11:34:00) [4]

>Макс Черных
Браво !! Слона я и не приметил) ..... действительно, это можно "достать" из ресурсов

>mapnn
Клиентское приложение и так знает обо всех классах форм. Можно же в некоем заранее определенном тобой общем событии всех разработанных форм предусмотреть логику обращения к некоему упомянотому тобой экземпляру класса TUserProfile, прочитать из него необходимые данные и настроить форму в соответствии с профилем перед тем как она будет визуализирована.


mapnn   (2002-01-23 01:02:00) [5]

Всем спасибо за дискуссию!
Что касается, "зачем это надо?" - например для
блокировки интерфейса программы, в зависимости от текущего
профиля пользователя в системах "клиент-сервер". Вы создаёте
на клиенте класс TUserProfile, объект который читает с сервера
текущий профиль пользователя и настраивант "по месту" каждую
вызываемую юзверем форму. Конечно формы можно заранее занести в список и его использовать .... но если вы добавите новую форму
в проект - надо каждый раз править список - это кривовато :-))
.........


Макс Черных   (2002-01-22 22:49:00) [6]

2 AlexR_R & Юрий Зотов
> А списка модулей приложения насколько я знаю не существует
> В design-time, естественно, существует все
> А в run-time, естественно, ничего этого не существует
А вот и заблуждаетесь, Господа. В ресурсе PACKAGEINFO
зашит список всех модулей, в том числе и неявно подключенных.
У меня правда под рукой нет алгоритма его чтения, но
в интернете его уж точно можно найти. Для примера, программа
Resource Builder без проблем его показывает.

По поводу списка форм. Список классов можно получить очень просто. Перебираем через EnumResourceNames ресурсы с типом
RCDATA. Для формы, как известно, имя ресурса совпадает с
именем класса, далее через GetClass получаем TPersistentClass
и смотрим if этот TPersistentClass Is TForm.

А вот как получить список глобальных переменных типа:
Form1: TForm1я не знаю, так как НЕТ такого,
как впрочем мне непонятно зачем все это надо?



Юрий Зотов   (2002-01-22 16:00:00) [7]

> А списка модулей приложения насколько я знаю не существует.

В design-time, естественно, существует все (см. Open Tools API - в частности, списки модулей, форм и еще многое можно достать через переменную ToolServices).

А в run-time, естественно, ничего этого не существует (да ведь и самих модулей уже не существует - они вошли в EXE). И поэтому все придется делать ручками.

Например, в секции Initialization первого загружаемого модуля можно создать TList и в нем "зарегистрировать" все, что требуется.


Digitman   (2002-01-22 15:50:00) [8]

>gek
Вот спасибо ! А то я ляпнул, с потолка типа, а потом засомневался)))))))


gek   (2002-01-22 15:44:00) [9]

>> Digitman
Верно батенька.
>> Как получить список ещё не созданных форм в Run Time?
Никак. Если только не создать список созданных форм.


Digitman   (2002-01-22 15:13:00) [10]

никакой связи между design-time-списком "AutoCreate Forms" и св-вами/методами run-time-объекта Application нет. совершенно разные вещи, никакого отношения друг-к-другу не имеющие


AlexR_R   (2002-01-22 14:51:00) [11]

Я думаю список "Avialable forms" есть лишь в дизайн тайме,
а для Application тебе надо его создавать самому.
Легче ручками запонить или парсируя файл проекта.
Но это еще не все "Avialable forms", которые могут быть. Есть
еще и dll. И хрен знает как подключенные модули.
А списка модулей приложения насколько я знаю не существует.


mapnn   (2002-01-21 23:55:00) [12]

Вот именно "Которые уже на данном этапе созданы" , то есть те,
которые в проекте находятся в списке "Auto-greate forms", или
созданы "вручную" и живут, а меня интересует доступ с списку "Avialable forms" - то есть, к списку ещё не созданных форм. По идее, нужен доступ к списку модулей приложения, а оттуда можно получить и информацию о заданных в проекте TComponentForm, то есть списку объявленных классов форм, ссылки на которые объявлены, но пока равны nil. Вот в чём загвоздка. Проблему
можно решить по разному, но всё-таки?


AlexR_R   (2002-01-21 22:06:00) [13]

А разве в Screen.Forms[] не все формы включены?
(Которые уже на данном этапе созданы)


mapnn   (2002-01-21 20:29:00) [14]

Ответов не дождался. Мастера! Ау!!! Borland Community тоже молчит как рыба :-) Отвечаю сам себе: придётся создать список ручками :-) ... и помочь Run Time..у его увидеть :-))


Наверх

Титульная страница Поиск, карта сайта Написать письмо