powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TreeView и CheckBox
3 сообщений из 28, страница 2 из 2
TreeView и CheckBox
    #39931794
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
В указанной темпе такого не увидел, но спасибо. В принципе пойдет, хотя по мне без события всё равно костыль (или быть может где ещё о событии написано?)

Может вам всё-таки программиста нанять?
Вот результат получаса поиска в гугле и экспериментов:


код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
unit tvMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, CommCtrl, StdCtrls;

const
  WM_STATECHANGED = WM_APP + $0010;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1Click(Sender: TObject);
  private
    procedure WMStateChanged(var Msg: TMessage); message WM_STATECHANGED;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  TVStyle: Cardinal;
begin
  TVStyle := GetWindowLong(TreeView1.Handle, GWL_STYLE);
  SetWindowLong(TreeView1.Handle, GWL_STYLE, TVStyle or TVS_CHECKBOXES);
  TreeView1.Items[0].Expand(True);
  TreeView1.Items[5].Expand(True);
  TreeView1.Items[0].StateIndex := 0;
  TreeView1.Items[1].StateIndex := 0;
  TreeView1.Items[2].StateIndex := 0;
  TreeView1.Items[5].StateIndex := 0;
end;

procedure TForm1.TreeView1Click(Sender: TObject);
var
  dwPos: Cardinal;
  HitTest: TTVHitTestInfo;
begin
  dwPos := GetMessagePos;
  HitTest.pt.X := TSmallPoint(dwPos).x;
  HitTest.pt.Y := TSmallPoint(dwPos).y;
  MapWindowPoints(HWND_DESKTOP, TreeView1.Handle, HitTest.pt, 1);
  TreeView_HitTest(TreeView1.Handle, HitTest);
  if HitTest.flags and TVHT_ONITEMSTATEICON <> 0 then
    PostMessage(Handle, WM_STATECHANGED, 0, LPARAM(HitTest.hItem));
end;

procedure TForm1.WMStateChanged(var Msg: TMessage);
var
  Node: TTreeNode;
  State: DWord;
begin
  State := TreeView_GetCheckState(TreeView1.Handle, HTREEITEM(Msg.LParam));
  Node := TreeView1.Items.GetNode(HTREEITEM(Msg.LParam));
  Memo1.Lines.Add(Format('Node %s state changed to %d.', [Node.Text, State]));
end;

end.

...
Рейтинг: 0 / 0
TreeView и CheckBox
    #39931896
alekcvp
пропущено...

Может вам всё-таки программиста нанять?
Вот результат получаса поиска в гугле и экспериментов:


код
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
unit tvMain;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, CommCtrl, StdCtrls;

const
  WM_STATECHANGED = WM_APP + $0010;

type
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1Click(Sender: TObject);
  private
    procedure WMStateChanged(var Msg: TMessage); message WM_STATECHANGED;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  TVStyle: Cardinal;
begin
  TVStyle := GetWindowLong(TreeView1.Handle, GWL_STYLE);
  SetWindowLong(TreeView1.Handle, GWL_STYLE, TVStyle or TVS_CHECKBOXES);
  TreeView1.Items[0].Expand(True);
  TreeView1.Items[5].Expand(True);
  TreeView1.Items[0].StateIndex := 0;
  TreeView1.Items[1].StateIndex := 0;
  TreeView1.Items[2].StateIndex := 0;
  TreeView1.Items[5].StateIndex := 0;
end;

procedure TForm1.TreeView1Click(Sender: TObject);
var
  dwPos: Cardinal;
  HitTest: TTVHitTestInfo;
begin
  dwPos := GetMessagePos;
  HitTest.pt.X := TSmallPoint(dwPos).x;
  HitTest.pt.Y := TSmallPoint(dwPos).y;
  MapWindowPoints(HWND_DESKTOP, TreeView1.Handle, HitTest.pt, 1);
  TreeView_HitTest(TreeView1.Handle, HitTest);
  if HitTest.flags and TVHT_ONITEMSTATEICON <> 0 then
    PostMessage(Handle, WM_STATECHANGED, 0, LPARAM(HitTest.hItem));
end;

procedure TForm1.WMStateChanged(var Msg: TMessage);
var
  Node: TTreeNode;
  State: DWord;
begin
  State := TreeView_GetCheckState(TreeView1.Handle, HTREEITEM(Msg.LParam));
  Node := TreeView1.Items.GetNode(HTREEITEM(Msg.LParam));
  Memo1.Lines.Add(Format('Node %s state changed to %d.', [Node.Text, State]));
end;

end.


Я уже давно всё это сделал, и чекбоксы у части улов, и события (до того как вы выложили комментарии), не так как тут, своими костылями . Как бы речь шла не о костылях и своей реализации, а о прямом фунционале. Если его нет - ну ок, можно и так делать, можно и ещё десятком способов. Просто я всегда сначала ищу прямую реализацию, а уж потом свой огород горожу. Я и спрашивал - есть ли прямые способы и далее просто был удивлён, что нет компонента treeView с функционалом чекбоксов, радиобатанов, прогресбаров и прочего, тогда как ещё 10 лет назад были сделаны сторонние компоненты с таким функционалом.
...
Рейтинг: 0 / 0
TreeView и CheckBox
    #39931945
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Игоревич
Я и спрашивал - есть ли прямые способы и далее просто был удивлён, что нет компонента treeView с функционалом чекбоксов, радиобатанов, прогресбаров и прочего, тогда как ещё 10 лет назад были сделаны сторонние компоненты с таким функционалом.
Во-первых, приведённый код хотя и работает через OnClick, но использует как раз встроенные механизмы дерева.

Во-вторых, есть сообщение WM_NOTIFY формы (или CN_Notify самого дерева), в котором есть параметр TVN_ITEMCHANGED , но он требует Windows Vista минимум и Common Controls 6й версии, поэтому у меня не получилось заставить его работать в Delphi 7.

Если хотите прямых способов - официальные майкрософтовские и SO доки вам в помощь.

Андрей Игоревич
далее просто был удивлён, что нет компонента treeView с функционалом чекбоксов, радиобатанов, прогресбаров и прочего
Есть и давно - VirtualTreeView и всякие платные, типа DevExpress(?). Сама Эмба делает среду разработки, зачем им делать ещё и то, что давно уже сделали другие?
...
Рейтинг: 0 / 0
3 сообщений из 28, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / TreeView и CheckBox
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]