Форум: "Основная";
Текущий архив: 2002.09.19;
Скачать: [xml.tar.bz2];
Внизформы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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c