Форум: "Основная";
Текущий архив: 2002.05.27;
Скачать: [xml.tar.bz2];
ВнизКак сделать список форм в 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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c