Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TreeView с возможностью выбора... [D7, Win95/98, WinXP]


killer ©   (2004-06-13 19:22:00) 

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


killer   (2004-06-17 17:59:00) [1]

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


killer   (2004-06-17 17:58:00) [2]

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


killer   (2004-06-16 23:07:00) [3]

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


_none_   (2004-06-16 20:06:00) [4]

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


Mim1   (2004-06-16 17:37:00) [5]


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


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


killer   (2004-06-16 13:54:00) [6]

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


Mim1   (2004-06-15 01:46:00) [7]


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


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


killer   (2004-06-14 23:08:00) [8]

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


Mim1   (2004-06-14 21:11:00) [9]

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


killer   (2004-06-14 19:37:00) [10]

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


killer   (2004-06-14 18:22:00) [11]

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


Mim1   (2004-06-13 19:42:00) [12]

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.


Наверх

Титульная страница Поиск, карта сайта Написать письмо