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

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

про Align, когда выключена видимость родителей [Delphi, Windows]


Страницы:   1 2 3

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.
Есть контакт ??? :)


Страницы:   1 2 3

Наверх

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