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

Вниз

Как закрыть модальное окно?   Найти похожие ветки 

 
PZ   (2006-12-25 12:51) [0]

У меня модальная форма без заголовка:
BorderStyle = bsNone
KeyPreviw = True

Всю площадь формы закрывает компонент Bevel1, а его
полностью закрывает метка Label1
Пробую два варианта закрыть форму - не закрывается.
Как же её можно закрыть? Подскажите, пожалуйста.

procedure TForm1.FormDblClick(Sender: TObject);
begin
 Form1.Close;
end;

procedure TForm1.Label1DblClick(Sender: TObject);
begin
 Form1.Close;
end;


 
Anatoly Podgoretsky ©   (2006-12-25 13:06) [1]

> PZ  (25.12.2006 12:51:00)  [0]

А чей у тебя Form1 ?


 
novill ©   (2006-12-25 13:12) [2]

[0] PZ   (25.12.06 12:51)
второй вариант работает.


 
PZ   (2006-12-25 13:14) [3]

>  [1] Anatoly Podgoretsky ©   (25.12.06 13:06)

Form1 - это  та самая модальная форма, которую пытаюсь закрыть


 
Ega23 ©   (2006-12-25 13:16) [4]


> Form1 - это  та самая модальная форма, которую пытаюсь закрыть
>


МодалРезулт:=мрОК


 
PZ   (2006-12-25 13:21) [5]

> [2] novill ©   (25.12.06 13:12)

У меня почему-то не работает. Проверю еще раз.


 
Anatoly Podgoretsky ©   (2006-12-25 13:23) [6]

> PZ  (25.12.2006 13:14:03)  [3]

Чем докажешь?


 
PZ   (2006-12-25 13:34) [7]

Нет втрой вариант не работает

> [4] Ega23 ©   (25.12.06 13:16)

procedure TForm1.Label1DblClick(Sender: TObject);
begin
Form1.ModalResult := mpOk;  // Error Undeclared Identifier
Form1.Close;
end;


 
PZ   (2006-12-25 13:35) [8]

> [6] Anatoly Podgoretsky ©   (25.12.06 13:23)

У меня другой формы с тким именем нет


 
Германн ©   (2006-12-25 13:43) [9]


> Form1.ModalResult := mpOk;  // Error Undeclared Identifier

mrOK
И Close после этого не нужен


 
novill ©   (2006-12-25 13:43) [10]

> [7] PZ   (25.12.06 13:34)

а у меня все равно работает


 
Anatoly Podgoretsky ©   (2006-12-25 13:43) [11]

> PZ  (25.12.2006 13:35:08)  [8]

Не верю. При том я не про форму спрашивал, а про переменную.


 
novill ©   (2006-12-25 13:46) [12]

> Form1.ModalResult := mpOk;  // Error Undeclared Identifier

это наверное от того что правильно писать mrOk


 
Anatoly Podgoretsky ©   (2006-12-25 13:59) [13]


> а у меня все равно работает

У тебя наверно правильный Form1
Только нафиг он совсем нужен?


 
PZ   (2006-12-25 14:21) [14]

Исправил mpOk -> mrOK

> [11] Anatoly Podgoretsky ©   (25.12.06 13:43)
> [1] Anatoly Podgoretsky ©   (25.12.06 13:06)
> А чей у тебя Form1 ?

Не понял, о какой переменной идет речь?
А Form1 - действительно модальная форма, которую мне надо закрыть, но она не включена в проект, а создается динамически в главной форме,  по таймеру:

     If {некоторое условие} then
         Try
           Form1 := TForm1.Create(Owner);
           ......
           Form1.ShowModal;
         Finally
           FreeAndNil(Form1);
         End;


 
PZ   (2006-12-25 14:23) [15]

Может быть таймер не дает закрывать эту форму?


 
alex_*** ©   (2006-12-25 14:25) [16]

а нажатие на крестик в верх. правом углу не закрывает форму? (таймер не влияет на закрытие)


 
PZ   (2006-12-25 14:28) [17]

> [16] alex_*** ©   (25.12.06 14:25)

Вы не внимательно прочитали мой вопрос: форма без заголовка


 
alex_*** ©   (2006-12-25 14:30) [18]

тогда dblclick по лабелу решит проблему


 
PZ   (2006-12-25 14:37) [19]

> [18] alex_*** ©   (25.12.06 14:30)

Я тоже так думаю, но не решает ...


 
Anatoly Podgoretsky ©   (2006-12-25 14:38) [20]

> PZ  (25.12.2006 14:21:14)  [14]

О переменной с именем Form1
Нормальный код ты категорически отказываешься приводить, а гадать уже я не хочу.


 
alex_*** ©   (2006-12-25 14:52) [21]


> Я тоже так думаю, но не решает ...

ты туда попадаешь вообще?


 
PZ   (2006-12-25 14:55) [22]

> [20] Anatoly Podgoretsky ©   (25.12.06 14:38)

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


 
Anatoly Podgoretsky ©   (2006-12-25 14:56) [23]

Не понимаешь и ладно, а понимаешь ли ты то, что указано ранее, что переменная Form1 не нужна?


 
novill ©   (2006-12-25 14:57) [24]

> [22] PZ   (25.12.06 14:55)

создай новый проект с двумя формами - одна будет основная с кнопкой модального вызова второй, а вторая без границ с бевелом и лейблом, назначь соотв. методы. и пробуй!


 
PZ   (2006-12-25 15:00) [25]

> [21] alex_*** ©   (25.12.06 14:52)

Label растянут по всей форме allClient. Ну как не попасть?


 
alex_*** ©   (2006-12-25 15:07) [26]

ну так скажи, попадаешь или нет? до брейк поинта доходишь?


 
alex_*** ©   (2006-12-25 15:10) [27]

Да, кстати обрати внимание на [23] - убери указание Form1 для методов и никогда так не делай. (замени на self, если так хочется класс указать)


 
Anatoly Podgoretsky ©   (2006-12-25 15:18) [28]

> alex_***  (25.12.2006 15:10:27)  [27]

self тоже лишнее


 
PZ   (2006-12-25 15:32) [29]

> [23] Anatoly Podgoretsky ©   (25.12.06 14:56)
> [27] alex_*** ©   (25.12.06 15:10)

Form1 я убрал. Может это не прилично то, что я пишу Form1, но работе-то это не мешает.

> [26] alex_*** ©   (25.12.06 15:07)

ну так скажи, попадаешь или нет? до брейк поинта доходишь?

Нет, не дохожу.

Давайте приостановим обсуждение. Я уже получил от вас много рекомендаций. В спокойной обстановке поэксперименитую, возможно найду решение.
Спасибо всем, принявшим участие в этом трудном диалоге.
С уважением, PZ


 
evvcom ©   (2006-12-26 09:06) [30]

> [29] PZ   (25.12.06 15:32)
> Может это не прилично то, что я пишу Form1, но работе-то
> это не мешает

Судя по тому, что ты здесь, видимо, мешает.


 
PZ   (2006-12-26 12:50) [31]

> [30] evvcom ©   (26.12.06 09:06)

Возможно мешает. Я больше так не пишу.

Итак, что я выяснил. У меня есть процедура, чтобы можно было перемещать окно при нажатой левой кнопке мыши:

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
 inherited;
 if M.Result = htClient then M.Result := htCaption;
end;

Так вот, если закомментировать эту процедуру, то окошко закрывется по следующему обработчику, иначе нет:

procedure TForm1.Label1DblClick(Sender: TObject);
begin
 ModalResult := mrOk;
end;

Теперь я в полном тупике. Не знаю, как сохранить возможность перемещать окно и закрывать его по ненадобности.
Если кто-то может, пожалуйста помогите.


 
Anatoly Podgoretsky ©   (2006-12-26 12:53) [32]

> PZ  (26.12.2006 12:50:31)  [31]

А чего ты хочешь, сам же навесил на кнопку две взаимоисключающие вещи.


 
novill ©   (2006-12-26 12:54) [33]

повесь свою процедуру только на wm_mousemove


 
novill ©   (2006-12-26 13:00) [34]

> [33] novill ©   (26.12.06 12:54)

не, не пойдет


 
palva ©   (2006-12-26 13:03) [35]

Alt-F4 разве не срабатывает?


 
PZ   (2006-12-26 13:06) [36]

> [35] palva ©   (26.12.06 13:03)

Не пробовал


 
PZ   (2006-12-26 13:09) [37]

> [36] PZ   (26.12.06 13:06)

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


 
novill ©   (2006-12-26 13:10) [38]

как насчет того чтобы перенести закрытие в обработчик WM_LBUTTONDBLCLK


 
PZ   (2006-12-26 13:20) [39]

> [38] novill ©   (26.12.06 13:10)

Я, к сожалению, с собщениями Windows не очень в дружбе.
Может быть Вы напишите примером.

Я попробовал  PostMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0), тоже никакой реакции.


 
novill ©   (2006-12-26 13:47) [40]

> [39] PZ   (26.12.06 13:20)

как пробовал? кинь код. я не знаю, где и что ты еще успел перехватить


 
PZ   (2006-12-26 13:51) [41]

> [40] novill ©   (26.12.06 13:47)

procedure TForm1.Label1DblClick(Sender: TObject);
begin
 PostMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
end;


 
PZ   (2006-12-26 13:56) [42]

Т. е. у меня сейчас два обработчикка:

procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
begin
inherited;
if M.Result = htClient then M.Result := htCaption;
end;

procedure TForm1.Label1DblClick(Sender: TObject);
begin
PostMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
end;


 
novill ©   (2006-12-26 14:22) [43]

Учитывая
> Я, к сожалению, с собщениями Windows не очень в дружбе.

рекомендую воспользоваться обычными событиями, возььмите соседния пример в Дельфиворлд:

public
 { Public declarations }
 Draging: Boolean;
 X0, Y0: integer;



Draging - для обозначение того периода времени когда пользователь перемещает мышь с зажатой кнопкой мыши,
X0 и Y0 - координаты точки, над которой была зажата кнопка мыши
Далее описываем события формы OnMouseDown, OnMouseMove и OnMouseUp:

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
 Draging := true;
 x0 := x;
 y0 := y;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
 Draging := false;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
 if Draging = true then
 begin
   Form1.Left := Form1.Left + X - X0;
   Form1.top := Form1.top + Y - Y0;
 end;
end;



тогда у вас ничего не будет перехватыватсья лишнего


 
novill ©   (2006-12-26 14:33) [44]

естесственно события вешать на события не на формы, а лейбла.


 
PZ   (2006-12-26 14:46) [45]

> [43] novill ©   (26.12.06 14:22)

Как обычно, все гениальное просто!
Нормально работает.
Смутила меня эта процедура Орлика для перемещения окна без заголовка. Почему-то я думал, что без нее ни чем сдвинуть с места окно невозможно.

Спасибо, novill, еще раз спасибо всем-всем, принимавшим участие в обсуждении.
С уважением, PZ.

С наступающим Новым Годом!


 
PZ   (2006-12-26 14:48) [46]

> [44] novill ©   (26.12.06 14:33)

Да, естественно. Я так и сделал



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

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

Наверх




Память: 0.58 MB
Время: 0.057 c
15-1167084003
PHPdeveloper
2006-12-26 01:00
2007.01.14
PHP


15-1166814293
Ученик чародея
2006-12-22 22:04
2007.01.14
Что курили в Microsoft, когда это писали?


15-1166631218
Ega23
2006-12-20 19:13
2007.01.14
Можно ли как-нибудь настроить Complete class at cursor ?


2-1166675721
Marat
2006-12-21 07:35
2007.01.14
округлить число


2-1166882884
kroner
2006-12-23 17:08
2007.01.14
дочерняя форма в dll