Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
3-60982
progger
2002-08-29 09:59
2002.09.19
DBGrid


14-61297
Вадим
2002-08-23 19:21
2002.09.19
soft.mail.ru кирдык?


4-61344
OlegG
2002-07-26 16:59
2002.09.19
Как узнать частоту работы процессора


4-61369
Vadims
2002-07-31 01:32
2002.09.19
Работа с чужим окном


1-61089
манечка
2002-09-06 13:21
2002.09.19
Единицы измерения





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