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

Вниз

Как определить что форма больше неизменяет свои размеры   Найти похожие ветки 

 
leonidus   (2004-07-03 22:28) [0]

Проблема в следующем: у меня на форме есть контролы которые не умеют сами масштабироваться вместе с формой, поэтому я вынужден сам расчитывать их размеры. Блок пересчета размеров висит на обработчике OnResize данной формы, но это событие при изменении размера формы срабатывает очень часто, в результате чего контролы начинают мигать от частой прорисовки. Как этого избежать, т.е. надо понять что форма уже больше изменять размер не будет и только тогда отрисовать новый размер контрола?


 
YurikGL ©   (2004-07-03 22:35) [1]

А не проще запретить resize ?


 
Vemer ©   (2004-07-03 22:38) [2]

Поставь у формы BorderStyle := Single, только не забудь проверять ширину экрана на старте..


 
jack128 ©   (2004-07-03 22:41) [3]


> Блок пересчета размеров висит на обработчике OnResize данной
> формы, но это событие при изменении размера формы срабатывает
> очень часто
ты уверен? у меня (d5, win2k) это событие срабатывает именно при ОКОНЧАНИИ изменения размероов формы..


 
leonidus   (2004-07-03 23:08) [4]

>jack128 у меня Delphi 6 WindowsXP, но в любом случае это значения не имеет, вот код который я поставил на OnResize:

k:=label2.tag;
inc(k);
label2.tag:=k;
label2.Caption:=inttostr(k);

Стоит потянуть за границу формы, значение label2.Caption бежит как сумашедший....

А как запретить resize, в смысле самому окну запретить изменять размер? BorderStyle := Single тоже не подходит форма ДОЛЖНА умень изменять свои размеры


 
YurikGL ©   (2004-07-03 23:10) [5]


> leonidus   (03.07.04 23:08) [4]

Когда это надо - выставляй BorderStyle := Single, когда надо -  Sizeable


 
jack128 ©   (2004-07-03 23:22) [6]


> значение label2.Caption бежит как сумашедший....
? У мя увеличивается только на единицу..
посмотри где в D6 вызыватся метод Resize? В D5 в методе TWinControl.WmSize()
Вот что про это сообщение в WinSDK пишут:
The WM_SIZE message is sent to a window after its size has changed.


 
YurikGL ©   (2004-07-03 23:31) [7]


> jack128 ©   (03.07.04 23:22) [6]

procedure TForm1.FormResize(Sender: TObject);
begin
Edit1.Text:=IntToStr(Form1.Width);
end;

Приведенный код действительно срабатывает не после изменения размера формы а постоянно...

Автору можно посоветовать обрабатывать события OnMouseDown(зафиксировали размеры формы) и OnMouseUp (посмотрели если размеры изменились, то выполнили действия)


 
YurikGL ©   (2004-07-03 23:33) [8]

flag:boolean
Или вариант в OnMouseDown выставлять флаг в flag:=false в FormResize выставлять его в Flag:=True а потом в OnMouseUp смотреть
if flag then форма изменила размер...

З.Ы. D7 WinXP


 
leonidus   (2004-07-04 00:09) [9]

>YurikGL спасибо, попробую, просто хотелось что-то поизяшнее флагов:)


 
jack128 ©   (2004-07-04 02:11) [10]


> leonidus   (04.07.04 00:09
попробуй таки напрямую отлавливать WM_SIZE..


 
Григорьев Антон ©   (2004-07-04 07:00) [11]


> jack128 ©   (03.07.04 22:41) [3]
>
> > Блок пересчета размеров висит на обработчике OnResize
> данной
> > формы, но это событие при изменении размера формы срабатывает
>
> > очень часто
> ты уверен? у меня (d5, win2k) это событие срабатывает именно
> при ОКОНЧАНИИ изменения размероов формы..


Это где-то в Панели управления настраивается как будет вести себя форма при изменении размера - всё время перерисовываться или сначала дождётся заершения изменения размеров и только потом перерисуется.


 
Mim1 ©   (2004-07-04 09:27) [12]

Как не странно опция эта называется "отображать содержимое окна при перетаскивании". При ее вклюсении изменение размера будет происходить не при помощи пустой рамки (что имхо значительно изящьнее) а с миганием как у автора вопроса.
Думается что обрабатывать сообщение WM_EXITSIZEMOVE в этой ситуации самое оно.


 
DVM ©   (2004-07-04 09:27) [13]

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


 
leonidus   (2004-07-04 11:08) [14]

Проблема в том, что если я перехватываю WM_SIZE, то я так понял ОС возлагает на меня все обязанности по масштабированию ВСЕХ контролов на данной форме, а мне это совершенно не надо, на форме только 2 контрола из 30 нуждаются в принудительном масштабировании, остальные и сами справляются.


 
jack128 ©   (2004-07-04 12:00) [15]


> меня все обязанности по масштабированию ВСЕХ контролов на
> данной форме
c чего это? inherited вызываешь?


 
KSergey ©   (2004-07-04 12:13) [16]

> [14] leonidus   (04.07.04 11:08)
> Проблема в том, что если я перехватываю WM_SIZE, то я так
> понял ОС возлагает на меня все обязанности по масштабированию
> ВСЕХ контролов на данной форме,

Все будет путем, если не забыть вызвать inherited

Думаю, что прав [11] Григорьев Антон ©   (04.07.04 07:00)
Если у пользователя слабая тачка - нефиг этот крыж выставлять, моргать не будет. Если хорошая - пусть мирится с морганием
Хотя в дельфи немного еще из-за своих наворотов (в VCL) доп. моргания могут быть при изменении размеров контролов, увы... (оповещаются родители, примерно так)
Но думаю все же, что пользователь тут сам себе враг, раз поставил сей крыж.



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

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

Наверх




Память: 0.51 MB
Время: 0.048 c
8-1083349209
GlavBOTan
2004-04-30 22:20
2004.07.18
Wave-header


3-1087907119
Termy
2004-06-22 16:25
2004.07.18
Как закинуть картинку на сервер приложений?


14-1088597348
panov
2004-06-30 16:09
2004.07.18
Еще одного спамера подцепил на дозвон.


6-1085044499
OlegM
2004-05-20 13:14
2004.07.18
Почему не запускается TClientSocket


14-1088671960
Vlad Oshin
2004-07-01 12:52
2004.07.18
У кого нить осталась ветка, где мы стихи писали на паскале?