Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.05.12;
Скачать: CL | DM;

Вниз

ToolBar+TrackBar=AccessViolation   Найти похожие ветки 

 
QAZ   (2009-06-22 13:56) [0]

если положить TrackBar на ToolBar то при наведении мыши вылетает нафиг все :(


 
Vladimir Kladov ©   (2009-06-22 21:52) [1]

Ну и не лодите его на тулбар. Можно панелями без бордюров отрегулировать так, что будет казаться, что он на нем лежит. А можно использовать KOLTracker.


 
Dy1   (2009-06-23 01:04) [2]


> А можно использовать KOLTracker

где взять? На kolmck.net пишет не найден


 
Galkov   (2009-06-23 14:03) [3]

Владимир, вообще-то это плохо, что CommnonControl не может наследовать такого же.

Неужели отсутствие простенького условия проверки "на самого себя" настолько уж экономит код, что надо создавать реальные виндячие окна.

По-моему, всему есть пределы разумного.


 
Vladimir Kladov ©   (2009-06-23 15:53) [4]

Galkov

Вообще ничего не понял. Какой проверки на себя, какое наследование?


 
Vladimir Kladov ©   (2009-06-23 15:57) [5]

Dy1

KolTracker на сайте переименовал, теперь должен браться.


 
Galkov   (2009-06-24 13:44) [6]


> Вообще ничего не понял

Вот те раз :shock:
Мне казалось что все давно все знают, но есть какие-то очень давние "философские причины" против эдакого фикса....

function WndProcNotify( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
var NMhdr: PNMHdr;
   Child: PControl;
begin
 Result := False;
 ..............
   // вот оно - дерево
   if (Child <> nil)and(Child<>Self_) then // а вот - мужик в пиджаке
   begin
     Msg.hwnd := Child.fHandle;
     Result := EnumDynHandlers( Child, Msg, Rslt );
   end;
 end;
end;


У того самого Child-а тоже может сидеть в аттачах WndProcNotify (что как раз и фиксится промежуточной панелью), который найдет теперь уже сам себя.
Ну и будет этим заниматься по исчерпании стека.


 
Vladimir Kladov ©   (2009-06-24 16:18) [7]

Нет, этого фикса я не помню. А с чего это вдруг, это документировано в MSDN, что какие-то нотификации WM_NOTIFY для тулбара приходят не к его родителю, а к нему самому? Или это оно только в KOL так бывает?


 
Galkov   (2009-06-24 18:45) [8]

А вот тут я уже ничего не понял в вопросе :)

Мне казалось, что все, всегда, везде, и всю жизнь - к родителю.
И это, вроде бы, никак вышеизложенному коду не противоречит.

Обнаружил это безобразие я еще когда "подрихтовывал" TabControl под NEW_ALIGN
Внедрил TControl.TC_InsertControl, и получил возможность влепить в качестве странички - тот же TabControl напрямую,  "мимо промежуточной панели".
Да и возможность прилепить к нему ToolBar с Align=caBottom - тоже стала осмысленной (правильный align) именно в тот момент.

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


 
Galkov   (2009-06-24 19:29) [9]

Не знаю... На всякий случай, может быть так:

> У того самого Child-а тоже может сидеть в аттачах WndProcNotify

Не, вовсе не потому, что он создан через _NewCommonControl !!!
А потому что какой-то Child этого нашего Child-а ТОЖЕ создан через _NewCommonControl

Ну или, если ссылаться на старт-топера:
1) аттач WndProcNotify сидит на главной форме, и положил его туда конструктор ToolBar-а
2) А Child-ом и является этот самый ToolBar
3) Но среди аттачей ToolBar-а тоже есть WndProcNotify, потому что положил его туда уже конструктор TrackBar-а.
4) Ну вот TrackBar и есть тот самый Child для Child-а того WndProcNotify, который приаттачен к форме.


 
Galkov   (2009-06-25 15:39) [10]

В общем, пока суд да дело, я сделал ASM-версию этого фикса, и теперь знаю точную цену вопроса.
Она - 6 байт кода. С учетом выравнивания - 4 байта. Короче - не получилось :(

function WndProcNotify( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
asm
       CMP      word ptr [EDX].TMsg.message, WM_NOTIFY
       JNE      @@ret_false
       PUSHAD
       MOV      ECX, [EDX].TMsg.lParam
       {$IFDEF USE_PROP}
       PUSH     offset[ID_SELF]
       PUSH     [ECX].TNMHdr.hwndFrom
       CALL     GetProp
       {$ELSE}
       PUSH     GWL_USERDATA
       PUSH     [ECX].TNMHdr.hwndFrom
       CALL     GetWindowLong
       {$ENDIF}
       SUB      EAX,[ESP+28]     // saved EAX=Self_
       JZ       @@ret_false_ECX  // Child=Self_ ???
       ADD      [ESP+28],EAX
       JZ       @@ret_false_ECX  // Child=nil ???
       POPAD
       PUSH     [EAX].TControl.fHandle
       POP      [EDX].TMsg.hwnd
       JMP      TControl.EnumDynHandlers
@@ret_false_ECX:
       POPAD
@@ret_false:
       XOR      EAX, EAX
end;


Тестировал на примере коллеги из соседнего топика: http://delphimaster.net/view/11-1243251080/,
приклеивши к нему по-быстрому пару "убийственных" срок:

PBar       := NewProgressBar(TabControl).SetSize(160, 20);
PBar.Align := caBottom;


В общем, Владимир, теперь это уже получается законченное предложение, наверное.


 
Vladimir Kladov ©   (2009-06-25 21:05) [11]

Разве ж я возражаю по поводу размера? Просто надо было мне понять, что происходит. Получается, такая же штука случалась при попытке положить любой коммон контрол на любой другой коммон контрол в качестве дочернего. Просто ни разу не приключалось такого, чтобы мне такое удочерение пригодилось.

Фикс на Паскале работает хорошо.

Galkov
А это что?
...

      SUB      EAX,[ESP+28]     // saved EAX=Self_
      JZ       @@ret_false_ECX  // Child=Self_ ???
      ADD      [ESP+28],EAX


Если Child <> Self_ то в EAX какое-то число <> 0 (равное EAX-Self_),
далее это число добавляется зачем-то к Self_ ... что будет-то?
Может, вторая команда сравнения должна быть
ADD EAX, [ESP+28] ?


 
Galkov   (2009-06-25 21:35) [12]


> А это что?

А это все нормально, по-моему: в EAX было не какое-то число, а Child. И стало после SUB соответственно: Child-Self_
Прибавление (ADD) должно давать результат не в EAX, а именно в [ESP+28] нужный нам Child: (Child-Self_)+Self_=Child
Потому-что последующий POPAD именно его в EAX и поместит (и очень нужные нам EDX, ECX - тоже).
И одновременно и признак ZF показывает чего надо - равенство нулю Child-а

Да не, все тут нормально вроде.


 
QAZ   (2009-06-26 10:53) [13]

ура ! Galkov респект
хоть ктото задумывается о том как должно быть, а не то что "подсунь панель" и все нормал .тем более что в VCL и диалогах таких прогонов нет

кстати а как там таб контрол без панели сделать ?


 
Galkov   (2009-06-26 13:52) [14]


> кстати а как там таб контрол без панели сделать ?


program TabTest;
uses KOL;
var TabControl: PControl;
begin
 Applet     := NewForm(nil,"My Super-Puper-Test-Editor").SetSize(320,240);
 TabControl := NewTabEmpty(Applet,[],nil).SetAlign(caClient);
 TabControl.TC_InsertControl(0,"Page 0",0,NewEditbox(TabControl,[eoMultiline]).SetAlign(caClient));
 TabControl.TC_InsertControl(1,"Page 1",0,NewEditbox(TabControl,[eoMultiline]).SetAlign(caClient));
 Run(Applet);
end.


 
Vladimir Kladov ©   (2009-06-26 16:33) [15]

ОК, поправку понял. Надо было первоначальный и паскалевский исходник глядеть.

QAZ
Панель -очень неплохой вариант. Когда вы обнаружите проблемы с выравниванием на тулбаре. Решение этой проблемы не то что с 6, а то и с 600 байтами может не получится, так не проще ли сделать панельку.


 
QAZ   (2009-06-27 18:34) [16]

да панель у меня уже 2 года используеца
просто если есть ошибка, почемуб ее не исправить а не игнорировать (страно что тракбар вообще не в составе кол)
иначе она ещо гденить проявица,и хватит уже байты считать - компактная глюкавость хуже чем сотня лишних байтов


 
Vladimir Kladov ©   (2009-06-27 22:26) [17]

Не в составе, потому что редко нужен. А когда нужен, оказывается, что лучше без него.



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

Текущий архив: 2013.05.12;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.006 c
15-1357763402
Юрий
2013-01-10 00:30
2013.05.12
С днем рождения ! 10 января 2013 четверг


15-1357667504
RDen
2013-01-08 21:51
2013.05.12
Поздравляю с началом (официальным) работы в НГ!


15-1357936202
Юрий
2013-01-12 00:30
2013.05.12
С днем рождения ! 12 января 2013 суббота


2-1351048982
ani
2012-10-24 07:23
2013.05.12
Передача значения из DLL в программу


15-1357798190
БарЛог
2013-01-10 10:09
2013.05.12
настройка php.ini