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

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

ShowModal в DataModule.OnDestroy [D7]


Страницы:   1 2

Juice ©   (2006-05-22 13:41:00) 

В обработчике события DataModule.OnDestroy я закрываю наборы данных и при этом нужно вывести диалоговое окно, обязательно нужно. У меня есть специальная для этих целей форма, создаю ее и вызываю ShowModal - форма не показывается а ShowModal возвращает mrCancel, хотя в коде и в помине mrCancel не должно быть! Попробовал провести эксперимент: добавил в проект fmTest и в DataModule.OnDestroy вызвал fmTest.ShowModal - получаю EAccessViolation on address 00000000. Короче говоря не хочет фурычить ShowModal в DataModule.OnDestroy. Может чего подскажите ?


StriderMan   (2006-05-24 11:42:00) [1]


>  TForm3.Create(nil).ShowModal;


я понимаю, что код тестовый, но все таки объекты разрушать надо, а то новички скопируют а потом будут постить - "куда память девается"


Плохиш   (2006-05-24 11:29:00) [2]


> ЮЮ ©   (24.05.06 10:04) [27]


> procedure TDataModule2.DataModuleDestroy(Sender: TObject);
>
> begin
>   TForm3.Create(nil).ShowModal;
> end;

Ну так вот про указания на эти волшебные слова он понять и не может.


ЮЮ   (2006-05-24 10:04:00) [3]

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

Вот создал новый проект. Всё работает. Следовательно ищи ошибки у себя:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
 if DataModule2 = nil then
   DataModule2 := TDataModule2.Create(nil);
 Caption := 'DataModule2 создан';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 FreeAndNil(DataModule2);
 Caption := 'DataModule2 уничтожен';
end;

end.

unit Unit2;

interface

uses
 SysUtils, Classes;

type
 TDataModule2 = class(TDataModule)
   procedure DataModuleDestroy(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 DataModule2: TDataModule2;

implementation

{$R *.dfm}

uses Unit3;

procedure TDataModule2.DataModuleDestroy(Sender: TObject);
begin
 TForm3.Create(nil).ShowModal;
end;

end.

unit Unit3;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs;

type
 TForm3 = class(TForm)
 private
   { Private declarations }
 public
   { Public declarations }
 end;

implementation

{$R *.dfm}

end.


Juice   (2006-05-23 22:22:00) [4]

Раз:

> получаю EAccessViolation on address

Я сидел и чесно геморился с отладчиком на нужной мне форме, выяснил факт который изложил в вопросе, потом чтобы исключить влияние на проблему самой формы, я добавил чистую новую форму и попробовал на ней. Не получилось, и сразу задал вопрос на форум. И это означает что хрен с той тестовой формой, забыли о ней, вопрос не в ней, и "наверное" было писано т.к. когда вопрос уже запостился то ее и в помине уже не было. Всем кто приобщается к ветке : вопрос не в том как получить аксесс виолейшн при попытке вызвать метод несуществующего обьекта, а почему ShowModal СУЩЕСТВУЮЩЕЙ формы в деструкторе модуля данных в частности (на другом не проверял) выкидывает такую хрень, какую скаано в вопросе.


> вобщем криво все...
>
> Но ругать плохими словами за это программера не стоит, как
> писать код - личное дело каждого, просто вежливо и спокойно
> укажем явные недостатки и ошибки.
>
> Форма fmTest скоре всего уже разружена объектом Application.
>  А показывать (fmTest.ShowModal)  ее надо в самом начале
> обработки события, ведущего к завершению приложения.
>
> например OnClose главной формы (если она есть).
>
> И если форма используется только в этом месте, то нужно
> убрать ее из списка AutoCreate, и создавать ручками
>  
>  with TfmTest.Create(nil) do
>  try
>    ShowModal;
>  finally
>    Free;
>  end;

Как видишь ничего кривого.

> Тебе почти открытым текстом намекают - воспользуйся встроенным
> в DelphiIDE-отладчиком ! И моментально найдешь все свои
> "глюки" !

А вот хуже всего что глюки бывают не только мои, а и в самих библиотеках. И даже не просите меня приводить примеры, не надо нам тут священной войны.


Плохиш   (2006-05-22 17:19:00) [5]


> StriderMan ©   (22.05.06 16:15) [24]


> И если форма используется только в этом месте, то

Вот эти слова выкидываем и оставляем всё, что следует дальше :-)


StriderMan   (2006-05-22 16:15:00) [6]

вобщем криво все...

Но ругать плохими словами за это программера не стоит, как писать код - личное дело каждого, просто вежливо и спокойно укажем явные недостатки и ошибки.

Форма fmTest скоре всего уже разружена объектом Application. А показывать (fmTest.ShowModal)  ее надо в самом начале обработки события, ведущего к завершению приложения.

например OnClose главной формы (если она есть).

И если форма используется только в этом месте, то нужно убрать ее из списка AutoCreate, и создавать ручками
 
 with TfmTest.Create(nil) do
 try
   ShowModal;
 finally
   Free;
 end;
 


Сергей М.   (2006-05-22 15:00:00) [7]


> получаю EAccessViolation onaddress


И врать продолжай (см. выделенное жирным)


Сергей М.   (2006-05-22 14:58:00) [8]

Продолжай "отвертываться".
Сия опция линкера не мешает отладке.


Juice   (2006-05-22 14:56:00) [9]

Ну, я могу отвертеться. В проекте используются RunTime packages, наверное поэтому я не могу зайти туда отладчиком.


Сергей М.   (2006-05-22 14:50:00) [10]


> Если вы имели в виду зайти в ShowModal то это другое дело


ПОЧЕМУ до сих пор тобой это "дело" не сделано ?!

Что, особые понукания требуются для того чтобы самому сообразить про необходимость этих отладочных действий в дан.ситуации ?


Loginov Dmitry   (2006-05-22 14:47:00) [11]

Вот еще забавный код на эту тему. Обязательно проверьте:
procedure TForm1.FormDestroy(Sender: TObject);
begin
 with TForm1.Create(Application) do ShowModal;
end;


Juice   (2006-05-22 14:46:00) [12]


> Ты придурок или где ?
>
> Тебе почти открытым текстом намекают - воспользуйся встроенным
> в DelphiIDE-отладчиком ! И моментально найдешь все свои
> "глюки" !

Ну, в какой-то степени да. А насчет "где" я не понял. А вот что вы единственный знаете про существование отладчика это вы зря. А по сабжу еще раз скажу проблему : создается форма, сразу вызывается ее ShowModal, а он без показа возвращает 2 (mrCancel). Если вы имели в виду зайти в ShowModal то это другое дело, надо тогда конкретнее выражать свои мысли а не "намеками".

> На кой ляд нам тут твой стек ?

Вы о себе во множественном числе ? Ну тогда мне тоже
> После такого слова мне с вами окончательно не о чем разговаривать


Loginov Dmitry   (2006-05-22 14:33:00) [13]

vovnuke ©   (22.05.06 14:21) [12]
А у тебя когда ДатаМодуль разрушается?


Первый наводящий вопрос :)
Действительно. Если данный объект разрушается объектом Application, то о отрисовке каких-либо форм не может идти речи. Даже такой код ни к чему хорошему не приведет:

procedure TForm1.FormDestroy(Sender: TObject);
begin
 showmessage('Bla Bla Bla');
end;


Лучше обратите внимание на [3]


vovnuke   (2006-05-22 14:31:00) [14]

> Да не важно это, тут в другом проблема
Да скореее всего в кислоте.


Сергей М.   (2006-05-22 14:30:00) [15]


> перед тем как вопрос задавать буду на форум весь стек вываливать


На кой ляд нам тут твой стек ?


Juice   (2006-05-22 14:28:00) [16]


> А у тебя когда ДатаМодуль разрушается?

Да не важно это, тут в другом проблема.

> После такого слова мне с вами окончательно не о чем разговаривать.
>  Всё равно не поймёте.

Ну прости, каюсь, исправлюсь:) Когда тестовую форму кинул то за то что Пушкину писалось не захотелость браться. Теперь перед тем как вопрос задавать буду на форум весь стек вываливать.

> Всё равно не поймёте.

Ну, это спорный вопрос. Есть "понимать" а есть "знать", по одному другое ведь не судят?


Сергей М.   (2006-05-22 14:27:00) [17]


> Juice ©   (22.05.06 14:17) [10]


> Пушкин мог что-то для Борланда написать


Ты придурок или где ?

Тебе почти открытым текстом намекают - воспользуйся встроенным в DelphiIDE-отладчиком ! И моментально найдешь все свои "глюки" !


vovnuke   (2006-05-22 14:21:00) [18]

2 Juice ©
А у тебя когда ДатаМодуль разрушается?


Плохиш   (2006-05-22 14:19:00) [19]


> то тестовая форма уже наверноеприбита

После такого слова мне с вами окончательно не о чем разговаривать. Всё равно не поймёте.


Juice   (2006-05-22 14:17:00) [20]


> Сергей М. ©   (22.05.06 14:06) [8]
>
> > Juice ©   (22.05.06 14:02) [7]
>
>
> Отладчик Борландом для Пушкина писан что ли ?

Уважаемый, это Пушкин мог что-то для Борланда написать, но никак не иначе!

> Честно сказать совершенно не интересно выяснять в каком
> месте суперпуперпрограммы переменной fmTest присваивается
> значение nil. Но за такой код я отрываю руки.

Прав, 100% прав. А ведь действительно, когда доходит до деструкции датамодуля то тестовая форма уже наверное прибита. Но как быть с ShowModal формы что только перед этим была создана ?


Страницы:   1 2

Наверх

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