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

Вниз

Ошибка в KOLTreeView.OnTVExpanding   Найти похожие ветки 

 
Viman ©   (2004-12-01 16:49) [0]

Хотел я было с помощью этого события запретить сворачивание узлов, но не тут-то было: что в Result не возвращай - реакции никакой.
Ошибка в KOL.pas:
Где и на что исправить - в комментариях(//здесь ошибка!...).
function WndProcTreeView ...
...
@@itemexpanding:
       XCHG     EAX, ECX
       MOV      ECX, [EBX].TControl.fOnTVExpanding.TMethod.Code
       JECXZ    @@2fin_false2
       PUSH     EAX // @Rslt
       CMP      [EDX].TNMTreeView.action, TVE_EXPAND
       PUSH     ECX
       SETZ     CL
       XCHG     ECX, [ESP]
       XCHG     ECX, EBX  //EBX=OnTVExpanding.Code ECX=Seneder
       XCHG     EDX, ECX  //ECX=Msg EDX=Sender
       MOV      ECX, [ECX].TNMTreeView.itemNew.hItem //ECX=Item
       MOV      EAX, [EDX].TControl.fOnTVExpanding.TMethod.Data //EAX=object
@@111:
       CALL     EBX
       TEST     EAX, EAX //здесь ошибка! заменить на test al,al(т.к. при EAX старшие биты остаются в неопределенном состоянии при Result типа Boolean
       SETZ     AL
...

Вскользь глянул паскалевскую версию функции, вроде все в порядке.
Очень рад, что библиотека продолжает развиваться.
Спасибо, Владимир К., может такое дополнительно сразу на почту кидать?


 
Владимир Кладов   (2004-12-01 20:17) [1]

вы говорите про сворачивание? TVExpanding - это разворачивание. Почему я сделал контроль разворачивания? Это бывает нужно, чтобы подгрузить дочерние узлы. Не вижу причин контролировать сворачивание. Есл вам это надо, сделайте.


 
Viman ©   (2004-12-02 11:24) [2]

Да нет же. Дело не только в свёртке узла, как я заметил, функция обрабатывает(вызывается) как разворачивание узла, так и разворачивание, хотите вы того или нет, но вы так сделали :).
Флаг того, что будет делаться передается в обработчик через булевый параметр "Expand" (в asm здесь: SETZ CL; XCHG ECX, [ESP] как я понял). В описании к обработчику события(а это функция) говориться, что возвращая нужный Result(Boolean) можно либо отменить действие, либо принять. Действует, как я говорил, и на сворачивание и на разворачивание, смотря что происходит на данный момент. Но если не устранить вышеописанную неточность, то не получиться контролировать и разворачивание. Я понимаю для чего вам это нужно(просто как событие и ничего более), но, позвольте, если уж это описано, что, вроде мол должно делать так, но не делает, то это, по-моему уже баг. И нужно либо его исправлять(что желательно), либо убирать соответствующий комментарий и функцию переводить в процедуру(если смысла в результате нет), а то как в анекдоте: на заборе написано "х#й", а за ним дрова на деле.
"Есл вам это надо, сделайте" - так ведь СДЕЛАНО уже вами...
Непонимание непонимания...


 
Владимир Кладов   (2004-12-02 12:00) [3]

Сейчас проверил - все работает, в том числе и для коллапса. В асм-версии так же как и в пас. Какая у вас ОС?


 
Viman ©   (2004-12-07 11:33) [4]

Os = Win2k, WinXp. Delphi5, Compiler conditionals: KOL_MCK(по умолчанию), KOL 1.91 и 2.01, да и в 2.02 должно быть(но не смотрел ещё), проц AthlonXP(если интересно :))
Само-то событие конечно работает, если это имеется ввиду.
В обработчике пишу лишь: Result:= Expand;
Что должно означать: развернуть можно, свернуть нельзя - но не работает. Останавливаюсь по бряку в обработчике, вызываю "View CPU" и уже в нем выхожу из обработчика.
Попадаю на(test):
...
@@111:
      CALL     EBX
      TEST     EAX, EAX
      SETZ     AL
...

AL принимает значение Result(как и должно быть, ведь он Boolean = 1 byte) компилятор так компилит код, не обнуляя при этом старшие биты, но при этом в старших битах EAX может быть что угодно(старые данные), хоть 0 хоть 1. И если хоть в одном стршем бите есть 1(а они будут почти всегда, см. инструкции перед CALL EBX), то после test eax,eax ZF будет равным 0 всегда(почти), соответсвенно Обработка в случае Result = false просто исключается и все последующие инструкции почти не имеют смысла, т.к почти всегда будет "как-будто бы" true. Вот так. :)
Если я не прав, то поправьте. Или пусть рассудит другой.


 
Андрей ©   (2004-12-10 13:53) [5]

to Viman ©   (07.12.04 11:33) [4]

Ошибка имеет место, подтверждаю.
И дело действительно в старших байтиках EAX

Если вставить обработчик такой:

asm
  xor eax,eax
end;
Result:= Expand;

то все работает
[D6, W2k, WXP]


 
Владимир Кладов   (2004-12-10 18:09) [6]

тогда эти две команды TEST и SETZ просто лишние. А мне "повезло" и тест сработал нормально.



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

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

Наверх




Память: 0.49 MB
Время: 0.071 c
5-1088779512
FX
2004-07-02 18:45
2005.07.11
Компонент и WM_DISPLAYCHANGE


4-1115971874
Ярослав
2005-05-13 12:11
2005.07.11
Задания принтера


14-1118729210
Rouse_
2005-06-14 10:06
2005.07.11
Репортажик о отдыхе в Костроме


1-1119491932
Di0n
2005-06-23 05:58
2005.07.11
Listbox Items add naoborot?


14-1118244161
WondeRu
2005-06-08 19:22
2005.07.11
Зачем нужен КПК?