![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
про Align, когда выключена видимость родителей [Delphi, Windows]
Galkov © (2006-12-15 23:48:00)Вот пример:
Program test;
uses windows,kol;
type TMainForm=object
Control,Check,Panel_1,Panel_2,Button_1,Button_2:PControl;
procedure _OnClick(Obj:PObj);
end;
function TMainForm._OnClick;
begin
Panel_1.Visible := Check.Checked;
end;
var MainForm:TMainForm;
begin
Applet := NewApplet('TestApp');
with MainForm do begin
Control := NewForm(Applet,'Test').SetSize(400,300);
//CheckBox
Check := NewCheckBox(Control,'Show').SetPosition(10,240);
Check.OnClick := MainForm._OnClick;
//Panel_1
Panel_1 := NewPanel(Control,esLowered).SetPosition(10,10).SetSize(370,180);
Panel_1.Visible := false;
//Panel_2
Panel_2 := NewPanel(Panel_1,esRaised).SetSize(364,100);
Panel_2.Align := caTop;
NewSplitterEx(Panel_1,0,0,esRaised);
//Button_1
Button_1 := NewButton(Panel_2,'Button_1').SetSize(100,100);
Button_1.Align := caLeft;
NewSplitterEx(Panel_2,0,0,esRaised);
//Button_2
Button_2 := NewButton(Panel_2,'Button_1').SetSize(100,100);
Button_2.Align := caClient;
end;
Run(Applet);
end.
Размышляя над ним возникают вопросы:
1) Какие у нас гарантии, что здесь
procedure AlignChildrenProc( Sender: PObj );
type
TAligns = set of TControlAlign;
var P: PControl;
CR: TRect;
procedure DoAlign( Allowed: TAligns );
...........
if ChgPos or ChgSiz then
begin
C.BoundsRect := R;
if ChgSiz then
AlignChildrenProc( C );
end;
...........
НЕТ необходимости вызывать AlignChildrenProc, если не менялся размер контролла. Вроде бы совершенно не факт, что Ailgn там УЖЕ произведен. Видимость родителей, в момент предыдущих вызовов AlignChildrenProc, вполне могла быть выключена. Как в вышестоящем примере.
2) И чего делать, если возникает необходимость поменять некоторые размеры, в момент невидимости кого-то из родителей ???
(2007-07-25 18:15:00) [1]Удалено модератором
(2007-06-21 23:59:00) [2]Удалено модератором
Galkov (2007-03-12 19:50:00) [3]
> Вот эссе можно и не надо
Поздно. Я еще вчера намылил. Так что придется читать :))
> А раз изменений опять много, то пока оставим вариант как
> неосновной.
Не вопрос. Лишь бы ПРАВИЛЬНО в конечном результате было.
Хотя фраза: "а мы не тестируем, потому-что еще в дистрибутив не попало" - наверное не только на нашем сайте встречается :))
Vladimir Kladov (2007-03-12 15:24:00) [4]Вот эссе можно и не надо. Я посмотрю, солью, и выложу. А раз изменений опять много, то пока оставим вариант как неосновной.
Galkov (2007-03-12 09:40:00) [5]
> Далее предложение: а давайте заапдейтим NEW_ALIGN
> Осталось только выяснить по какой схеме...
Владимир, намылил Вам NewAlign2from254.upd в варианте полной замены внутри условных компиляций NEW_ALIGN для рассмотрения
+ небольшое философское "эссе" про все это (align) дело
Galkov (2007-03-05 17:42:00) [6]Вот значит, какая история приключилась....
Один наш коллега ("наш" - это в hiasm, в проекте fasm, не имеющем отношение к KOL, "коллега" - ака tsdima) сотворил технологию Align в своем проекте.
А я возьми, и подсунь ему пример для тестирования пример, предоставленный MTsv DN, выполненный в нашем "схемном" исполнении.
И он, подумавши, говорит: "Да вот, работает на ура, только вот я WM_SIZE привязываю с самого контрола, а не с парента..."
И все так красиво у него получалось (если не с парента): ф-ия AlignChildrenProc не являлась рекурсивной, а рекурсии осуществлялись через WM_SIZE, и выполнялись они ровно столько раз сколько надо...
А проблема решилась введением одного флага в контрол - признака, что над этим контролом УЖЕ производится Aligning (так он этот флаг и назвал, кстати). И теперь, если AlignChildrenProc увидел, что флаг оказался в нуле, то это означает, что по нашему контролу прошелся "железным катком выравнивания" рекурсивный вызов его же самого (а произойти может такое ТОЛЬКО при onResize-ах, отмеченных MTsv DN, потому что WM_SIZE не работает с парента, а с себя самого), и следует тут же ПРЕКРАТИТЬ дальнейшие действия по aligning-у, ибо все уже сделано, и правильно.
Настолько все это было правильно и минимально, что мы зарешали не ломать эту стройную картину, а завести в именно контроле ЕЩЕ один флаг, который предписывает AlignChildrenProc не в коем случае не начинать работу с парента. И этот флаг взводится только при изменении размера контрола из AlignChildrenProc.
К чему вся эта поучительная история
К тому, что у меня есть вариант KOL-а, работающий по этой схеме.
Т.е., пример, любезно предоставленный коллегой MTsv DN, работает абсолютно корректно.
Еще более конкретно, тестировал на таком примере:
Program test;
uses windows,kol;
type TMainForm=object
Control,Check,Panel,B1,B2,B3:PControl;
procedure _OnClick(Obj:PObj);
procedure _OnResize(Obj:PObj);
end;
procedure TMainForm._OnClick;
begin
Panel.Height := 50*byte(Check.Checked)+50;
end;
procedure TMainForm._OnResize;
begin
B1.Width := B2.Height;
B2.Width := B2.Height;
B3.Width := B2.Height;
end;
var MainForm:TMainForm;
begin
Applet := NewApplet('Test');
with MainForm do begin
Control := NewForm(Applet,'TestApp').SetSize(400,300);
Check := NewCheckBox(Control,'Show').SetPosition(10,240);
Check.OnClick := MainForm._OnClick;
Panel := NewPanel(Control,esRaised).SetSize(400,100);
B1 := NewButton(Panel,'1').SetSize(50,50);
B1.Align := caLeft;
B2 := NewButton(Panel,'2').SetSize(50,50);
B2.Align := caLeft;
B2.OnResize := MainForm._OnResize;
B3 := NewButton(Panel,'3').SetSize(50,50);
B3.Align := caLeft;
end;
Run(Applet);
end.
Далее предложение: а давайте заапдейтим NEW_ALIGN
Осталось только выяснить по какой схеме...
Galkov (2007-01-04 02:38:00) [7]
> Vladimir Kladov (01.01.07 20:38) [35]
> Нет, не в MCK. Просто мне удобнее в нем проект сделать.
> Схема та же, если без MCK. Что должно быть на форме, я указал
Не получается у меня усмотреть разницу между в результатах при изменении OLD/NEW :(
Как ни крутил ToolBar с TabControl-ом...
Владимир, намыльте мне, пожалуйста, таковой проект. Как показывает пример коллеги MTsv DN, разобраться в нем значительно быстрее, чем овладение высоким искусством MCK-техники :)
НО, методом "зоркого присматривания" - одну неточность обнаружил таки.
function TControl.TC_Insert(Idx: Integer; const TabText: KOLString; TabImgIdx: Integer): PControl;
var TI: TTCItem;
begin
Result := NewPanel( @Self, esNone );
Result.FAlign := caClient; // здесь буковка 'F' явно лишняя!!!
.....
Как раз в простых примерах, где про align и не слышали - он и не пристегнется.
А это уже будет криминал. И как раз при NEW, при OLD - сработает "эмуляция" в аттаче WndProcTabControl.
> MTsv DN © (02.01.07 18:05) [37]
> 2 Galkov ©
> Посмотрите, проект...коль уж Вы начали Align переделывать...
> http://www.uus4u.com/download/other/bug_align.rar
> Правда там MCK используется, но не думаю, что это будет проблемой...
Ага, посмотрел.
Действительно проблема. Если обобщать, то совсем не простая...
А обобщить - хочется.
Выглядит как разрешение произвольных рекурсивных запросов.
По какой-то причине происходит resize, который вызывает некое дерево align-ов
Те в свою очередь вызывают resize-ы, которые опять вызовут align-ы, и т.д..
До моих правок все так и происходило (осознание этого замечательного факта у меня выразилось фразой: чем дальше в лес, тем толще партизаны...)
У себя я просто нахально заблокировал рекурсии - если это только Align, то они и не нужны, вроде. А про event-ы я и позабыл...
Вы напомнили....
Но все равно очень не хочется их разрешать... В происходящем после этого черт ногу сломает. Как подтверждение: вот при OLD они разрешены, а все равно не работает правильно (мне именно так показалось)
Из несомненных выводов пока только один: думать надо:))
А из подлежащих обсуждению: нужен "отложенный" вызов метода...
Что-то похожее на технику TThread.Synchronize, только через PostMessage...
Ну, типа такого:
PostMessage( aParent.handle, CM_EXECPROC_ex, integer(Method.code), integer(Method.data) );
С очевидной реакцией в обработчике.
В других местах от такого тоже польза могла бы быть....
Собственно, сегодня у меня при задачах типа "уничтожить самого себя" приходится "одноразовый" таймер использовать...
MTsv DN (2007-01-02 18:05:00) [8]2 Galkov ©
Посмотрите, проект...коль уж Вы начали Align переделывать...
http://www.uus4u.com/download/other/bug_align.rar
Правда там MCK используется, но не думаю, что это будет проблемой...
Galkov (2007-01-01 20:55:00) [9]Ok, или будем что-то делать, или будем что-то решать :))
Из этого логически следует, что мне рациональней повозиться с ToolBar на "чистом" KOL :)
Vladimir Kladov (2007-01-01 20:38:00) [10]Нет, не в MCK. Просто мне удобнее в нем проект сделать. Схема та же, если без MCK. Что должно быть на форме, я указал.
Galkov (2007-01-01 17:05:00) [11]
> Vladimir Kladov (01.01.07 15:03) [32]
> Значит так. В версии 2.50 с включенной опцией NEW_ALIGN:
> 1. Создаем проект MCK. Бросаем TabControl, и не выравниваем. Выставляем Count, например, 4.
> 2. Бросаем Toolbar, кнопки можно делать или не делать - без разницы.
> 3. Запускаем и разводим руками.
Прошу прощения за серость - с MCK не работал :(
И поэтому пока не понял:
1) Проблема в TabControl (пока не знаю как воспроизвести баг - мои тесты работали без вопросов) ???
2) Проблема в ToolBar (этого пока не тестировал) ???
3) Проблема в MCK ???
Vladimir Kladov (2007-01-01 15:05:00) [12]Да, и еще: опциональные параметры не поддерживаются в Delphi 2, 3 и (кажется) 4. Т.к. KOL обязательно поддерживает эти старые версии компилятора, просьба таких фишек не использовать и впредь.
Vladimir Kladov (2007-01-01 15:03:00) [13]Значит так. В версии 2.50 с включенной опцией NEW_ALIGN:
1. Создаем проект MCK. Бросаем TabControl, и не выравниваем. Выставляем Count, например, 4.
2. Бросаем Toolbar, кнопки можно делать или не делать - без разницы.
3. Запускаем и разводим руками.
4. Выключаем NEW_ALIGN, билдим, запускаем: все в порядке.
Выод: рано еще делать NEW_ALIGN в качестве основного.
Galkov (2006-12-26 12:33:00) [14]Вот еще, позабыл совсем..... :(
После внедрения "штатного Align" в TabControl одна строка оказалась излишней:
//[function TControl.TC_Insert]
function TControl.TC_Insert(Idx: Integer; const TabText: String;
TabImgIdx: Integer): PControl;
var TI: TTCItem;
begin
Result := NewPanel( @Self, esNone );
Result.FAlign := caClient;
{Result.fNotUseAlign := True;
Result.fVisibleWoParent := TRUE;}
Result.Visible := Count = 0;
TI.mask := TCIF_TEXT or TCIF_IMAGE or TCIF_PARAM;
TI.iImage := TabImgIdx;
TI.pszText := PChar( TabText );
TI.lParam := Integer( Result );
Perform( TCM_INSERTITEM, Idx, Integer( @TI ) );
//Result.BoundsRect := TC_DisplayRect; // Теперь это лишнее !!!
Perform(WM_SIZE,0,0); //May be changes of margins for TabControl
end;
Владимир, "обложите" ее пожалуйста
btw: а таки "штатный Align" в TabControl - это не так плохо :)
можно в пример из [17] добавить ДО, или ПОСЛЕ цикла такое:
with NewLabel(Tabs,'Привет участникам автопробега !!!').SetSize(100,20)^ do begin
TextAlign := taCenter;
Align := caBottom;
Ctl3D := true;
end;
И этот "StatusBar" будет прекрасно работать :)
ANTPro (2006-12-25 23:14:00) [15]> [29] Galkov © (25.12.06 22:24)
Блин, а ведь точно... Я только на это глянул...
33:
//[VERSION]
****************************************************************
* VERSION 2.4 8
****************************************************************
//[END OF VERSION]
После диффа все прояснилось :) Не изменилась лишь цифра 8 на 9
Galkov (2006-12-25 22:24:00) [16]Весело, конечно :))
Особенно, если вспомнить что другое место для "учтенного экземпляра" сегодня не работает.
А вот какой тогда версии KOL в ревизии 32, которая декларирована, как 2.48 ???
Черепаха очень не нулевые изменения между этими двумя ревизиями показывает :)))
ANTPro (2006-12-25 20:34:00) [17]> [27] Galkov © (25.12.06 17:20)
KOL там от версии 2.48
Galkov (2006-12-25 17:20:00) [18]Про 33-ю написано (надо полагать коллегой gandalf), что именно она и есть 2.49, обновлена 19.12.06
В комментах:
> -=[2.49] Новости от 17 декабря 2006 г. (KOL & MCK v2.49)
>
> [-] ASM Исправлен метод TObj.Final (asm-версия). По крайней
> мере могла
> происходить утечка памяти.
ну и т.д..
Vladimir Kladov (2006-12-25 17:00:00) [19]У меня нет svn. Не настраивал я его. Есть версия 2.49, от нее и пляшем. KOL и KOL_Asm обновились. Буду сливать.
Galkov (2006-12-25 14:37:00) [20]Владимир, намылил upd на 33-ю ревизию c SVN.
Есть контакт ??? :)