![]() |
| ||
|
|
Новости |
Поиск |
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;
И завершающий вопрос - что правильнее? Спасибо!
Германн (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;