Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание-удаление диалога


Страницы:   1 2 3

lookin ©   (2007-12-19 21:43:00) 

Вопрос - нижеследующий блок №1 ошибочен, и если да, то чем? Вызывает AV в ряде случаев...

*****№1 Начало
procedure CreateFontDialog(var AFontDialog: TFontDialog; AOwner: TComponent);
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;
*****№1 Конец

И второй блок, не вызывает AV. Почему?

*****№2 Начало
procedure CreateFontDialog(var AFontDialog: TFontDialog; AOwner: TComponent);
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;
*****№2 Конец

И завершающий вопрос - что правильнее? Спасибо!


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? Не смеши мои тапочки.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо