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

Вниз

формы1   Найти похожие ветки 

 
Natali   (2002-09-05 12:24) [0]

Добрый день! Подскажите, умельцы, как закрыть эту ... форму - я из формы1 открываю модально форму2, где сразу выполняется процедура одна такая плюс в ней закрытие формы2, она не хочет, почему?
Пока.


 
ЮЮ ©   (2002-09-05 12:30) [1]

она не хочет, почему?
Знать бы чего она не хочет, возможно и сказалт бы почему :-)


 
Natali   (2002-09-05 12:46) [2]

форма2 не хочет закрываться


 
still ©   (2002-09-05 12:53) [3]

Может процедура (которая перед закрытием выполняется) не заканчивается. Поставь брек-пойнт на вызов Form.Close. Оно вообще туда попадает?


 
Anatoly Podgoretsky ©   (2002-09-05 12:59) [4]

Лучше покажи как закрываешь, и обработчик OnCloseQuery


 
ЮЮ ©   (2002-09-05 13:02) [5]

Действительно, сама не закрывается. А может это нормальное поведение. Ведб юзер должен делать какой-то выбор или хотябы оповещён с помощью этой формы. Для чего-то она вель открывалась.


 
ЮЮ ©   (2002-09-05 13:16) [6]

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


 
Старый Паскалист   (2002-09-05 13:19) [7]

Так уж устроена ф-я ShowModal -
ни в OnShow, ни в OnActivate Close не работает.

И ModalResult там тоже не сработает - он инициализируется после СM_ACTIVATE.


 
TDump   (2002-09-05 13:23) [8]

Можно послать сообщение в OnActivate:
PostMessage({FormThatShowsModal.}Handle, WM_CLOSE, 0, 0);

Именно Post, а не Send или Perform.
Оно пойдёт в очередь и не будет обработано до того, как ShowModal проведёт всю инициализацию.


 
Старый Паскалист   (2002-09-05 13:25) [9]

Пардон, ник не исправил


 
Natali   (2002-09-05 13:56) [10]

Спасибо, сижу разбираю, PostMessage({FormThatShowsModal.}Handle, WM_CLOSE, 0, 0);
Уже, до завтра.


 
Natali   (2002-09-05 14:22) [11]

postmessage(findwindow(nil,"Form2"), wm_close,0,0) - вот только так могу, но я природы не поняла, перед этим, процедура успеет выполнится или нет, не могу окно задержать, sleep чево-то не работает.


 
Старый Паскалист   (2002-09-05 14:36) [12]

Я собственно, сам не очень представляю, что ты делаешь.
По моим представлениям у тебя должно быть что-то вроде


procedure TForm1.Чего_то_Там(...);
begin
...
Form2.ShowModal;
...
end;

procedure TForm2.FormActivate(Sender: TObject);
// Обработчик OnActivate
begin
SomeProc(...);// Вызов твоей процедуры. Сработает.
Close; // НЕ сработает.
PostMessage(Handle, WM_CLOSE, 0, 0);
// Тебе не надо находить окно, ты посылаешь сообщение этой же
// форме и используешь её хэндл.
end;

Может, я не вполне понял?


А теперь почему это сработает:

{---------------------------------------------------}
function TCustomForm.ShowModal: Integer;
var
WindowList: Pointer;
SaveFocusCount: Integer;
SaveCursor: TCursor;
SaveCount: Integer;
ActiveWindow: HWnd;
begin
CancelDrag;
if Visible or not Enabled or (fsModal in FFormState) or
(FormStyle = fsMDIChild) then
raise EInvalidOperation.Create(SCannotShowModal);
if GetCapture <> 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
ReleaseCapture;
Include(FFormState, fsModal);
ActiveWindow := GetActiveWindow;
SaveFocusCount := FocusCount;
Screen.FSaveFocusedList.Insert(0, Screen.FFocusedForm);
Screen.FFocusedForm := Self;
SaveCursor := Screen.Cursor;
Screen.Cursor := crDefault;
SaveCount := Screen.FCursorCount;
WindowList := DisableTaskWindows(0);
try
Show; // Вызванное здесь (OnShow)
try
SendMessage(Handle, CM_ACTIVATE, 0, 0); // Или здесь (в OnActivate)
// Close не сработает.

ModalResult := 0;
repeat
Application.HandleMessage; // А с помощью PostMessage ты
// переносишь Close сюда. Тут оно сработает.

if Application.FTerminate then ModalResult := mrCancel else
if ModalResult <> 0 then CloseModal;
until ModalResult <> 0;
Result := ModalResult;
SendMessage(Handle, CM_DEACTIVATE, 0, 0);
if GetActiveWindow <> Handle then ActiveWindow := 0;
finally
Hide;
end;
finally
if Screen.FCursorCount = SaveCount then
Screen.Cursor := SaveCursor
else Screen.Cursor := crDefault;
EnableTaskWindows(WindowList);
if Screen.FSaveFocusedList.Count > 0 then
begin
Screen.FFocusedForm := Screen.FSaveFocusedList.First;
Screen.FSaveFocusedList.Remove(Screen.FFocusedForm);
end else Screen.FFocusedForm := nil;
if ActiveWindow <> 0 then SetActiveWindow(ActiveWindow);
FocusCount := SaveFocusCount;
Exclude(FFormState, fsModal);
end;
end;


 
Старый Паскалист   (2002-09-05 14:51) [13]

Да, кстати, а зачем всё это?
Как оно должно в идеале выглядеть?


 
lero   (2002-09-05 15:15) [14]

Natali, а зачем form2 делать модальной? Обычное окно вполне подходит. Поставь BorderStyle=bsNone, после завершения процесса CLOSE;


 
Natali   (2002-09-06 06:48) [15]

я архивирую, и чтобы user не прерывал процесс, вызываю форму2 с прогрессом, без сис.меню
Всем, спасибо большое, я всего второй год работаю программером, не хватает на все времени, ПОКА.


 
Song ©   (2002-09-06 08:09) [16]

Всего второй год???? :-))))


 
Natali   (2002-09-06 10:30) [17]

И ЧЕГО - ЭТО ВЫ ТАК УДИВЛЯЕТЕСЬ SONG


 
Anatoly Podgoretsky ©   (2002-09-06 10:47) [18]

Natali (06.09.02 06:48)
Проще всего все делать во второй форме, а что бы это было наромально просто брось на форму таймер, активируй его в OnCreate, ы обработчике OnTimer запрети его .Enable:=true
и в нем же начни свою архивацию, по окончанию Close
Есть естественно и другие пута, но этот просто простой и понятный


 
ЮЮ ©   (2002-09-06 11:16) [19]

Проще, чем строчка кода: PostMessage(Handle, WM_CLOSE, 0, 0);???


 
Natali   (2002-09-06 11:17) [20]

СКОРЕЕ СЛОЖНЕЕ


 
Taifur ©   (2002-09-09 06:59) [21]

странно даже "Application.ProcessMessages" перед "Close" не помогает,
с таймером кажись проще всего
-------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons;

type
TForm1 = class(TForm)
BitBtn1: TBitBtn;
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Form2.ShowModal;
end;

end.
-------------------------------
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls;

type
TForm2 = class(TForm)
Timer1: TTimer;
procedure FormActivate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.DFM}

procedure TForm2.FormActivate(Sender: TObject);
begin
Timer1.Enabled := True;
end;

procedure TForm2.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
Close;
end;

end.


 
Natali   (2002-09-09 10:21) [22]

Я использовала PostMessage, но последнее тоже интересно. Какие вы все умницы, Спасибо, всем, пока.



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

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

Наверх




Память: 0.52 MB
Время: 0.017 c
6-61235
Wild Wizard
2002-07-17 10:52
2002.09.19
Сокеты


8-61221
VID
2002-05-19 19:58
2002.09.19
Нужно:


14-61277
VictorT
2002-08-23 13:42
2002.09.19
Кодировка


1-61064
Александр
2002-09-08 09:07
2002.09.19
Помогите разобраться


14-61278
ded_di
2002-08-22 17:50
2002.09.19
Господа, помогите с алгоритмом.