📄 jvchecktreeview.pas
字号:
RadioCheckedIndex := TJvTreeViewCheckBoxOptions(Source).RadioCheckedIndex;
end
else
inherited Assign(Source);
end;
procedure TJvTreeViewCheckBoxOptions.ChangeImage(OldIndex, NewIndex: Integer);
var
N: TTreeNode;
begin
if Assigned(FTreeView) then
begin
FTreeView.Items.BeginUpdate;
try
N := FTreeView.Items.GetFirstNode;
while Assigned(N) do
begin
if N.StateIndex = OldIndex then
N.StateIndex := NewIndex;
N := N.GetNext;
end;
finally
FTreeView.Items.EndUpdate;
end;
end;
end;
function TJvTreeViewCheckBoxOptions.GetImageIndex(const Index: Integer): Integer;
begin
if (Index >= 0) and (Index <= High(FImageIndices)) then
Result := FImageIndices[Index]
else
Result := 0;
end;
procedure TJvTreeViewCheckBoxOptions.SetImageIndex(const Index, Value: Integer);
begin
if (Index >= 0) and (Index <= High(FImageIndices)) and (FImageIndices[Index] <> Value) then
begin
ChangeImage(FImageIndices[Index], Value);
FImageIndices[Index] := Value;
end;
end;
procedure TJvTreeViewCheckBoxOptions.SetStyle(const Value: TJvTVCheckBoxStyle);
begin
if FStyle <> Value then
begin
FStyle := Value;
FTreeView.Checkboxes := FStyle = cbsNative;
end;
end;
//=== { TJvCheckTreeView } ===================================================
constructor TJvCheckTreeView.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FCheckBoxOptions := TJvTreeViewCheckBoxOptions.Create;
FCheckBoxOptions.FTreeView := Self;
end;
destructor TJvCheckTreeView.Destroy;
begin
FCheckBoxOptions.Free;
inherited Destroy;
end;
procedure TJvCheckTreeView.Click;
var
P: TPoint;
begin
if CheckBoxOptions.Style = cbsJVCL then
begin
GetCursorPos(P);
P := ScreenToClient(P);
if htOnStateIcon in GetHitTestInfoAt(P.X, P.Y) then
InternalSetChecked(Selected, not Checked[Selected], CheckBoxOptions.CascadeLevels);
end;
inherited Click;
end;
procedure TJvCheckTreeView.DoToggled(Node: TTreeNode);
begin
if Assigned(FOnToggled) then
FOnToggled(Self, Node);
end;
function TJvCheckTreeView.DoToggling(Node: TTreeNode): Boolean;
begin
Result := True;
if Assigned(FOnToggling) then
FOnToggling(Self, Node, Result);
end;
function TJvCheckTreeView.GetCheckBox(Node: TTreeNode): Boolean;
begin
with CheckBoxOptions do
Result := (Node <> nil) and (Node.StateIndex in [CheckBoxUncheckedIndex, CheckBoxCheckedIndex]);
end;
function TJvCheckTreeView.GetChecked(Node: TTreeNode): Boolean;
begin
with CheckBoxOptions do
if Style = cbsJVCL then
Result := (Node <> nil) and (Node.StateIndex in [RadioCheckedIndex, CheckBoxCheckedIndex])
else
Result := inherited Checked[Node];
end;
function TJvCheckTreeView.GetRadioItem(Node: TTreeNode): Boolean;
begin
with CheckBoxOptions do
Result := (Node <> nil) and (Node.StateIndex in [RadioCheckedIndex, RadioUncheckedIndex]);
end;
procedure TJvCheckTreeView.KeyDown(var Key: Word; Shift: TShiftState);
begin
inherited KeyDown(Key, Shift);
if (CheckBoxOptions.Style = cbsJVCL) and Assigned(Selected) and
(Key = VK_SPACE) and (Shift * KeyboardShiftStates = []) then
InternalSetChecked(Selected, not Checked[Selected], CheckBoxOptions.CascadeLevels);
end;
procedure TJvCheckTreeView.SetCheckBox(Node: TTreeNode; const Value: Boolean);
begin
with CheckBoxOptions do
if (Node <> nil) and (Style = cbsJVCL) then
if Value then
begin
if Checked[Node] then
Node.StateIndex := CheckBoxCheckedIndex
else
Node.StateIndex := CheckBoxUncheckedIndex;
end
else
Node.StateIndex := 0;
end;
procedure TJvCheckTreeView.SetCheckBoxOptions(const Value: TJvTreeViewCheckBoxOptions);
begin
FCheckBoxOptions.Assign(Value);
end;
procedure TJvCheckTreeView.InternalSetChecked(Node: TTreeNode; const Value: Boolean; Levels: Integer);
var
Tmp: TTreeNode;
begin
if Checked[Node] <> Value then
ToggleNode(Node);
if (Levels <> 0) and CheckBox[Node] and
((Value and (poOnCheck in CheckBoxOptions.CascadeOptions)) or (not Value and (poOnUnCheck in
CheckBoxOptions.CascadeOptions))) then
begin
Tmp := Node.getFirstChild;
while Tmp <> nil do
begin
if CheckBox[Tmp] then
InternalSetChecked(Tmp, Value, Levels - Ord(Levels > 0));
Tmp := Tmp.getNextSibling;
end;
end;
end;
procedure TJvCheckTreeView.SetChecked(Node: TTreeNode; const Value: Boolean);
begin
with CheckBoxOptions do
if Style = cbsJVCL then
InternalSetChecked(Node, Value, CheckBoxOptions.CascadeLevels)
else
inherited Checked[Node] := Value;
end;
procedure TJvCheckTreeView.SetRadioItem(Node: TTreeNode; const Value: Boolean);
var
B: Boolean;
begin
with CheckBoxOptions do
if (Node <> nil) and (Style = cbsJVCL) then
begin
if Value then
begin
B := Checked[Node];
Node.StateIndex := RadioUncheckedIndex;
// make sure to toggle the others on or off
if B then
ToggleNode(Node);
end
else
Node.StateIndex := 0;
end;
end;
procedure TJvCheckTreeView.ToggleNode(Node: TTreeNode);
begin
if DoToggling(Node) then
begin
with CheckBoxOptions do
ToggleTreeViewCheckBoxes(Node,
CheckBoxUncheckedIndex, CheckBoxCheckedIndex, RadioUncheckedIndex, RadioCheckedIndex);
DoToggled(Node);
end;
end;
{$IFDEF UNITVERSIONING}
initialization
RegisterUnitVersion(HInstance, UnitVersioning);
finalization
UnregisterUnitVersion(HInstance);
{$ENDIF UNITVERSIONING}
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -