Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Внизdll, TForm.close, память, etc Найти похожие ветки
← →
Kostafey © (2007-03-29 01:17) [0]Господа Мастера !
Появился новый участник конкурса "На самый глупый вопрос" !
А вот и перечень вопросов:
1). Что происходит при закрытии (onClose) формы caHide или caFree
2). Чем отличаются эти 2 события
Первое:
procedure TForm1.Button1Click(Sender: TObject);
begin
Free;
end;
Второе:
Alt+F4
При первом dll закрывается с ошибкой, а при втором- нет!
3). Как правильно организовать взаимодействие приложения и dll (включающей в себя в том
числе несколько форм) если требуется периодически открывать и закрывать основную форму dll.
Т.е. нужно всякий выгружать из памяти формы или просто прятать (Hide) их?
Буду очень признателен за полезные ответы/советы по этим вопросам.
← →
RASkov (2007-03-29 03:24) [1]> 1). Что происходит при закрытии (onClose) формы caHide или caFree
Зависит от того какая форма - OnClose+F1;
2) 1 - Уничтожил форму;
2 - Закрыл форму(Зависит от Action);
На 3 много рассказывать надо.... поищи "форма(ы) в Dll"
← →
Германн © (2007-03-29 03:35) [2]
> 2). Чем отличаются эти 2 события
> Первое:
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
> Free;
> end;
>
> Второе:
>
> Alt+F4
>
> При первом dll закрывается с ошибкой, а при втором- нет!
>
Это не события. Это действия. А уничтожать объект внутри его собственного обработчика или внутри обработчика события компонента принадлежащего ему - есть прямой путь к ошибке.
← →
Loginov Dmitry © (2007-03-29 08:02) [3]> 1). Что происходит при закрытии (onClose) формы caHide или
> caFree
По умолчанию если для главной формы, то закрытие приложения. Если для второстепенной формы, то скрытие формы. Для второстепенной формы можно изменить реакцию на ее закрытие. Для уничтожения формы при закрытии достаточно в обработчике OnFormClose добавить строку Action := caFree;
> 2). Чем отличаются эти 2 события
В первой случае ничего хорошего произойти не может. Фактически происходит уничтожение объекта (TButton) в середине работы обработчика сообщения TControl.WMLButtonUp. После уничтожения объекта вызвается динамический метод TControl.MouseUp(), вызов которого в общем случае, должен привести к ошибке. Именно по этому у тебя приложение и валится. Фактически проявляется правило: нельзя вызывать виртуальные (динамические) методы после разрушения объекта.
> 3). Как правильно организовать взаимодействие приложения
> и dll (включающей в себя в том
> числе несколько форм) если требуется периодически открывать
> и закрывать основную форму dll.
> Т.е. нужно всякий выгружать из памяти формы или просто прятать
> (Hide) их?
Если используешь форму в DLL, то очень рекомендуется откомпилировать и EXE и DLL с пакетами. Глюков уже должно стать меньше, так как все глобальные объекты и реализации классов будут находится физически в одном месте (т.е. будут общими).
Даже если требуется периодически открывать и закрывать форму, то рекомендуется при закрытии уничтожать ее. Это позволит снизить потребление памяти, а также уменьшить число потенциальных глюков, связанных с непрерывной работой формы (глюки - это ошибки программера, ес-но).
← →
Desdechado © (2007-03-29 12:02) [4]> Фактически происходит уничтожение объекта (TButton)
Вообще-то тот код убивает форму, а не кнопку.
Но по сути причины ошибки согласен.
← →
RASkov (2007-03-29 16:00) [5]> Вообще-то тот код убивает форму, а не кнопку.
Ну а форма в свою очередь - "кнопку"... она-ж(кнопка) на форме. :)
Поэтому и
> Фактически происходит уничтожение объекта (TButton)
← →
Kostafey © (2007-03-29 16:24) [6]> По умолчанию если для главной формы, то закрытие приложения.
> Если для второстепенной формы, то скрытие формы.
В dll нет главвной формы. Стало быть Hide.
> Для уничтожения формы при закрытии достаточно в обработчике
> OnFormClose добавить строку Action := caFree;
стало быть нужно писать что-то вроде:
procedure TForm1.Button1Click(Sender: TObject);
begin
Close;
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := caFree;
end;
> В первой случае ничего хорошего произойти не может. Фактически
> происходит уничтожение объекта (TButton) в середине работы
> обработчика сообщения TControl.WMLButtonUp. После уничтожения
> объекта вызвается динамический метод TControl.MouseUp(),
> вызов которого в общем случае, должен привести к ошибке.
> Именно по этому у тебя приложение и валится. Фактически
> проявляется правило: нельзя вызывать виртуальные (динамические)
> методы после разрушения объекта.
Интересно то, что ошибка появляется непредсказуемо: может 1 раз на 50 перезапусков, может вообще при каждом закрытии !
> Если используешь форму в DLL, то очень рекомендуется откомпилировать
> и EXE и DLL с пакетами. Глюков уже должно стать меньше,
> так как все глобальные объекты и реализации классов будут
> находится физически в одном месте (т.е. будут общими).
Про такое не слышал, где можно об этом поподробнее узнать ?
> Даже если требуется периодически открывать и закрывать форму,
> то рекомендуется при закрытии уничтожать ее. Это позволит
> снизить потребление памяти, а также уменьшить число потенциальных
> глюков, связанных с непрерывной работой формы (глюки - это
> ошибки программера, ес-но).
Именно из этого я и исходил.
Правда, в конце концов переделал уничтожение на скрытие фром. Вместе с этим исчезли и все ошибки.
> Ну а форма в свою очередь - "кнопку"... она-ж(кнопка) на
> форме. :)
> Поэтому и
Опа! я об этом не подумал...
← →
Сергей М. © (2007-03-29 16:31) [7]
> Kostafey © (29.03.07 01:17)
А нахрена тебе "форма в dll" ?)
Рекомендую не трындеть про какую-то там якобы "экономию ресурсов".
← →
Kostafey © (2007-03-29 16:58) [8]> А нахрена тебе "форма в dll" ?)
Ну...нужна вот...
Рекомедуете фреймы ?
> Рекомендую не трындеть про какую-то там якобы "экономию
> ресурсов".
Рекомендации приняты к сведению. Как видите, я особенно и не заморачивался, когда
вместо уничтожения форм стал просто их скрывать.
Все же есть какие-то вещи, которые хоть и пользы большой и не принесут, но будут тем
не менее желательныим. Например, экономия ресурсов. А что не так ?
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.041 c