Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.07.04;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.031 c
14-1087131562
SergP
2004-06-13 16:59
2004.07.04
TClientSocket, OnError


3-1086613970
}|{yk
2004-06-07 17:12
2004.07.04
Видимость данных


3-1086033673
MOTOR
2004-06-01 00:01
2004.07.04
Как узнать что база пуста


14-1087225389
default
2004-06-14 19:03
2004.07.04
Очередная задачка


10-1017909913
Сергей Орлик
2002-04-03 12:41
2004.07.04
Java Technology Conference в Москве





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский