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

Вниз

С чего бы возникает 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.007 c
2-1311017214
R_R
2011-07-18 23:26
2011.11.06
Где находится VK_ENTER?


15-1309965191
plr
2011-07-06 19:13
2011.11.06
Приложение по работе с устройством по RS232 теряет байты


3-1265443339
lock95
2010-02-06 11:02
2011.11.06
SQL запрос ADODataSet.CommandText


15-1309939617
Nikita_novice
2011-07-06 12:06
2011.11.06
Странности IDE Delphi 7


2-1310812078
lesstab
2011-07-16 14:27
2011.11.06
TQuery - ORDER BY