-
when define EVENT_STATIC, WndProcToolbarCtrl() will report compiler error, seems some code is not correct,
{$IFDEF EVENTS_DYNAMIC} MOV EDX, [EDX].TControl.EV MOV ECX, [EDX].TEvents.fOnResize.TMethod.Code MOV EAX, [EDX].TEvents.fOnResize.TMethod.Data {$ELSE} MOV ECX, [EDX].TControl.fOnResize.TMethod.Code MOV EAX, [EDX].TControl.fOnResize.TMethod.Data {$ENDIF}
must changed to
{$IFDEF EVENTS_DYNAMIC} MOV EDX, [EDX].TControl.EV MOV ECX, [EDX].TEvents.fOnResize.TMethod.Code MOV EAX, [EDX].TEvents.fOnResize.TMethod.Data {$ELSE} MOV ECX, [EDX].TControl.EV.fOnResize.TMethod.Code MOV EAX, [EDX].TControl.EV.fOnResize.TMethod.Data {$ENDIF}
-
below code must more nice
{$IFDEF EVENTS_DYNAMIC} MOV EDX, [EDX].TControl.EV {$ELSE} MOV EDX, OFFSET [EDX].TControl.EV {$ENDIF} MOV ECX, [EDX].TEvents.fOnResize.TMethod.Code MOV EAX, [EDX].TEvents.fOnResize.TMethod.Data
-
no answer?
-
For EVENT_STATIC, your correction seems OK. (Do you use EVENTS_STATIC for some kind of compatibility? In most cases NIL_EVENTS is sufficient. EVENTS_DYNAMIC uses memory more efficiently for a case of a lot of controls in the app).
I'll add your correction int the next update. Sorry, just did not want make a release for a single fix for a rare (I hope) used conditional definition case.
-
Владимир еще есть проблемы с treeview.. А именно в новой версии WndProcTreeView, не работает editlabels. Исправил, как смог:
function WndProcTreeView( Self_: PControl; var Msg: TMsg; var Rslt: Integer ): Boolean;
asm
PUSH ESI
PUSH EDI
MOV EDI, ECX XOR ECX, ECX
CMP WORD PTR [EDX].TMsg.message, WM_NOTIFY
JNZ @@ret_false1
XCHG ESI, EAX
MOV EDX, [EDX].TMsg.lParam
CMP WORD PTR [EDX].TNMTreeView.hdr.code, NM_RCLICK
JNE @@chk_TVN_BEGINDRAG
PUSH ECX
PUSH ECX
PUSH ESP
CALL GetCursorPos
MOV EAX, ESI
MOV EDX, ESP
MOV ECX, EDX
CALL TControl.Screen2Client
POP EDX
POP EAX
SHLD EAX, EDX, 16
PUSH EAX
CALL GetShiftState
PUSH EAX
PUSH WM_RBUTTONUP
PUSH ESI
CALL TControl.PostMsg
JMP @@ret_false1
@@prepareCallEvent:
STC
MOV EDX, ESI
MOV ESI, [ESI].TControl.EV
LEA ECX, [ESI+ECX*8].TEvents.fOnTVBeginDrag
LEA ECX, [ESI+ECX*8].TControl.EV.fOnTVBeginDrag
MOV EAX, [ECX].TMethod.Data
MOV ECX, [ECX].TMethod.Code
JECXZ @@noEvent
MOV ESI, ECX
AND EAX, EAX
@@noEvent:
RET
@@chk_TVN_BEGINDRAG: CMP WORD PTR [EDX].TNMTreeView.hdr.code, TVN_BEGINDRAG
JE @@beginDrag
CMP WORD PTR [EDX].TNMTreeView.hdr.code, TVN_BEGINRDRAG
JNE @@chk_TVNBEGINLABELEDIT
@@beginDrag:
PUSH [EDX].TNMTreeView.itemNew.hItem
CALL @@prepareCallEvent
POP ECX
JC @@ret_false1
@@justEventCall:
CALL ESI
@@RsltEAX_ResultFalse:
MOV [EDI], EAX
XOR EAX, EAX
POP EDI
POP ESI
RET
@@chk_TVNBEGINLABELEDIT: INC ECX CMP WORD PTR [EDX].TNMTreeView.hdr.code, TVN_BEGINLABELEDIT
JNE @@chk_ENDLABELEDIT
XOR EAX, EAX
INC EAX
TEST [ESI].TControl.fFlagsG6, 1 shl G6_Dragging
CMP [ESI].TControl.fDragging, 0
JNZ @@rsltEAX_ResultTrue
PUSH [EDX].TTVDispInfo.item.hItem
CALL @@prepareCallEvent
POP ECX
JC @@ret_false1
CALL ESI
XOR EAX, 1 @@rsltEAX_ResultTrue:
MOV [EDI], EAX
@@ResultTrue:
MOV AL, 1
POP EDI
POP ESI
RET
@@chk_ENDLABELEDIT:
INC ECX CMP WORD PTR [EDX].TNMTreeView.hdr.code, TVN_ENDLABELEDIT
JNE @@chk_ITEMEXPANDING
MOV EAX, [EDX].TTVDispInfo.item.pszText
TEST EAX, EAX
JZ @@ResultTrue
PUSH EAX
PUSH [EDX].TTVDispInfo.item.hItem
CALL @@prepareCallEvent
POP ECX
JC @@ret_false1 CALL ESI JMP @@rsltEAX_ResultTrue @@Rslt1_ResultTrue:
XOR EAX, EAX
INC EAX
JMP @@RsltEAX_ResultFalse
@@chk_ITEMEXPANDING: INC ECX CMP WORD PTR [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDING
JNE @@chk_ITEMEXPANDED
@@expanding_expanded:
CMP [EDX].TNMTreeView.action, TVE_EXPAND
SETZ AL
PUSH EAX
PUSH [EDX].TNMTreeView.itemNew.hItem
@@event3:
CALL @@prepareCallEvent
POP ECX
JNC @@justEventCall
POP EAX
JMP @@ret_false1
@@chk_ITEMEXPANDED: INC ECX CMP [EDX].TNMTreeView.hdr.code, TVN_ITEMEXPANDED
JE @@expanding_expanded
INC ECX CMP [EDX].TNMTreeView.hdr.code, TVN_SELCHANGING
JNE @@chk_TVN_SELCHANGED
PUSH [EDX].TNMTreeView.itemNew.hItem
PUSH [EDX].TNMTreeView.itemOld.hItem
JMP @@event3
@@chk_TVN_SELCHANGED:
CMP [EDX].TNMTreeView.hdr.code, TVN_SELCHANGED
JNE @@ret_false1
XCHG EAX, ESI
CALL TControl.DoSelChange
@@ret_false1:
XOR EAX, EAX
POP EDI
POP ESI
end;
-
Спасибо, не заметил (давно без деревьев живу. Вредные они).
-
Do you use EVENTS_STATIC for some kind of compatibility?
that is right:) thanks a lot
-
> Vladimir Kladov © (21.11.11 16:55) [5] > Спасибо, не заметил (давно без деревьев живу. Вредные они).
Как так? Вы имеете ввиду без стандартного treeview или вообще без любых? 8-0
-
Под VCL заменил своим FastTreeView, который сделан из виртуального ListView, и у него нет ограничений на число узлов. А в KOL-проектах стараюсь просто деревьев не делать. 65536 максимум узлов это ни в какие ворота. Тормоза после 1000-2000 узлов опять же.
-
Обновление завтра буду делать. 2 Dufa: посмотрите у себя, работает ли в первом случае вот такой вариант:
@@chk_TVNBEGINLABELEDIT: INC ECX CMP WORD PTR [EDX].TNMTreeView.hdr.code, TVN_BEGINLABELEDIT
JNE @@chk_ENDLABELEDIT
XOR EAX, EAX
INC EAX
TEST [ESI].TControl.fFlagsG6, 1 shl G6_Dragging
CMP [ESI].TControl.fDragging, 0
JNZ @@rsltEAX_ResultTrue
PUSH [EDX].TTVDispInfo.item.hItem
CALL @@prepareCallEvent
POP ECX
JC @@ret_false1
CALL ESI
XOR AL, 1 @@rsltEAX_ResultTrue:
MOV [EDI], AL @@ResultTrue:
MOV AL, 1
POP EDI
POP ESI
RET
Жаль на работе не было времени проверить на живом NT4 и прочем зверинце. На XP SP3 работает. Win Se7en я у себя снес навсегда. Хорошо бы под Win 9x глянуть, хотя бы виртуальном.
-
Vladimir Kladov, Работает норм, хр_сп3, 2к_сп4. 9х сейчас нету.. если появится возможность - проверю
|