Форум: "Основная";
Текущий архив: 2004.07.18;
Скачать: [xml.tar.bz2];
ВнизКак определить что форма больше неизменяет свои размеры Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.035 c