Текущий архив: 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.46 MB
Время: 0.041 c