![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
"сгладить" 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),
> с некими
сорри - не дописал )) но я думаю, смысл ясен