Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.27;
Скачать: CL | DM;

Вниз

Как сделать список форм в SDI   Найти похожие ветки 

 
still_swamp ©   (2002-05-14 17:20) [0]

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


 
McSimm ©   (2002-05-14 17:36) [1]

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


 
still_swamp ©   (2002-05-14 18:05) [2]

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


 
McSimm ©   (2002-05-14 18:15) [3]

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

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

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:26) [4]

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


 
McSimm ©   (2002-05-14 18:35) [5]

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

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



 
still_swamp ©   (2002-05-14 18:51) [6]

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

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


 
still_swamp ©   (2002-05-14 18:53) [7]

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


 
McSimm ©   (2002-05-14 19:21) [8]

Для этой цели вполне подойдет 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 19:51) [9]

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


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

Пусто может быть только если объекты 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-17 16:25) [11]

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


 
McSimm ©   (2002-05-17 16:53) [12]

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



Страницы: 1 вся ветка

Текущий архив: 2002.05.27;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.01 c
1-88459
PShadow
2002-05-15 13:28
2002.05.27
Дельфи ругается на CreateOleObject


3-88323
Ura
2002-04-27 11:16
2002.05.27
Параметри в Query


14-88604
ATLANTIDO
2002-04-18 20:41
2002.05.27
Обработчики


14-88599
s
2002-04-18 11:37
2002.05.27
Помогите горю!


14-88615
Val
2002-04-12 10:51
2002.05.27
---|Ветка была без названия|---