Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #3  
Старый 09.04.2014, 13:02
kasimka kasimka вне форума
Прохожий
 
Регистрация: 08.04.2014
Адрес: Брест
Сообщения: 7
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Спасибо огромное!

Может кому-нибудь пригодиться... Немного переписанное событие OnMouseDown и рекурсивная процедура (позволяет проставить галочки во всех дочерних нодах):

Код:
procedure TMainForm.CTVMouseDown(Sender: TObject; Button: TMouseButton; 
Shift: TShiftState; X, Y: Integer);
var
  Node: TTreeNode;
begin
  if (Sender as TCustomTreeView).AutoCheck=True then
  begin
    Node:=(Sender as TCustomTreeView).GetNodeAt(X, Y);
    if (Node <> nil) and 
((Sender as TCustomTreeView).GetHitTestInfoAt(X, Y) = [htOnItem, htOnStateIcon]) then
      CheckSubNode(Sender, Node);
  end;
end;

procedure TMainForm.CheckSubNode(Sender: TObject; Node: TTreeNode);
var
  flag: boolean;
begin
  if not Node.HasChildren then Exit;
  flag:=(Sender as TCustomTreeView).GetChecked(Node);
  Node:=Node.getFirstChild;
  while Assigned(Node) do
    begin
      (Sender as TCustomTreeView).SetChecked(Node, flag);
      CheckSubNode(Sender, Node);
      Node:=Node.GetNextChild(Node);
    end;
end;

Еще раз переписанное событие (позволяет снимать родительский чекбокс при снятии последнего дочернего и ставить родительский чекбокс при включении первого дочернего):
Код:
procedure TMainForm.CTVMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
  NodeParent, Node: TTreeNode;
begin
  if (Sender as TCustomTreeView).AutoCheck=True then
  begin
    Node:=(Sender as TCustomTreeView).GetNodeAt(X, Y);
    if (Node <> nil) and
((Sender as TCustomTreeView).GetHitTestInfoAt(X, Y) = [htOnItem, htOnStateIcon]) then
      CheckSubNode(Sender, Node);
    if Node.Parent<>nil then
      begin
        NodeParent:=Node.Parent;
        Node:=NodeParent.getFirstChild;
        while Assigned(Node) do
          begin
            if (Sender as TCustomTreeView).GetChecked(Node) then
              Checked:=True;
            Node:=NodeParent.GetNextChild(Node);
          end;
        if not Checked then
          (Sender as TCustomTreeView).SetChecked(NodeParent, false)
        else
          (Sender as TCustomTreeView).SetChecked(NodeParent, true);
      end;
  end;
end;
Рекурсивная процедура остается той же.
Таким образом, имеем полностью рабочее дерево с чекбоксами.

Последний раз редактировалось M.A.D.M.A.N., 15.04.2014 в 17:10.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 07:45.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025