Форум: "Начинающим";
Текущий архив: 2007.01.14;
Скачать: [xml.tar.bz2];
ВнизКак закрыть модальное окно? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.012 c