Главная страница
    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.46 MB
Время: 0.045 c
8-1103872182
WondeRu
2004-12-24 10:09
2005.07.11
FFTW.dll - кто нибудь пользовался?


3-1117001327
ANB
2005-05-25 10:08
2005.07.11
Как скопировать таблицу из схемы в схему (Oracle)


1-1119339737
pavel_guzhanov
2005-06-21 11:42
2005.07.11
Как преобразовать дату?


3-1117627480
Aljona
2005-06-01 16:04
2005.07.11
Ttable иedit


4-1116330535
Shuma
2005-05-17 15:48
2005.07.11
Виртуальный диск





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский