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

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

Как сделать список форм в SDI [D5, Win2k]


still_swamp ©   (2002-05-14 17:20:00) 

Как сделать список форм в SDI?
Есть ли какие методы? Подскажите


McSimm   (2002-05-17 16:53:00) [1]

Это значит, что Owner у формы в DLL не равен Application в приложении.
Либо на момент создания формы переменной Application в DLL не присвоено значение переменной Application из приложения, либо форма создается с Owner не Application. Например TForm.Create(nil)


still_swamp   (2002-05-17 16:25:00) [2]

отличить то легко... :)
try except end... однако ComponentCount возвращает 1.


McSimm   (2002-05-15 10:16:00) [3]

Пусто может быть только если объекты Application у Dll и Exe разные, либо, что скорее всего, оператор isсчитает классы "TForm" из dll и из приложения различными и возвращает False для всех Components[].
Попробуй цикл без is, вроде
for I := 0 to Application.ComponentCount - 1 do
ListBox1.AddItem(Application.Components[I].Name, nil);
если обнаружатся искомые, надо придумать как отличать формы другим способом, нежели is


still_swamp   (2002-05-14 19:51:00) [4]

:)
это первое что я сделал еще до нашей беседы. Пусто.


McSimm   (2002-05-14 19:21:00) [5]

Для этой цели вполне подойдет Application.Components

Отличия:
- В этот список форма попадет только если она создается Application.CreateForm или TForm.Create(Application).
- В этом списке не только формы.
- В этом списке формы не только видимые формы.

Цикл может выглядеть так:
for I := 0 to Application.ComponentCount - 1 do
begin
if Application.Components[I] is TForm then
ListBox1.AddItem((Application.Components[I] as TForm).Caption, nil);
end;

Можно также добавить проверку на Visible формы если необходимо


still_swamp   (2002-05-14 18:53:00) [6]

и еще прицепом.
в длл придется писать нечто вроде...
DllScreen:=InScreen?


still_swamp   (2002-05-14 18:51:00) [7]

ясно. спасибо. однако у меня около 40 собрвнных уже dll.

я передаю только Application. Там есть Components, можно ли как то с ним решить проблемку.


McSimm   (2002-05-14 18:35:00) [8]

Тогда все ясно.
У приложения и у DLL разные объекты Screen. Поэтому формы попадают в разные списки.

Часто при работе с формами в Dll используется следующий метод:
При инициализации Dll в нее передаются две переменные из программы - Application и Screen.
Родные для Dll переменные сохраняются им и присваиваются значения переменных из Exe.
Перед выгрузкой Dll после закрытия всех форм надо вернуть исходные значения.


still_swamp   (2002-05-14 18:26:00) [9]

Это я сделал, безусловно, однако формы у меня открываются в ДЛЛ Application.CreateForm, и естественно не выгружаются. Однако, список пуст.


McSimm   (2002-05-14 18:15:00) [10]

Тут что-то не так.

Должны попасть.
На всякий случай - вот пример как этот список обработать:

ListBox1.Clear;
for I := 0 to Screen.FormCount - 1 do
begin
ListBox1.AddItem(Screen.Forms[I].Caption, Screen.Forms[I]);
end;


still_swamp   (2002-05-14 18:05:00) [11]

Формы открыты, однако, возвращается только MainForm. Как должны создаваьтся формы, для того что бы они попали в этот список?


McSimm   (2002-05-14 17:36:00) [12]

Если список открытых форм, то есть списки:
TScreen.Forms
TScreen.CustomForms


Наверх

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