Вверх ↑
Разработчик
Ответов: 26061
Рейтинг: 2120
#1: 2022-04-23 17:28:34 ЛС | профиль | цитата
Вроде вот так нормально работает


function WndOnCheck(Sender: PControl; var Msg: TMsg; var Rslt: Integer): Boolean;
const
NM_FIRST = 0;
NM_CLICK = NM_FIRST - 2;
NM_CUSTOMDRAW = NM_FIRST - 12;
type
tagNMITEMACTIVATE = packed record
hdr: TNMHdr;
iItem: Integer;
iSubItem: Integer;
uNewState: UINT;
uOldState: UINT;
uChanged: UINT;
ptAction: TPoint;
lParam: LPARAM;
uKeyFlags: UINT;
end;
PNMItemActivate = ^TNMItemActivate;
TNMItemActivate = tagNMITEMACTIVATE;
var
NMOD: PNMItemActivate;
fClass: ThiTreeViewTrain;
fd: PData;
where: dword;
ItemStateImg, i: integer;

procedure Enum(prn: cardinal; CheckBoxes: boolean; CheckBoxIndex: integer);
var
j: integer;
FCurNode: PData;
begin
if prn > 0 then
begin
FCurNode := PData(Sender.TVItemData[prn]);
j := 0;
while FCurNode <> nil do
begin
if CheckBoxes and (j = CheckBoxIndex) and (ItemStateImg <> ToInteger(FCurNode^) + 1) then
begin
if _IsInteger(FCurNode^) then
FCurNode.idata := ItemStateImg - 1
else if _IsStr(fd^) then
FCurNode.sdata := Int2Str(ItemStateImg - 1)
else
begin
FCurNode.idata := ItemStateImg - 1;
FCurNode.sdata := Int2Str(ItemStateImg - 1);
FCurNode.rdata := ItemStateImg - 1;
end;
Sender.TVItemStateImg[prn] := ItemStateImg;
break;
end;
inc(j);
FCurNode := FCurNode.ldata;
end;
if Sender.TVItemChild[prn] > 0 then Enum(Sender.TVItemChild[prn], CheckBoxes, CheckBoxIndex);
Enum(Sender.TVItemNext[prn], CheckBoxes, CheckBoxIndex);
end;
end;

begin
Result := false;
fClass := ThiTreeViewTrain(Sender.Tag);
with fClass do
begin
if Msg.message = WM_NOTIFY then
begin
NMOD := Pointer( Msg.lParam );
if (NMOD.hdr.code = NM_CLICK) then
PostMessage(Sender.Handle, WM_STATECHANGED, 0, Sender.TVItemAtPos(Ms.X, Ms.Y, where));
end;
if (Msg.message = WM_STATECHANGED) and (Msg.LParam <> 0) then
begin
ItemStateImg := Sender.TVItemStateImg[Msg.LParam];

fd := Sender.TVItemData[Msg.LParam];
i := 0;
while fd <> nil do
begin
if _prop_CheckBoxes and (i = _prop_CheckBoxIndex) and (ItemStateImg <> ToInteger(fd^) + 1) then
begin
if _IsInteger(fd^) then
fd.idata := ItemStateImg - 1
else if _IsStr(fd^) then
fd.sdata := Int2Str(ItemStateImg - 1)
else
begin
fd.idata := ItemStateImg - 1;
fd.sdata := Int2Str(ItemStateImg - 1);
fd.rdata := ItemStateImg - 1;
end;
if _prop_SetCheckOnChild then
Enum(Sender.TVItemChild[Msg.LParam], _prop_CheckBoxes, _prop_CheckBoxIndex);
break;
end;
inc(i);
fd := fd.ldata;
end;
end;
end;
end;
карма: 22

0