![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание-удаление диалога
lookin © (2007-12-19 21:43:00)Вопрос - нижеследующий блок №1 ошибочен, и если да, то чем? Вызывает AV в ряде случаев...
*****№1 Начало
procedure CreateFontDialog(var AFontDialog: TFontDialog; AOwner: TComponent);*****№1 Конец
begin
if not Assigned(AFontDialog) then
AFontDialog:=TFontDialog.Create(AOwner);
end;
procedure DestroyFontDialog(var AFontDialog: TFontDialog);
begin
if Assigned(AFontDialog) then AFontDialog.Free;
end;
****Вызов создания-удаления диалога TFontDialog****
procedure TEqapSurfaceChart.ChartTitleFontButtonClick(Sender: TObject);
var FontDialog: TFontDialog;
begin
CreateFontDialog(FontDialog,nil);
if FontDialog.Execute then begin
...
end;
DestroyFontDialog(FontDialog);
end;
И второй блок, не вызывает AV. Почему?
*****№2 Начало
procedure CreateFontDialog(var AFontDialog: TFontDialog; AOwner: TComponent);*****№2 Конец
begin
AFontDialog:=nil;
AFontDialog:=TFontDialog.Create(AOwner);
end;
procedure DestroyFontDialog(var AFontDialog: TFontDialog);
begin
if Assigned(AFontDialog) then AFontDialog.Free;
end;
****Вызов создания-удаления диалога TFontDialog****
procedure TEqapSurfaceChart.ChartTitleFontButtonClick(Sender: TObject);
var FontDialog: TFontDialog;
begin
CreateFontDialog(FontDialog,nil);
if FontDialog.Execute then begin
...
end;
DestroyFontDialog(FontDialog);
end;
И завершающий вопрос - что правильнее? Спасибо!
lookin (2007-12-19 23:04:00) [41]> [7] Sergey Masloff (19.12.07 22:52)
Понятна мысль, но мне в каждой процедуре писать такое? Я ведь потому и создал "шаблонный" вызов, чтобы не повторяться...
lookin (2007-12-19 23:03:00) [42]> [6] {RASkov} © (19.12.07 22:44)
Гут, спасибо. Но как насчет того, что AV возникает при ПЕРВОМ вызове процедуры создания диалога (при работе с №1). Т.е. объекта то и в помине нету, казалось бы. Правда осекусь, речь идет о вызове искомой после создания динамически компонента, использующего эти перечисленные выше процедуры, возможно, это является решающим. Так как в обычном приложении такого AV не возникает...
Petr V. Abramov (2007-12-19 22:56:00) [43]> freeandnil которая по самой сввоей идее опасна
не так у ж и опасна. на AV нарвешься при обращении к фрееэндобнилиномму объекту, а не в произвольном месте.
Sergey Masloff (2007-12-19 22:52:00) [44]Правильно так
with TFontDialog.Create(AOwner) do
try
if Execute then
finally
Free();
end;
- нет лишних переменных
- не надо никаких assigned
- можно спокойно забыть про freeandnil которая по самой сввоей идее опасна
{RASkov} (2007-12-19 22:44:00) [45]> [5] lookin © (19.12.07 22:27)
> Да читал, толку что-то маловато от меня. Прояснишь?
Просто нужно помнить, что Free не обну(и)ляет ссылку.... и все встает на свои места....
т.е. после Free - Assigned "думает", что объект-то жив, а его на самом деле уже нет вот и АВ
или см [4]
или "мочи" объекты так:
Obj.Free;
Obj:=nil;
lookin (2007-12-19 22:27:00) [46]> [3] Германн © (19.12.07 21:50)
Да читал, толку что-то маловато от меня. Прояснишь? Мне то казалось, что создавая экземпляр, я могу его и убивать (процедуры Create*** и Destroy***). А вот что-то не получается. Создавать. AV возникает на вызов CreateFontDialog, при еще ни разу не созданном (еще бы, в локальной перемнной все же) диалоге. И не знаю, почему такая загвоздка...
Loginov Dmitry (2007-12-19 21:53:00) [47]> что правильнее?
FreeAndNil()
Германн (2007-12-19 21:50:00) [48]
> Германн © (19.12.07 21:48) [2]
>
>
Не читать. Не туда посмотрел.
> lookin © (19.12.07 21:43)
Прочитай справку по функции Assigned.
Petr V. Abramov (2007-12-19 21:48:00) [49]а где AV?
Германн (2007-12-19 21:48:00) [50]
> AFontDialog:=nil;
> AFontDialog:=TFontDialog.Create(AOwner);
>
И ЭТО не вызывает AV? Не смеши мои тапочки.