Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1175521812
Stenfit
2007-04-02 17:50
2007.04.22
Помогите разобраться з запросом...


2-1175161127
Alex7
2007-03-29 13:38
2007.04.22
Как взять данные DataSet в Clipbord, чтобы вставить в Excel


15-1174584158
tesseract
2007-03-22 20:22
2007.04.22
суббота и пиво


2-1175501859
pound
2007-04-02 12:17
2007.04.22
как в TValueListEditor определить место положения курсора


2-1175240923
Gloomer
2007-03-30 11:48
2007.04.22
Указать в ADOQuery путь к файлу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский