Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
ВнизИспользование MDI. Найти похожие ветки
← →
Andrew_Rosotv (2004-05-02 15:30) [0]Возникла задача тиражирования форм в runtime.
Насколько я понял, используя MDI эту задачу можно решить довольно просто.
Сейчас столкнулся с проблемой. Если у главной формы указано свойство FormStyle: fsMDIForm, то все работает (копии создаются в главной форме),
но если у другой формы (назовем ее NonMain) указать fsMDIForm (у главной поставить fsNormal) то при создании копии : TFormChild.Create(Application)
получаем исключение:
"Cannot create form. No MDI forms are currently active"
Причем перед этим на NonMain фокус ввода был установлен. Так же я проверял - событие onActivate происходит...
Собственно вопрос в следующем:
возможно ли при использовании MDI создание копий формы не в главной форме приложения (и если да, то в чем м.б. причина указанного выше исключения)?
← →
Юрий Зотов © (2004-05-02 16:11) [1]1. Никто не запрещает тиражировать формы и безо всяких MDI-Child. Делается это точно так же - вызываете конструктор класса, и все.
2. Причину исключения легко установить отладчиком. Укажите в опциях проекта Use debug dcu"s, сделайте build и пройдите по коду VCL отладчиком. Думаю, причина окажется в том, что где-то в коде VCL идет проверка
Application.MainForm.FormStyle = fsMDIForm
и если это не так, то возбуждается исключение.
3. Если уж очень надо использовать MDI, то создавайте MDI-форму первой, а форму с fsNormal - второй. Тогда все будет ОК.
← →
Andrew_Rostov (2004-05-02 16:39) [2]Спасибо, еще почитал доки и выяснил, что основная форма приложения и только она должна быть fsMDIForm => действительно прийдется без MDI...
← →
Юрий Зотов © (2004-05-02 17:13) [3]> Andrew_Rostov (02.05.04 16:39) [2]
Если нужно, то можно и с MDI (см. п.3). Никто не мешает создавать в MDI-проекте формы с fsNormal. Обычно это модальные диалоги, но совсем не обязательно.
← →
Andrew_Rostov (2004-05-02 18:01) [4]Работает, от MDI я отказался. Правда теперь возникла пара вопросов:
1. Как обращаться к динамически созданным формам/их компонентам? Через MDI это осуществлялось посредством свойства MDIChildren[i], а элементами какого массива являются созданные не через MDI формы что-то не соображу...
2. Не возникает ли проблем с освобождением памяти (утечек тобишь) при
- закрытии созданной формы
или
- закрытии основной формы (ну и соответственно динамических).
В обработчик onClose "формы для клонирования" я прописал Action:= caFree;
← →
Юрий Зотов © (2004-05-02 19:09) [5]> Andrew_Rostov (02.05.04 18:01) [4]
1. Есть общий список форм Screen.Forms. Специального списка для форм одного класса нет, но его легко сделать "ручками". Можно, например, использовать такую схему модуля клонируемых форм:
type
TForm2 = class(TForm)
...
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormClose(Sender: TObject; Action: TCloseAction);
...
end;
var
// Переменная Form2: TForm2 не нужна и удалена.
FormList: TList; // Вот это и есть список форм класса TForm2
implementation
{$R *.DFM}
procedure TForm2.FormCreate(Sender: TObject);
begin
if FormList = nil then FormList := TList.Create;
FormList.Add(Self)
end;
procedure TForm2.FormDestroy(Sender: TObject);
begin
FormList.Remove(Self);
if FormList.Count = 0 then FreeAndNil(FormList)
end;
procedure TForm2.FormClose(Sender: TObject; Action: TCloseAction);
begin
Action := caFree
end;
Если предполагается многопоточное создание или удаление форм, то вместо TList нужно использовать TThreadList, но сама схема остается той же самой.
2. При Action=caFree проблем с памятью не возникнет. Любая закрытая форма самоуничтожится и сама удалит себя из списка.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.035 c