Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.04;
Скачать: CL | DM;

Вниз

TreeView с возможностью выбора...   Найти похожие ветки 

 
killer ©   (2004-06-13 19:22) [0]

Есть ли в Delphi компонент, который как TreeView, но только с возможностью выбора строк... т.е. как checkbox, вы видели наверно такое, в инсталляторах это есть при выборе компоненов, которые следует установить...


 
Mim1 ©   (2004-06-13 19:42) [1]

unit TreeViewS;

interface

uses
 SysUtils, Classes, Controls, ComCtrls, Windows, Messages, CommCtrl;

type
 TTVAutoCheck = (acMarkUp,acMarkDown,acUnMarkUp,acUnmarkDown);
 TTVAutoCheckSet = set of TTVAutoCheck;
 TTreeViewCheckedChangeEvent = procedure (Sender: TObject; Node:TTreeNode; NewState:Boolean) of object;
 TTreeViewFQ = class(TTreeView)
 private
   FNodeCheckedChanged : TTreeViewCheckedChangeEvent;
   FAutoCheck : TTVAutoCheckSet;
   Procedure DoNodeCheckedChanged(Node:TTreeNode; NewState:Boolean);
 protected
   Procedure WMMD(var Message: TWMLButtonDown); message WM_LBUTTONDOWN;
   procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
   procedure CreateParams(var Params: TCreateParams); override;
 public
   Function GetChecked(node : TTreeNode):boolean;
   Procedure SetChecked(Node:TTreeNode; value : Boolean);
   constructor Create(AOwner: TComponent); override;
 published
   property OnNodeCheckedChanged : TTreeViewCheckedChangeEvent read FNodeCheckedChanged write FNodeCheckedChanged;
   property AutoCheck : TTVAutoCheckSet read FAutoCheck write FAutoCheck;
 end;

procedure Register;

implementation

const
 IIL_UNCHECKED = 1;
 IIL_CHECKED   = 2;

procedure Register;
begin
 RegisterComponents("Standard", [TTreeViewFQ]);
end;

{ TTreeViewFQ }

constructor TTreeViewFQ.Create(AOwner: TComponent);
begin
 inherited;
 FAutoCheck := [];
end;

procedure TTreeViewFQ.CreateParams(var Params: TCreateParams);
begin
 inherited;
 with Params do Style := Style or TVS_CHECKBOXES;
end;

procedure TTreeViewFQ.DoNodeCheckedChanged(Node: TTreeNode;
 NewState: Boolean);
begin
 if Assigned(FNodeCheckedChanged) then
   FNodeCheckedChanged(Self,Node,NewState);
end;

function TTreeViewFQ.GetChecked(node : TTreeNode): boolean;
var
 Item:TTvItem;
begin
 Item.hItem := Node.ItemId;
 Item.Mask := TVIF_STATE;
 Item.StateMask := TVIS_STATEIMAGEMASK;
 if not TreeView_GetItem(self.Handle,Item) then Abort;
 Result := ((integer(Item.State) and INDEXTOSTATEIMAGEMASK(IIL_CHECKED)) =
   INDEXTOSTATEIMAGEMASK(IIL_CHECKED));
end;

procedure TTreeViewFQ.SetChecked(Node: TTreeNode; value: Boolean);
var
 Item:TTvItem;
begin
 if value = GetChecked(Node) then exit;
 
 Item.hItem := Node.ItemId;
 Item.Mask := TVIF_STATE;
 Item.StateMask := TVIS_STATEIMAGEMASK;
 if not TreeView_GetItem(self.Handle, Item) then Exit;
 if value then
   Item.State := INDEXTOSTATEIMAGEMASK(IIL_CHECKED)
 else
   Item.State := INDEXTOSTATEIMAGEMASK(IIL_UNCHECKED);
 TreeView_SetItem(self.Handle,Item);
end;

procedure TTreeViewFQ.WMKeyDown(var Message: TWMKeyDown);
var tn1,tn2:TTreeNode;
   b:Boolean;
begin
 if Message.CharCode <> VK_SPACE then
   begin
     inherited;
     exit;
   end;
 b:=false;
 tn1 := Selected;
 if tn1 <> nil then
   b := GetChecked(tn1);
 inherited;
 tn2 := Selected;
 if (tn1 <> nil) and (tn2 <> nil) and (tn1 = tn2) and (b <> GetChecked(tn2)) then
   DoNodeCheckedChanged(tn2,not b);
end;

procedure TTreeViewFQ.WMMD(var Message: TWMLButtonDown);
var tn1,tn2:TTreeNode;
   b:Boolean;
begin
 b:=false;
 tn1 := GetNodeAt(Message.XPos,Message.YPos);
 if tn1 <> nil then
   b := GetChecked(tn1);
 inherited;
 tn2 := GetNodeAt(Message.XPos,Message.YPos);
 if (tn1 <> nil) and (tn2 <> nil) and (tn1 = tn2) and (b <> GetChecked(tn2)) then
   DoNodeCheckedChanged(tn2,not b);
end;

end.


 
killer ©   (2004-06-14 18:22) [2]

А можно еще сделать так, чтобы выбор был только на дочерних строках, а на основных ничего небыло?


 
killer ©   (2004-06-14 19:37) [3]

Mim1 Ну помоги плиз!!! А то я в написании компонентов не понимаю ничего.... а очень надо...


 
Mim1 ©   (2004-06-14 21:11) [4]

Чек боксы к сожелению отображаются для все элементов. Для чатси из них убрать этого нельзя. Зато можно эмульровать чек боксы за счет картинок. На www.torry.net есть куча подобных компонент.


 
killer ©   (2004-06-14 23:08) [5]

Mim1 И еще один вопросик.... в каком свойстве можно определить, какая строчка отмечена галочкой?


 
Mim1 ©   (2004-06-15 01:46) [6]


> можно определить, какая строчка отмечена галочкой?


Например так TreeView1.GetChecked(TreeView1.Selected) для выбранного.


 
killer ©   (2004-06-16 13:54) [7]

Mim1 У меня к тебе еще один вопросик возник.... а почему в низу ScrollBar(горизонтальный) появляется и как его убрать? :)


 
Mim1 ©   (2004-06-16 17:37) [8]


> [7] killer ©   (16.06.04 13:54)
> Mim1 У меня к тебе еще один вопросик возник.... а почему
> в низу ScrollBar(горизонтальный) появляется и как его убрать?
> :)


Почему появляется не знаю :(, думаю что баг, убирать не стал, пользователю то все равно пофиг. Как его убрать польностью описано в faq"е на сатйе подгоретского, однако думается что надо его не совсем убрать а уменьшить до приемлимых размеров. Как это сделать незнаб :(
Извините если не смог помочь.


 
_none_ ©   (2004-06-16 20:06) [9]

http://www.delphi-gems.com/VirtualTreeview/VT.php


 
killer ©   (2004-06-16 23:07) [10]

А можно ли добавить свойство HorzScrollBar и установить в нем значение Visible=false?


 
killer ©   (2004-06-17 17:58) [11]

Т.е. я имею ввиду добавить свойство и отключить его... может поможет?


 
killer ©   (2004-06-17 17:59) [12]

_none_ Подскажи пожалуйста... а где там эти строки хранятся, в каком свойстве? А то я что-то не разберусь никак в этом Virtua TreeView...



Страницы: 1 вся ветка

Текущий архив: 2004.07.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.037 c
4-1083367298
Bonial
2004-05-01 03:21
2004.07.04
Как работают "часы" в трее?


1-1087451527
P@vel
2004-06-17 09:52
2004.07.04
Window Handle


3-1086695303
white
2004-06-08 15:48
2004.07.04
Посоветуйте какой компонент подойдёт...


14-1087391414
Ega23
2004-06-16 17:10
2004.07.04
Жена только что позвонила.


4-1085377436
S@shka
2004-05-24 09:43
2004.07.04
"Подмена" окна внешнего приложения