Форум: "Основная";
Текущий архив: 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