Форум: "Основная";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];
ВнизShowModal в DataModule.OnDestroy Найти похожие ветки
← →
Juice © (2006-05-22 13:41) [0]В обработчике события DataModule.OnDestroy я закрываю наборы данных и при этом нужно вывести диалоговое окно, обязательно нужно. У меня есть специальная для этих целей форма, создаю ее и вызываю ShowModal - форма не показывается а ShowModal возвращает mrCancel, хотя в коде и в помине mrCancel не должно быть! Попробовал провести эксперимент: добавил в проект fmTest и в DataModule.OnDestroy вызвал fmTest.ShowModal - получаю EAccessViolation on address 00000000. Короче говоря не хочет фурычить ShowModal в DataModule.OnDestroy. Может чего подскажите ?
← →
Плохиш © (2006-05-22 13:45) [1]Ошибка в 17й строке. Все объекты перед использованием должны быть созданы.
← →
Loginov Dmitry © (2006-05-22 13:46) [2]Juice © (22.05.06 13:41)
Может чего подскажите ?
Не пытайтесь показывать форму в данном обработчике. Придумайте что-нибудь получше.
← →
Чапаев © (2006-05-22 13:48) [3]
> Придумайте что-нибудь получше.
OnClose, OnCloseQuery...
← →
Плохиш © (2006-05-22 13:49) [4]
> Чапаев © (22.05.06 13:48) [3]
>
> > Придумайте что-нибудь получше.
>
> OnClose, OnCloseQuery...
Для TDataModule?
← →
Juice © (2006-05-22 13:54) [5]
> Не пытайтесь показывать форму в данном обработчике. Придумайте
> что-нибудь получше.
Интересно было бы разобраться почему, принцип какой ? Раньше я для этих целей просто показывал (Show) форму и в цикле
repeat
Application.Processmessages
until ...
делал то что надо, и все работало как часы. Потом логика измениласть так, чтобы юзер кроме как на этой форме ничего не мог клацнуть, и вот решил ShowModal вызывать. На OnClose я конечно уже перевесил, просто инетересно почему так происходит, чтобы потом не напороться на те же грабли.
> Ошибка в 17й строке. Все объекты перед использованием должны
> быть созданы.
В -1-ой. Все что надо то создано, это 100%.
← →
Плохиш © (2006-05-22 13:57) [6]
> получаю EAccessViolation on address 00000000.
> В -1-ой. Все что надо то создано, это 100%.
Врёшь.
← →
Juice © (2006-05-22 14:02) [7]
> Врёшь.
Вот этот гениальный код:
procedure TdmCentral.DataModuleDestroy(Sender: TObject);
begin
fmTest.ShowModal;
end;
Ну и конечно:
...
Application.CreateForm(TfmTest, fmTest);
Application.Run;
end.
← →
Сергей М. © (2006-05-22 14:06) [8]
> Juice © (22.05.06 14:02) [7]
Отладчик Борландом для Пушкина писан что ли ?
← →
Плохиш © (2006-05-22 14:08) [9]
> Juice © (22.05.06 14:02) [7]
Честно сказать совершенно не интересно выяснять в каком месте суперпуперпрограммы переменной fmTest присваивается значение nil. Но за такой код я отрываю руки.
← →
Juice © (2006-05-22 14:17) [10]
> Сергей М. © (22.05.06 14:06) [8]
>
> > Juice © (22.05.06 14:02) [7]
>
>
> Отладчик Борландом для Пушкина писан что ли ?
Уважаемый, это Пушкин мог что-то для Борланда написать, но никак не иначе!
> Честно сказать совершенно не интересно выяснять в каком
> месте суперпуперпрограммы переменной fmTest присваивается
> значение nil. Но за такой код я отрываю руки.
Прав, 100% прав. А ведь действительно, когда доходит до деструкции датамодуля то тестовая форма уже наверное прибита. Но как быть с ShowModal формы что только перед этим была создана ?
← →
Плохиш © (2006-05-22 14:19) [11]
> то тестовая форма уже наверное прибита
После такого слова мне с вами окончательно не о чем разговаривать. Всё равно не поймёте.
← →
vovnuke © (2006-05-22 14:21) [12]2 Juice ©
А у тебя когда ДатаМодуль разрушается?
← →
Сергей М. © (2006-05-22 14:27) [13]
> Juice © (22.05.06 14:17) [10]
> Пушкин мог что-то для Борланда написать
Ты придурок или где ?
Тебе почти открытым текстом намекают - воспользуйся встроенным в DelphiIDE-отладчиком ! И моментально найдешь все свои "глюки" !
← →
Juice © (2006-05-22 14:28) [14]
> А у тебя когда ДатаМодуль разрушается?
Да не важно это, тут в другом проблема.
> После такого слова мне с вами окончательно не о чем разговаривать.
> Всё равно не поймёте.
Ну прости, каюсь, исправлюсь:) Когда тестовую форму кинул то за то что Пушкину писалось не захотелость браться. Теперь перед тем как вопрос задавать буду на форум весь стек вываливать.
> Всё равно не поймёте.
Ну, это спорный вопрос. Есть "понимать" а есть "знать", по одному другое ведь не судят?
← →
Сергей М. © (2006-05-22 14:30) [15]
> перед тем как вопрос задавать буду на форум весь стек вываливать
На кой ляд нам тут твой стек ?
← →
vovnuke © (2006-05-22 14:31) [16]> Да не важно это, тут в другом проблема
Да скореее всего в кислоте.
← →
Loginov Dmitry © (2006-05-22 14:33) [17]vovnuke © (22.05.06 14:21) [12]
А у тебя когда ДатаМодуль разрушается?
Первый наводящий вопрос :)
Действительно. Если данный объект разрушается объектом Application, то о отрисовке каких-либо форм не может идти речи. Даже такой код ни к чему хорошему не приведет:procedure TForm1.FormDestroy(Sender: TObject);
begin
showmessage("Bla Bla Bla");
end;
Лучше обратите внимание на [3]
← →
Juice © (2006-05-22 14:46) [18]
> Ты придурок или где ?
>
> Тебе почти открытым текстом намекают - воспользуйся встроенным
> в DelphiIDE-отладчиком ! И моментально найдешь все свои
> "глюки" !
Ну, в какой-то степени да. А насчет "где" я не понял. А вот что вы единственный знаете про существование отладчика это вы зря. А по сабжу еще раз скажу проблему : создается форма, сразу вызывается ее ShowModal, а он без показа возвращает 2 (mrCancel). Если вы имели в виду зайти в ShowModal то это другое дело, надо тогда конкретнее выражать свои мысли а не "намеками".
> На кой ляд нам тут твой стек ?
Вы о себе во множественном числе ? Ну тогда мне тоже
> После такого слова мне с вами окончательно не о чем разговаривать
← →
Loginov Dmitry © (2006-05-22 14:47) [19]Вот еще забавный код на эту тему. Обязательно проверьте:
procedure TForm1.FormDestroy(Sender: TObject);
begin
with TForm1.Create(Application) do ShowModal;
end;
← →
Сергей М. © (2006-05-22 14:50) [20]
> Если вы имели в виду зайти в ShowModal то это другое дело
ПОЧЕМУ до сих пор тобой это "дело" не сделано ?!
Что, особые понукания требуются для того чтобы самому сообразить про необходимость этих отладочных действий в дан.ситуации ?
← →
Juice © (2006-05-22 14:56) [21]Ну, я могу отвертеться. В проекте используются RunTime packages, наверное поэтому я не могу зайти туда отладчиком.
← →
Сергей М. © (2006-05-22 14:58) [22]Продолжай "отвертываться".
Сия опция линкера не мешает отладке.
← →
Сергей М. © (2006-05-22 15:00) [23]
> получаю EAccessViolation on address
И врать продолжай (см. выделенное жирным)
← →
StriderMan © (2006-05-22 16:15) [24]вобщем криво все...
Но ругать плохими словами за это программера не стоит, как писать код - личное дело каждого, просто вежливо и спокойно укажем явные недостатки и ошибки.
Форма fmTest скоре всего уже разружена объектом Application. А показывать (fmTest.ShowModal) ее надо в самом начале обработки события, ведущего к завершению приложения.
например OnClose главной формы (если она есть).
И если форма используется только в этом месте, то нужно убрать ее из списка AutoCreate, и создавать ручками
with TfmTest.Create(nil) do
try
ShowModal;
finally
Free;
end;
← →
Плохиш © (2006-05-22 17:19) [25]
> StriderMan © (22.05.06 16:15) [24]
> И если форма используется только в этом месте, то
Вот эти слова выкидываем и оставляем всё, что следует дальше :-)
← →
Juice © (2006-05-23 22:22) [26]Раз:
> получаю EAccessViolation on address
Я сидел и чесно геморился с отладчиком на нужной мне форме, выяснил факт который изложил в вопросе, потом чтобы исключить влияние на проблему самой формы, я добавил чистую новую форму и попробовал на ней. Не получилось, и сразу задал вопрос на форум. И это означает что хрен с той тестовой формой, забыли о ней, вопрос не в ней, и "наверное" было писано т.к. когда вопрос уже запостился то ее и в помине уже не было. Всем кто приобщается к ветке : вопрос не в том как получить аксесс виолейшн при попытке вызвать метод несуществующего обьекта, а почему ShowModal СУЩЕСТВУЮЩЕЙ формы в деструкторе модуля данных в частности (на другом не проверял) выкидывает такую хрень, какую скаано в вопросе.
> вобщем криво все...
>
> Но ругать плохими словами за это программера не стоит, как
> писать код - личное дело каждого, просто вежливо и спокойно
> укажем явные недостатки и ошибки.
>
> Форма fmTest скоре всего уже разружена объектом Application.
> А показывать (fmTest.ShowModal) ее надо в самом начале
> обработки события, ведущего к завершению приложения.
>
> например OnClose главной формы (если она есть).
>
> И если форма используется только в этом месте, то нужно
> убрать ее из списка AutoCreate, и создавать ручками
>
> with TfmTest.Create(nil) do
> try
> ShowModal;
> finally
> Free;
> end;
Как видишь ничего кривого.
> Тебе почти открытым текстом намекают - воспользуйся встроенным
> в DelphiIDE-отладчиком ! И моментально найдешь все свои
> "глюки" !
А вот хуже всего что глюки бывают не только мои, а и в самих библиотеках. И даже не просите меня приводить примеры, не надо нам тут священной войны.
← →
ЮЮ © (2006-05-24 10:04) [27]чтобы исключить влияние на проблему самой формы, я добавил чистую новую форму и попробовал на ней. Не получилось,
Вот создал новый проект. Всё работает. Следовательно ищи ошибки у себя: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.
← →
Плохиш © (2006-05-24 11:29) [28]
> ЮЮ © (24.05.06 10:04) [27]
> procedure TDataModule2.DataModuleDestroy(Sender: TObject);
>
> begin
> TForm3.Create(nil).ShowModal;
> end;
Ну так вот про указания на эти волшебные слова он понять и не может.
← →
StriderMan © (2006-05-24 11:42) [29]
> TForm3.Create(nil).ShowModal;
я понимаю, что код тестовый, но все таки объекты разрушать надо, а то новички скопируют а потом будут постить - "куда память девается"
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2006.07.02;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.009 c