![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
ShowModal в DataModule.OnDestroy [D7]
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 формы что только перед этим была создана ?