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 Конец

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


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


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

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


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


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

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


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


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

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


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


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

В С - могут :)


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

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


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


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

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


lookin   (2007-12-20 01:01:00) [27]

> [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) вдруг локальные переменные в локальной процедуре уже существуют...


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

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


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

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


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

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


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

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


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

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


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

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


Petr V. Abramov   (2007-12-19 23:50:00) [34]

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


Petr V. Abramov   (2007-12-19 23:48:00) [35]

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


Loginov Dmitry   (2007-12-19 23:46:00) [36]

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


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


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

Так пойдет?

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;


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

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


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

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;


{RASkov}   (2007-12-19 23:25:00) [40]

> [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;


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

Наверх

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