Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

"сгладить" Resize [D5]


i-am-vladko ©   (2006-12-07 17:20:00) 

Доброго здоровья.
Есть форма с множеством компонентов на ней (где-то 400), с некими. Функция по событию FormResize имеет довольно сложный вид : компоненты переносятся на разные TabSheet`s, меняют размеры, Align и т.д. При этом получается эффект "мигания" этих самых компонентов. Как можно сгладить/убрать этот ненужный эффект? Спасибо за ответы


i-am-vladko   (2006-12-14 17:37:00) [1]


> ors_archangel ©   (10.12.06 11:34) [9]

Огромное спасибо за помощь, Руслан!


GrayFace   (2006-12-11 10:52:00) [2]

У меня тоже есть такая проблема, когда компоненты лежат на TTabSheet.


ors_archangel   (2006-12-10 11:34:00) [3]

В VCL реализован удобный механизм Anchors+Align (кстати, почему у Edit нет Align'а?), но перерисовка даже и с малым # компонентов (<<400), мне кажется, давольно дёрганая (Celeron2GHz + 256 MB video Intel845GL Extreme), что ли просто каждый контрол по несколько раз ресайзится даже(??)… а нет, они просто пересоздаются :)  впечатление - такое!.. Вобщем, дело не в cpf (components per form), а в принципе - они ж оченьмедленно ресайзятся, наверно, нужно как-то сразу всё "понять" и один раз изменить все размеры, а в VCL, как зреют мои очи, всё сделано итеративно, от parentов к childreнам(иль я не прав, киньте ж камень!!!)…
Вот код уменьшает "эффект", но это не решение проблемы, а просто отмазка с помощью таймера:


var
 doresize: boolean = true; // resize in next WM_SIZE request
 resizeMsg: TWMSize; // save WM_SIZE message
 tmr: int; // timer handle (WinAPI)

{ Delayed callback for WM_SIZE messages processing }
procedure DelayedResize(wnd,msg,id,time: dword); stdcall;
begin
 doresize := true; // do it!
 KillTimer(0, tmr); // kill self
 tmr := 0; // and zero handle
 MainForm.WmSize(resizeMsg); // resize
end;

procedure TMainForm.WmSize(var msg: TWMSize);
begin
 if doresize then begin
   doresize := false;
   inherited; // actual work
 end else begin
   resizeMsg := msg; // save for future
   if tmr = 0 then tmr := SetTimer(0, 1, 66, @DelayedResize); // set up delayed callback to be launched after time interval (66 ms used)
 end;
end;


lookin   (2006-12-10 00:19:00) [4]

> [0] i-am-vladko ©   (07.12.06 17:20)


А почему на Resize? Что такое должно быть в форме, чтобы на Resize ПЕРЕНОСИТЬ компоненты на разные Tabsheet?


Jeer   (2006-12-07 18:06:00) [5]


> i-am-vladko ©   (07.12.06 17:59) [6]


Да не за что - что сделал, то и получил.
Вот тут и выяснится, что работаешь на i386 + 1Mb video Trident


i-am-vladko   (2006-12-07 17:59:00) [6]

да... пасибки, Jeer...


Jeer   (2006-12-07 17:51:00) [7]

Ну, кнопку я мониторе я показывать не буду - сам найдешь.


i-am-vladko   (2006-12-07 17:48:00) [8]


> Resize сделаешь утром - вечером увидишь результат

не хочу промежуточные результаты видеть )


i-am-vladko   (2006-12-07 17:48:00) [9]


> Resize сделаешь утром - вечером увидишь результат

не хочу промежуточные результаты видеть )


Jeer   (2006-12-07 17:43:00) [10]


> i-am-vladko ©   (07.12.06 17:20)
> Есть форма с множеством компонентов на ней (где-то 400)


А чего так мало-то ?
Ты уж грузи по полной - где-то на уровне десятков тысяч, тогда Resize сделаешь утром - вечером увидишь результат.


i-am-vladko   (2006-12-07 17:22:00) [11]


> Есть форма с множеством компонентов на ней (где-то 400),
>  с некими

сорри - не дописал )) но я думаю, смысл ясен


Наверх

Титульная страница Поиск, карта сайта Написать письмо