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

Вниз

Как корректно закрыть форму при обработке события onShow?   Найти похожие ветки 

 
Rookie   (2003-10-30 16:29) [0]

Привет всем!
Имеем обработку события OnShow:

procedure TMyForm.FormShow(Sender: TObject);
begin
FillForm;
end;

вызываю процедуру

function TMyFormTest.FillForm : FResult;
begin
OraQuery.SQL.Clear;
OraQuery.SQL.Add("select * from oracle.test1
where rownum<3");
OraQuery.Open;
end;

а для OraQuery обработчик события

procedure TMyForm.OraQueryAfterOpen(DataSet: TDataSet);
begin
OraQuery.Next;
if not OraQuery.Eof then
begin
Self.Release;
raise Exception.Create("Query return more than one row");
end;
end;

Если делаю так, то форма не показывается, но вернуться в главное
окно невозможно, корявость короче. Если вместо Release использую Free, то выдает ошибку(Can"t change visible in onShow or onHide)
и все равно показывает форму. А обработка нужна именно в онШоу.
И
Как быть, кроме переопределения ShowModal ничего на ум не идет :(


 
VAleksey ©   (2003-10-30 16:38) [1]

Нужно послать сообщение форме с помощью PostMessage


 
Rookie   (2003-10-30 16:48) [2]

Да пробовал, не спасает. Фокус зависает на кнопке, которая
делает вызов ShowModal. После этого вернуться в окно
приложения я не могу. Пробовал посылать главному WM_ACTIVATE,
бесполезно.


 
Юрий Федоров ©   (2003-10-30 16:51) [3]

Перенеси "опасные" операции в конструктор модальной формы


 
Юрий Федоров ©   (2003-10-30 16:52) [4]

и Self.Release убери


 
Skier ©   (2003-10-30 17:00) [5]

>Rookie (30.10.03 16:48) [2]
А метод TMyForm.CanShow не судьба сделать ? :)


 
Rookie   (2003-10-30 17:04) [6]

Нет такой возможности, нужно для onShow.
Видимо, можно только переопределить ShowModal?


 
Skier ©   (2003-10-30 17:05) [7]


> Нет такой возможности

???


 
Amoeba   (2003-10-30 17:11) [8]


> Rookie (30.10.03 17:04) [6]
> Нет такой возможности, нужно для onShow.
> Видимо, можно только переопределить ShowModal?

Объясни же наконец обществу, ради Бога, ну почему твой код должен выполняться именно в OnShow, а не до этого - в OnCreate или в перекрытом конструкторе? Что мешает?


 
Малиновский Владимир   (2003-10-30 17:22) [9]

Хочешь использовать OnShow? - Используй!.
Вариант (если таких форм много):
Создаем пустую базовую форму CreateAndShowModal

unit ufrm_BaseCreateAndShowModal;
// Это форма, которая может быть создана и показана в модальном режиме
interface

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

type
Tfrm_BaseCreateAndShowModal = class (TForm)
protected
a_params : array of variant;
public
class function CreateAndShowModal(const params : array of variant): Integer; // Параметры - по желанию
end;

implementation

{$R *.dfm}

{ Tfrm_CreateAndShowModal }

{
************************* Tfrm_BaseCreateAndShowModal **************************
}
class function Tfrm_BaseCreateAndShowModal.CreateAndShowModal(const params : array of variant): Integer;
var i : integer;
begin
with Create(Application) do begin
SetLength(a_params, Length(params));
for i := 0 to Length(params) - 1 do // Чтобы в производныз классах иметь доступ к параметрам
a_params[i] := params[i];
try
Result := ShowModal;
finally
SetLength(a_params,0);
Free;
Self := nil;
end
end;
end;

end.

Помещаешь форму в репозитарий, потом наследушь от нее сколько нужно своих форм, и вызываешь их, например, "по кнопке" из вызывающей формы, например:

Tfrm_About.CreateAndShowModal([]);

В данном случае - вызвана созданная и наследованная от Tfrm_BaseCreateAndShowModal форма Tfrm_About. Без параметров.

Надеюсь, я Вам помог.


 
VAleksey ©   (2003-10-30 17:25) [10]

Епрст...

А вот так не проще??

Было:

> Self.Release;
> raise Exception.Create("Query return more than one row");


Стало:

MessageDlg("Query return more than one row",mtError,[mbOk],0);
PostMessage(Self.Handle,WM_MY_CLOSE,0,0);


и еще

procedure TForm2.MyMessage(var Msg: Tmessage);
begin
Close;
end;


 
Anatoly Podgoretsky ©   (2003-10-30 17:25) [11]

Skier © (30.10.03 17:05) [7]
Ну обычное дело, не понимают и пытаются показать форму, хотя это не нужно в определенных ситуациях, а разделить обработку и показ не могут.


 
VAleksey ©   (2003-10-30 17:27) [12]

Ну и типа где то сверху

const
WM_MY_CLOSE = WM_USER+1;


procedure MyMessage(var Msg:Tmessage); message WM_MY_CLOSE;


 
Skier ©   (2003-10-30 17:27) [13]

>Anatoly Podgoretsky © (30.10.03 17:25) [11]
Угу. Похоже что так.


 
Rookie   (2003-10-30 17:28) [14]

Потому, что форма должна обновлять свое содержимое именно
по событию OnShow. Создается она единожды. Затем периодически
исчезает\появляется, это инициирует другой компонент,
который вызывает Show.
И именно тогда она перезапрашивает данные. Это вводные данные.
сама форма такова, что в ее структуре
накапливаются данные о событиях.


 
VAleksey ©   (2003-10-30 17:29) [15]

PS
И ребята правы.
Определять показывать форму или нет нужно выяснить ДО использования ShowModal.


 
Малиновский Владимир   (2003-10-30 17:31) [16]

Тогда используй систему сообщений, раз уж так нужно хранить форму все время. Отправляй мессагу в окно формы, пусть она сама ее обрабатывает.


 
GIL ©   (2003-10-30 17:31) [17]

пиши закрытие формы на событие OnActivate, а в OnShow, присваивай какой-нибудь глобальной переменной какое-нибудь значение #True, а на OnActivate проверяй это значение, если оно то, то закрывай форму


 
Anatoly Podgoretsky ©   (2003-10-30 17:31) [18]

Rookie (30.10.03 17:28) [14]
Ну и что, выаолни проверку до вызова Show

MyForm.FillForm;
MyForm.Show;


 
Малиновский Владимир   (2003-10-30 17:31) [19]

А не ShowModal.


 
Anatoly Podgoretsky ©   (2003-10-30 17:38) [20]

Малиновский Владимир (30.10.03 17:31) [19]
Show/ShowModal


 
GIL ©   (2003-10-30 17:42) [21]

Извини не дочитал до конца, но все равно, делай лучше тогда в OnActivate, с помощью нехитрых манипуляций можно сделать так, что все будет работать аналогично если сделать на OnShow!! просто подумай головой



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.043 c
14-42125
Bel
2003-10-21 20:12
2003.11.13
Вопрос к украинцам.


14-41886
IGray
2003-10-22 02:52
2003.11.13
Идеальный BACKUP хочу


4-42262
RustiK
2003-09-13 18:28
2003.11.13
Перехват двойного нажатия клавиш такие как Alt+X


14-41895
Тролль
2003-10-20 10:48
2003.11.13
ListBox


14-42114
Zergling
2003-10-21 13:42
2003.11.13
Nastalgy