Форум: "Начинающим";
Текущий архив: 2011.11.06;
Скачать: [xml.tar.bz2];
ВнизС чего бы возникает OnResize после OnShow Найти похожие ветки
← →
Германн © (2011-07-16 03:39) [0]при первом показе формы? И как от него грамотно избавиться?
Заказали мне тут кнопку "Применить". Для всех изменений при "конфигурировании" формы. Всё сделал. И изменение расположения основных элементов формы. И добавление/удаление кнопок на одном из элементов формы. И изменение размеров/местоположения кнопок. И изменение размеров основных элементов формы сплиттером.
А вот изменение размеров самой формы...
В событии OnShow делаю ту самую кнопку "Применить" недоступной. В событии OnResize делаю её доступной. Но проблема в том, что при первом показе формы после OnShow вызывается OnResize с какого-то перепугу. И как с этим бороться не знаю. Пока решил (вроде решил) эту проблему тем, что в OnShow не сразу делаю ту кнопку недоступной, а посылаю сей самой (форме) сообщение через PostMessage, в обработчике, которого та кнопка становится недоступной. Но как-то это коряво, имхо.
← →
MBo © (2011-07-16 11:25) [1]>при первом показе формы?
for life cycle:
http://www.chami.com/tips/delphi/021097D.html
← →
Германн © (2011-07-18 04:20) [2]
> MBo © (16.07.11 11:25) [1]
>
> >при первом показе формы?
> for life cycle:
Лаконично сказано, но всё равно непонятно. Непонятно зачем вызывается обработчик OnResize после отрисовки формы, если юзер ничего не менял?
Особенно интересно выглядит форматирование приведенного тобой, Борис, жизненного цикла формы. Почему-то там два события OnPaint и одно события OnResize сдвинуты вправо относительно "основных" событий формы.
Некий "псевдодизайнер" формы пишу впервые. Примеров под руками никаких нет. Потому и возникают вопросы.
← →
MBo © (2011-07-18 06:57) [3]>сдвинуты вправо относительно "основных" событий формы.
Потому что они вызываются не непосредственно, а из обработчиков других событий.
> Почему-то там два события OnPaint
Ну это логично - при показе и активации перерисовка нужна.
>и одно события OnResize
А реcайз где-то же отработать надо хоть раз - вот выбрали событие активации, видимо. Возможно, логика разработчиков была и другой, не знаю.
← →
MBo © (2011-07-18 07:53) [4]> вот выбрали событие активации, видимо.
Вру. При активации меняется состояние окна, срабатывает функция виндов ShowWindow - и она посылает WM_SIZE (причем не всегда, например, в зависимости от стиля - single, dialog)
← →
Германн © (2011-07-19 02:07) [5]
> MBo © (18.07.11 07:53) [4]
В общем дело ясное, что дело тёмное. :)
Попробую эту ситуацию обсудить с "заказчиками". Идеи уже есть.
← →
SQLEXPRESS (2011-07-19 09:38) [6]Эксперименты
*голосом а-ля Галилео*
procedure TForm1.DefaultHandler(var Message);
var
m: LongInt;
begin
inherited;
if b then
begin
m := Length(a);
SetLength(A, M + 1);
A[M] := TMessage(Message).Msg;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
mmo1.Lines.Add(" FormCreate ");
b := True;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
mmo1.Lines.Add(" FormPaint ");
if b then btn1.Click;
b := False;
end;
procedure TForm1.btn1Click(Sender: TObject);
var
i: Integer;
m: Integer;
begin
m := Length(A);
for i := 0 to m -1 do
mmo1.Lines.Add(IntToHex(A[i],4));
end;
сообщения приходят :
0018 WM_SHOWWINDOW = $0018;
0046 WM_WINDOWPOSCHANGING = $0046;
0046 WM_WINDOWPOSCHANGING = $0046;
001C WM_ACTIVATEAPP = $001C;
000D WM_GETTEXT = $000D;
0086 WM_NCACTIVATE = $0086;
0133 WM_CTLCOLOREDIT = $0133;
000D WM_GETTEXT = $000D;
0085 WM_NCPAINT = $0085;
0047 WM_WINDOWPOSCHANGED = $0047;
0005 WM_SIZE = $0005;
0133 WM_CTLCOLOREDIT = $0133;
0024 WM_GETMINMAXINFO = $0024;
0046 WM_WINDOWPOSCHANGING = $0046;
0133 WM_CTLCOLOREDIT = $0133;
0003 WM_MOVE = $0003;
0133 WM_CTLCOLOREDIT = $0133;
по ctrl+alt+с
и далее вверх, у меня получилось, что TControl размеры дергает
← →
SQLEXPRESS (2011-07-19 09:58) [7]последовательность такая
FormCreate
FormShow
FormActivate
FormCanResize
FormConstrainedResize
FormResize
FormPaint
в дальнейшем так
FormCanResize
FormConstrainedResize
FormResize
FormPaint
или, если просто начнем менять размер, но не будем, т.е. шелкнем по бордюру и все
FormCanResize
FormConstrainedResize
а если
procedure TForm1.FormCanResize(Sender: TObject; var NewWidth,
NewHeight: Integer; var Resize: Boolean);
begin
Resize := False;
end;
то
FormCanResize
или
FormCanResize
FormPaint
т.е.
FormConstrainedResize
FormResize
не вызываются.
← →
Anatoly Podgoretsky © (2011-07-19 10:28) [8]> SQLEXPRESS (19.07.2011 09:58:07) [7]
Значит используешь Constraines и якоря
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.11.06;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c