Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

Как корректно закрыть форму при обработке события 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.032 c
3-40973
Пубертанец
2003-10-24 17:09
2003.11.13
Уже заколебался с запросом...


3-40787
grifon-nn
2003-10-21 22:27
2003.11.13
Индексы Paradox


6-41813
alex732
2003-09-15 15:59
2003.11.13
ESockError 10022:Invalid argument


1-41455
ewgeny
2003-10-29 11:14
2003.11.13
отработка сообщений Windows


1-41676
Igit
2003-10-24 20:16
2003.11.13
pascal and assembler





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский