Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];

Вниз

Проблемы с ресайзингом формы   Найти похожие ветки 

 
NailMan   (2003-10-24 11:06) [0]

Вобщем необходимо при ресайзинге формы после некоторых операций корректировать высоту формы. Это необходимо не всегда, а при определенных условиях. Возникают сабжи в виде каких-то диких глюков моргания и жуткой какофонии. К тому же форма ресайзится неправильно.

Условия следующие: высота формы корректируется в случае когда высота видеоокна(DirectShow) больше высоты TPanel в которой это видеоокно расположено и включено сохнанение пропорций сторон.
Соответсвенно если юзверь увеличивает ширину формы/видеоокна должна увеличиваться и высота, но если высота видеоокна вылезла за пределы надо увеличивать высоту формы, дабы видеоокно не рисовало поверх контрольной панели.


Реализовывал через TForm.OnResize - моргает всегда.
Реализовывал через процедуру:
procedure WMWindowPosChanging(var MSG: TWMWindowPosChanging); message WM_WINDOWPOSCHANGING;
в которой отслеживал изменения размеров формы - моргает только когда производится коррекция высоты(в этом обработчике).

Вобщем я думаю это происходит из-за рекурсивного выполения обработчика, тоесть:

- юзверь изменил ширину(коррекция требуется)
- в обработчике выполняется вычисления скорректированной высоты и выполняется присваивание Height формы нового значения
- так как изменился размер формы, то обработчик получил соответствующее сообщение WM_WINDOWPOSCHANGING и все по новой
в этой ситуации все то что происходит после присваивания Heigth идет лесом, так как прога уже по новой ушла в обработчик и соответсвенно в процедуру коррекции.
Прав я или не прав?

Можно ли как-нить обойти рекурсивный вызов обработчика. Типа присвоить новые размеры форме без посылания сообщения
WM_WINDOWPOSCHANGING, WM_SIZE etc.?

Может сделать типа отложенное присвоение высоте? Зарегистрировать свое сообшение и послать его форме со начением высоты, и обработчик этого сообщения присвоит высоту только после того как обработчик ресайзинга завешит работу(скажем присвоит некий флаг = true)? Прокатит такая идея?

Вобщем прошу совета.


 
NailMan   (2003-10-24 11:11) [1]

Да забыл сказать, что все doublebuferred включены и на форме и на панелях. сами элементы меню не мерцают, а какофония распространяется на форму, панели и прочие элементы(TImage). Такое впечатление что несколько слоев формы с разными размерами рисуются друг на друга.


 
Sandman25   (2003-10-24 11:14) [2]

Попробуйте использовать флаг. В процедуре обработчика

if not Flag then
begin
Flag := True;
// изменение
...
Flag := False;
end;
Тогда рекурсии не будет.


 
Семен Сорокин   (2003-10-24 11:34) [3]

можно так:

form1.OnResize := nil;
try
// твои изменения высоты
finally
form1.Onresize := Form1Resize;
end;


 
NailMan   (2003-10-24 12:21) [4]

Sandman25 ©
Пробовал и так, но он же все равно улетает:

в обработчике(onresize или WMWindowPosChanging)
if (not lockonresize) and (<условия изменения размеров>) then
resizeWindow(Not_New);//это вызов процедуры коррекции.

Он после изменения height все авно же ведть провалится в обработчик и потеряет дальнейшие дествия после height:=

Семен Сорокин ©
Это надо в самом обработчике OnResize писать? Хм. Интересно. Надо и так попробовать.


 
wicked   (2003-10-24 12:47) [5]

а обработать WM_SIZING?...


 
REA   (2003-10-24 12:55) [6]

Может так?

OnConstrainedResize event (TControl)
Adjust resize constraints.

Description

Use OnConstrainedResize to adjust a control’s constraints when an attempt is made to resize it. Upon entry to the OnConstrainedResize event handler, the parameters of the event handler are set to the corresponding properties of the control’s Constraints object. The event handler can adjust those values before they are applied to the new height and width that is being applied to the control. (The CanAutoSize method or an OnCanResize event handler may already have adjusted this new height and width).

On exit from the OnConstrainedResize event handler, the constraints are applied to the attempted new height and width. Once the constraints are applied, the control’s height and width are changed. After the control’s height and width change, an OnResize event occurs to allow any final adjustments or responses.

Note The OnConstrainedResize handler is called immediately after the OnCanResize handler.



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

Форум: "Основная";
Текущий архив: 2003.11.03;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.01 c
14-8627
Skier
2003-10-15 10:16
2003.11.03
Cловарь английский акронимов.


4-8717
Evgeniy
2003-08-29 14:37
2003.11.03
Передвижение формы по экрану


3-8295
Александр Иванов
2003-10-12 10:41
2003.11.03
Глюк MSSQL или моя ошибка?


1-8538
adif
2003-10-23 11:54
2003.11.03
Как создать залипающую (западающую) кнопку?


1-8454
Мунька
2003-10-21 18:23
2003.11.03
TExcelApplication





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский