Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.02;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.042 c
15-1149282888
Tack
2006-06-03 01:14
2006.07.02
Нужна простенькая однопользовательская система контроля версий


15-1149677381
Fishka
2006-06-07 14:49
2006.07.02
Модераторам!!!!


8-1138192330
0bsid
2006-01-25 15:32
2006.07.02
как можно узнать, на какой пиксель TImage кликнул юзер?


15-1148544478
Agent13
2006-05-25 12:07
2006.07.02
2007 Microsoft Office System Beta 2


3-1146728733
Alexey V.
2006-05-04 11:45
2006.07.02
Курс валюты в выходные дни