Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.011 c
2-1150125729
AlexanderMS
2006-06-12 19:22
2006.07.02
Отличие Packed Record от просто Record.


15-1149451695
dimodim
2006-06-05 00:08
2006.07.02
Ось на старом компе или как его замучать?


9-1128284946
Ford
2005-10-03 00:29
2006.07.02
3D Tile


4-1143625032
Darkwin
2006-03-29 13:37
2006.07.02
Работа с портами


3-1146878673
Olesya
2006-05-06 05:24
2006.07.02
Хранение фото в базе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский