![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как закрыть модальное окно?
PZ © (2006-12-25 12:51:00)У меня модальная форма без заголовка:
BorderStyle = bsNone
KeyPreviw = True
Всю площадь формы закрывает компонент Bevel1, а его
полностью закрывает метка Label1
Пробую два варианта закрыть форму - не закрывается.
Как же её можно закрыть? Подскажите, пожалуйста.
procedure TForm1.FormDblClick(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.Label1DblClick(Sender: TObject);
begin
Form1.Close;
end;
PZ (2006-12-26 14:48:00) [1]> [44] novill © (26.12.06 14:33)
Да, естественно. Я так и сделал
PZ (2006-12-26 14:46:00) [2]> [43] novill © (26.12.06 14:22)
Как обычно, все гениальное просто!
Нормально работает.
Смутила меня эта процедура Орлика для перемещения окна без заголовка. Почему-то я думал, что без нее ни чем сдвинуть с места окно невозможно.
Спасибо, novill, еще раз спасибо всем-всем, принимавшим участие в обсуждении.
С уважением, PZ.
С наступающим Новым Годом!
novill (2006-12-26 14:33:00) [3]естесственно события вешать на события не на формы, а лейбла.
novill (2006-12-26 14:22:00) [4]Учитывая
> Я, к сожалению, с собщениями 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;
тогда у вас ничего не будет перехватыватсья лишнего
PZ (2006-12-26 13:56:00) [5]Т. е. у меня сейчас два обработчикка:
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;
PZ (2006-12-26 13:51:00) [6]> [40] novill © (26.12.06 13:47)
procedure TForm1.Label1DblClick(Sender: TObject);
begin
PostMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
end;
novill (2006-12-26 13:47:00) [7]> [39] PZ (26.12.06 13:20)
как пробовал? кинь код. я не знаю, где и что ты еще успел перехватить
PZ (2006-12-26 13:20:00) [8]> [38] novill © (26.12.06 13:10)
Я, к сожалению, с собщениями Windows не очень в дружбе.
Может быть Вы напишите примером.
Я попробовал PostMessage(Handle, WM_SYSCOMMAND, SC_CLOSE, 0), тоже никакой реакции.
novill (2006-12-26 13:10:00) [9]как насчет того чтобы перенести закрытие в обработчик WM_LBUTTONDBLCLK
PZ (2006-12-26 13:09:00) [10]> [36] PZ (26.12.06 13:06)
Попробовал - срабатывает. Но я этми кнопками никогда не пользуюсь, не люблю.
В крайнем случае придется...
PZ (2006-12-26 13:06:00) [11]> [35] palva © (26.12.06 13:03)
Не пробовал
palva (2006-12-26 13:03:00) [12]Alt-F4 разве не срабатывает?
novill (2006-12-26 13:00:00) [13]> [33] novill © (26.12.06 12:54)
не, не пойдет
novill (2006-12-26 12:54:00) [14]повесь свою процедуру только на wm_mousemove
Anatoly Podgoretsky (2006-12-26 12:53:00) [15]> PZ (26.12.2006 12:50:31) [31]
А чего ты хочешь, сам же навесил на кнопку две взаимоисключающие вещи.
PZ (2006-12-26 12:50:00) [16]> [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;
Теперь я в полном тупике. Не знаю, как сохранить возможность перемещать окно и закрывать его по ненадобности.
Если кто-то может, пожалуйста помогите.
evvcom (2006-12-26 09:06:00) [17]> [29] PZ (25.12.06 15:32)
> Может это не прилично то, что я пишу Form1, но работе-то
> это не мешает
Судя по тому, что ты здесь, видимо, мешает.
PZ (2006-12-25 15:32:00) [18]> [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
Anatoly Podgoretsky (2006-12-25 15:18:00) [19]> alex_*** (25.12.2006 15:10:27) [27]
self тоже лишнее
alex_*** (2006-12-25 15:10:00) [20]Да, кстати обрати внимание на [23] - убери указание Form1 для методов и никогда так не делай. (замени на self, если так хочется класс указать)