Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.07;
Скачать: CL | DM;

Вниз

Создание-удаление диалога   Найти похожие ветки 

 
lookin ©   (2007-12-19 21:43) [0]

Вопрос - нижеследующий блок №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 Конец

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


 
Petr V. Abramov ©   (2007-12-19 21:48) [1]

а где AV?


 
Германн ©   (2007-12-19 21:48) [2]


>  AFontDialog:=nil;
>  AFontDialog:=TFontDialog.Create(AOwner);
>

И ЭТО не вызывает AV? Не смеши мои тапочки.


 
Германн ©   (2007-12-19 21:50) [3]


> Германн ©   (19.12.07 21:48) [2]
>
>

Не читать. Не туда посмотрел.

> lookin ©   (19.12.07 21:43)

Прочитай справку по функции Assigned.


 
Loginov Dmitry ©   (2007-12-19 21:53) [4]

> что правильнее?


FreeAndNil()


 
lookin ©   (2007-12-19 22:27) [5]

> [3] Германн ©   (19.12.07 21:50)

Да читал, толку что-то маловато от меня. Прояснишь? Мне то казалось, что создавая экземпляр, я могу его и убивать (процедуры Create*** и Destroy***). А вот что-то не получается. Создавать. AV возникает на вызов CreateFontDialog, при еще ни разу не созданном (еще бы, в локальной перемнной все же) диалоге. И не знаю, почему такая загвоздка...


 
{RASkov} ©   (2007-12-19 22:44) [6]

> [5] lookin ©   (19.12.07 22:27)
> Да читал, толку что-то маловато от меня. Прояснишь?

Просто нужно помнить, что Free не обну(и)ляет ссылку.... и все встает на свои места....
т.е. после Free - Assigned "думает", что объект-то жив, а его на самом деле уже нет вот и АВ
или см [4]
или "мочи" объекты так:
Obj.Free;
Obj:=nil;


 
Sergey Masloff   (2007-12-19 22:52) [7]

Правильно так


with TFontDialog.Create(AOwner) do
try
 if Execute then
 
finally
 Free();
end;

- нет лишних переменных
- не надо никаких assigned
- можно спокойно забыть про freeandnil которая по самой сввоей идее опасна


 
Petr V. Abramov ©   (2007-12-19 22:56) [8]

> freeandnil которая по самой сввоей идее опасна
не так у ж и опасна. на AV нарвешься при обращении к фрееэндобнилиномму объекту, а не в произвольном месте.


 
lookin ©   (2007-12-19 23:03) [9]

> [6] {RASkov} ©   (19.12.07 22:44)

Гут, спасибо. Но как насчет того, что AV возникает при ПЕРВОМ вызове процедуры создания диалога (при работе с №1). Т.е. объекта то и в помине нету, казалось бы. Правда осекусь, речь идет о вызове искомой после создания динамически компонента, использующего эти перечисленные выше процедуры, возможно, это является решающим. Так как в обычном приложении такого AV не возникает...


 
lookin ©   (2007-12-19 23:04) [10]

> [7] Sergey Masloff   (19.12.07 22:52)

Понятна мысль, но мне в каждой процедуре писать такое? Я ведь потому и создал "шаблонный" вызов, чтобы не повторяться...


 
{RASkov} ©   (2007-12-19 23:25) [11]

> [9] lookin ©   (19.12.07 23:03)
> Но как насчет того, что AV возникает при ПЕРВОМ вызове процедуры
> создания диалога (при работе с №1).

Первый вариант один раз должен отработать нормально, т.е. до первого Free а последующие разы АВ....

> Понятна мысль, но мне в каждой процедуре писать такое? Я
> ведь потому и создал "шаблонный" вызов, чтобы не повторяться...

У тебя шаблоны написаны не верно....
Вот посмотри вариант:

type TCommonDialogClass = class of TCommonDialog;
function ExecDlg(const TDlg: TCommonDialogClass; AOwner: TComponent=nil): Boolean;
begin
 with TDlg.Create(AOwner) do try
  Result:=Execute;
 finally
  Free;
 end;
end;
..................
begin
 ExecDlg(TFontDialog);
 ExecDlg(TColorDialog);
 ExecDlg(TOpenDialog);
 ExecDlg(TSaveDialog);
end;


 
Sergey Masloff   (2007-12-19 23:31) [12]

Petr V. Abramov ©   (19.12.07 22:56) [8]
я не о том

TMyObj = class(TSome...
 destructor Destroy(); reintroduce; override;

TMyObj.Destroy
begin
  освобождаем ресурс1  ==> тут возможно исключение
  освобождаем ресурс2
  inherited;
end;

MyInst := TMyObj,Create();
FreeAndNil(MyInst);
-- Тут имеем исключение но ресурс не освобожу никогда - к нему нет ссылок

procedure FreeAndNil(var Obj);
var
 Temp: TObject;
begin
 Temp := TObject(Obj);
 Pointer(Obj) := nil;  // рубим хвосты
 Temp.Free;
end;



 
Sergey Masloff   (2007-12-19 23:33) [13]

{RASkov} ©   (19.12.07 23:25) [11]
У тебя тоже неправильно. Обычно если Execute то нужно что-то сделать с тем что выбрали ;-)


 
Sergey Masloff   (2007-12-19 23:42) [14]

Так пойдет?

procedure SelectFont(AFont : TFont);
begin
 with TFontDialog.Create(Application) do
 try
   if Execute then
     AFont.Assign(Font);
 finally
  Free();
 end;
end;

// Использование
procedure TForm1.Button1Click(Sender: TObject);
begin
  SelectFont(Self.Font);
end;


 
Loginov Dmitry ©   (2007-12-19 23:46) [15]

> Но как насчет того, что AV возникает при ПЕРВОМ вызове процедуры
> создания диалога (при работе с №1).


Наверно потому, что не все локальные переменные обнуляются автоматически. На TFontDialog.Create() программа не заходит, оттого и AV.


 
Petr V. Abramov ©   (2007-12-19 23:48) [16]

> Sergey Masloff   (19.12.07 23:31) [12]
въехал
:)


 
Petr V. Abramov ©   (2007-12-19 23:50) [17]

Удалено модератором


 
Sergey Masloff   (2007-12-19 23:56) [18]

Удалено модератором


 
Petr V. Abramov ©   (2007-12-20 00:08) [19]

Удалено модератором


 
Anatoly Podgoretsky ©   (2007-12-20 00:10) [20]

Удалено модератором


 
Petr V. Abramov ©   (2007-12-20 00:14) [21]

Удалено модератором


 
Anatoly Podgoretsky ©   (2007-12-20 00:17) [22]

Удалено модератором


 
Sergey Masloff   (2007-12-20 00:17) [23]

Удалено модератором


 
lookin ©   (2007-12-20 01:01) [24]

> [11] {RASkov} ©   (19.12.07 23:25)

>>Первый вариант один раз должен отработать нормально, т.е. до первого Free а последующие разы АВ....

Ок, а почему?

>>Вот посмотри вариант:

Спасибо, мне бы со своим разобраться...
> [14] Sergey Masloff   (19.12.07 23:42)

Не пойдет, я хотел бы if Execute использовать в вызове TForm1.Button1Click (в твоем примере)

> [15] Loginov Dmitry ©   (19.12.07 23:46)

Странно, что при создании компонента наново (типа TMyComponent.Create etc) вдруг локальные переменные в локальной процедуре уже существуют...


 
Германн ©   (2007-12-20 01:43) [25]


> Странно, что при создании компонента наново (типа TMyComponent.
> Create etc) вдруг локальные переменные в локальной процедуре
> уже существуют...
>

Локальные переменные не могут "уже" существовать. Они существуют сразу как только программа входит в область их видимости!
Тут у тебя "смещение понятий". Локальная переменная (суть указатель на объект) == сам объект. Ты так это понимаешь. И того же понимания хочешь от функции Assigned. Ан нет. Сия функция лишь проверяет равенство конкретного указателя на ноль. И всё!


 
Германн ©   (2007-12-20 01:55) [26]

И вообще, о птичках.
Похоже разработчики Борланда оказали дурную услугу пользователям Дельфи введя в язык функцию Assigned(). Реально, имхо, она никому не нужна кроме разработчиков компонент. Ну а те, в свою очередь, достаточно грамотные люди. Да и им эта функция не особо и нужна. Наглядности коду она не придаёт, а <> nil - на три кнопконажатия меньше. (CodeComplite не упоминать. Да и по-моему он в этом случае "молчит в тряпочку")
Ну а прочих пользователей она настолько смутила, что пришлось написать ещё и функцию FreeAndNil. Которая ещё более всё запутала.


 
J_f_S   (2007-12-20 02:24) [27]


> Локальные переменные не могут "уже" существовать

В С - могут :)


 
Германн ©   (2007-12-20 02:32) [28]


> Германн ©   (20.12.07 01:55) [26]

Ещё одна грамматическая ошибка, блин. Хоть и в аглицком, а всё равно блин. :(
P.S.
Старею, да и уже вторую неделю левое колено почти не сгибается. :)
А как участвовать на форуме если коленка не сгибается?
P.P.S
А всё таки я туточки.
:)))


 
J_f_S   (2007-12-20 02:33) [29]


> Старею, да и уже вторую неделю левое колено почти не сгибается.
>  :)

Ну не коленом же буквы набиваешь! :)


 
Германн ©   (2007-12-20 02:35) [30]


> J_f_S   (20.12.07 02:24) [27]
>
>
> > Локальные переменные не могут "уже" существовать
>
> В С - могут :)
>

Эээ. Разъясни. В контексте Германн ©   (20.12.07 01:43) [25]


 
Германн ©   (2007-12-20 02:37) [31]


> J_f_S   (20.12.07 02:33) [29]
>
>
> > Старею, да и уже вторую неделю левое колено почти не сгибается.
>
> >  :)
>
> Ну не коленом же буквы набиваешь! :)
>

А ты пробовал "набивать буквы лёжа"?
:)


 
Германн ©   (2007-12-20 02:39) [32]

Не хочу сейчас флудить. Объясни на русском суть твоего сообщения:

> J_f_S   (20.12.07 02:24) [27]
>
>
> > Локальные переменные не могут "уже" существовать
>
> В С - могут :)
>


 
Германн ©   (2007-12-20 02:49) [33]

И ещё раз, как бы ни старались представители СИ сбить нас с толку.
Германн ©   (20.12.07 01:55) [26]


 
lookin ©   (2007-12-20 03:37) [34]

> [25] Германн ©   (20.12.07 01:43)

Я понимаю под локальной переменной ту, которая срабатывает только при входе в некоторую процедуру-функцию. Нет?


 
lookin ©   (2007-12-20 03:39) [35]

> [25] Германн ©   (20.12.07 01:43)

а Assigned(***) "Tests for a nil (unassigned) pointer or procedural variable". При чем тут несоотвествие моего кода №1?


 
lookin ©   (2007-12-20 03:40) [36]

> [33] Германн ©   (20.12.07 02:49)

не спорю насчет твоей справедливости, только поясни плз


 
lookin ©   (2007-12-20 03:41) [37]

> [33] Германн ©   (20.12.07 02:49)

Просто казалось бы, разницы между if not Assigned(Dlg) и Dlg:=nil нету... Нету?


 
J_f_S   (2007-12-20 03:44) [38]

Если локальная переменная обьявлена с модификатором static, то она не уничтожается при выходе за область своего действия. На этом основан принцип работы синглтона Майерса:

class Foo
{
private:
  ~Foo();
  Foo(const Foo&){};
  Foo():a(0);

  int a;
public:
  static Foo& GetInstance();

  void PrintA();
}

///cpp

Foo& Foo::GetInstance()
{
  static Foo fooInstance;
 
  return fooInstance;
}

void Foo::PrintA()
{
  printf("a = %d", a++);
}



Foo::GetInstance()::PrintA(); // a = 0 - обьект класса Foo создается тут, в GetInstance
Foo::GetInstance()::PrintA(); // a = 1 - а тут он просто продолжает жить


Элегантно. (Грабли впрочем тут есть, не спорю...)


 
J_f_S   (2007-12-20 03:46) [39]

Действительно ли это для Делфей, впрочем, сказать не могу :)
Наверно, нет.


 
J_f_S   (2007-12-20 03:49) [40]

А, блин. Очипятки в [38]. Но смысл понятен.



Страницы: 1 2 вся ветка

Текущий архив: 2008.09.07;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.016 c
2-1217069073
agress0r
2008-07-26 14:44
2008.09.07
Прога вылетает при подключениие dll в vista


3-1205310393
KPV-10k
2008-03-12 11:26
2008.09.07
Как узнать что запись захвачена другим пользователем (Firebird)


15-1216379395
@!!ex
2008-07-18 15:09
2008.09.07
Как получить окно в QT?


15-1216220021
dmitry_12_08_73
2008-07-16 18:53
2008.09.07
Где найти библиотеки компонентов для сглаживанию кривых линий


1-1198069514
Razrab
2007-12-19 16:05
2008.09.07
Почему иногда файл не проходит полностью через MS Outlook?