SelUserFrm.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:7k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit SelUserFrm;
  2. interface
  3. uses
  4.   SysUtils, Windows, Messages, Classes, Graphics, Controls,
  5.   StdCtrls, ExtCtrls, Forms, ComCtrls,ChatingFrm,RealMessengerUnit,RealMessengerImpl,Commctrl,
  6.   ToolWin,Global, bsSkinCtrls, BusinessSkinForm;
  7. type
  8.   TSelUserForm = class(TForm)
  9.     TrevUserList: TbsSkinTreeView;
  10.     bsSkinPanel1: TbsSkinPanel;
  11.     bsSkinScrollBar1: TbsSkinScrollBar;
  12.     bsSkinScrollBar2: TbsSkinScrollBar;
  13.     bsBusinessSkinForm1: TbsBusinessSkinForm;
  14.     bsSkinGroupBox1: TbsSkinGroupBox;
  15.     bsSkinPanel2: TbsSkinPanel;
  16.     bsSkinButton1: TbsSkinButton;
  17.     bsSkinButton2: TbsSkinButton;
  18.     procedure TrevUserListCustomDrawItem(Sender: TCustomTreeView;
  19.       Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
  20.     procedure TrevUserListGetImageIndex(Sender: TObject; Node: TTreeNode);
  21.     procedure FormShow(Sender: TObject);
  22.     procedure TrevUserListMouseDown(Sender: TObject; Button: TMouseButton;
  23.       Shift: TShiftState; X, Y: Integer);
  24.     procedure TBBranchsClick(Sender: TObject);
  25.     procedure TBGroupsClick(Sender: TObject);
  26.     procedure FormDestroy(Sender: TObject);
  27.     procedure TBOrOrOffClick(Sender: TObject);
  28.   private
  29.     procedure SetAllFalse();
  30.   end;
  31.   function IsNodeChecked(Node :TTreeNode) :Boolean;
  32. var
  33.   SelUserForm: TSelUserForm;
  34. implementation
  35. {$R *.DFM}
  36. procedure DOYNChecked(Node: TTreeNode; isChecked: Boolean);
  37. {操作节点是否被checkd}
  38. var
  39.   item:TTVItem;
  40. begin
  41.   item.mask:=TVIF_HANDLE;
  42.   item.hItem:=SelUserForm.TrevUserList.Items[Node.AbsoluteIndex].ItemId;
  43.   TreeView_GetItem(SelUserForm.TrevUserList.Handle,item);
  44.   item.mask:=TVIF_HANDLE or TVIF_STATE;
  45.   if not isChecked then
  46.     item.state:= (item.state or $1000) and (not $2000)
  47.   else
  48.     item.state:= (item.state or $2000) and (not $1000);
  49.   item.stateMask:=$ffffffff;
  50.   TreeView_SetItem(SelUserForm.TrevUserList.Handle,item);
  51. end;
  52. procedure AllChildYNChecked(Node: TTreeNode; isChecked: Boolean);
  53. {操作所有的子节点是否被checkd}
  54. var
  55.   CurChild: TTreeNode;
  56. begin
  57.   if Node.HasChildren then
  58.   begin
  59.     CurChild:=Node.GetFirstChild;
  60.     while CurChild <> nil do
  61.     begin
  62.       DOYNChecked(CurChild, isChecked);
  63.       if CurChild.HasChildren then
  64.       begin
  65.         AllChildYNChecked(CurChild, isChecked);
  66.       end;
  67.       CurChild:=Node.getNextChild(CurChild);
  68.     end;
  69.   end;
  70. end;{FreeDeleteNode}
  71. function IsNodeChecked(Node :TTreeNode) :Boolean;
  72. {判断节点是否被checkd}
  73. var
  74.   item:TTVItem;
  75. begin
  76.   item.mask:=TVIF_HANDLE;
  77.   item.hItem:=SelUserForm.TrevUserList.Items[Node.AbsoluteIndex].ItemId;
  78.   TreeView_GetItem(SelUserForm.TrevUserList.Handle,item);
  79.   if (item.state and $2000)=0 then
  80.      Result := False
  81.    else
  82.      Result := True;
  83. end;
  84. function isBrotherAllChecked(Node: TTreeNode): Boolean;
  85. {判断所有的兄弟节点是否已全部被checkd}
  86. var
  87.   CurChild: TTreeNode;
  88.   tmpBool: Boolean;
  89. begin 
  90.   Node := Node.Parent;
  91.   if Node.HasChildren then
  92.   begin
  93.     CurChild:=Node.GetFirstChild;
  94.     while CurChild <> nil do
  95.     begin
  96.       tmpBool := IsNodeChecked(CurChild);
  97.       if not tmpBool then
  98.       begin
  99.         Result := False;
  100.         exit;
  101.       end;
  102.       CurChild:=Node.getNextChild(CurChild);
  103.     end;
  104.   end;
  105.   Result := True;
  106. end;
  107. procedure SetParentChecked(Node: TTreeNode);
  108. {当子节点checked时,设置父节点应该设置的checked}
  109. begin
  110.   if Node.Parent <> nil then
  111.   begin
  112.     if isBrotherAllChecked(Node) then
  113.       DOYNChecked(Node.Parent, True);
  114.     SetParentChecked(Node.Parent);
  115.   end;
  116. end;
  117. procedure SetParentNOChecked(Node: TTreeNode);
  118. {当子节点not checked时,设置父节点应该设置的checked}
  119. begin
  120.   if Node.Parent <> nil then
  121.   begin
  122.     DOYNChecked(Node.Parent, False);
  123.     SetParentNOChecked(Node.Parent);
  124.   end;
  125. end;
  126. procedure SetComCtlStyle(Ctl: TWinControl; Value: Integer; UseStyle: Boolean);
  127. var
  128.   Style: Integer;
  129. begin
  130.   if Ctl.HandleAllocated then
  131.   begin
  132.     Style := GetWindowLong(Ctl.Handle, GWL_STYLE);
  133.     if not UseStyle then Style := Style and not Value
  134.     else Style := Style or Value;
  135.     SetWindowLong(Ctl.Handle, GWL_STYLE, Style);
  136.   end;
  137. end;
  138. {自定义CustomDrawItem,根据用户不同的状态显示不同颜色}
  139. procedure TSelUserForm.TrevUserListCustomDrawItem(Sender: TCustomTreeView;
  140.   Node: TTreeNode; State: TCustomDrawState; var DefaultDraw: Boolean);
  141. begin
  142.   DefaultDraw:=true;
  143.   if Node.Selected then
  144.   begin
  145.     TrevUserList.Canvas.Font.Color:=clWhite;
  146.   end
  147.   else
  148.   begin
  149.     if Node.StateIndex = 2 then
  150.     begin
  151.       if (Node.ImageIndex = 6) or (Node.ImageIndex = 10) then
  152.         TrevUserList.Canvas.Font.Color:=clRed
  153.       else
  154.         TrevUserList.Canvas.Font.Color:=clGreen;
  155.     end
  156.     else
  157.       TrevUserList.Canvas.Font.Color:=clBlack;
  158.   end;
  159.   TrevUserList.Canvas.Textout(Node.DisplayRect(True).Left+2,Node.DisplayRect(True).Top+2,Node.Text);
  160. end;
  161. {设置TreeView的节点图片}
  162. procedure TSelUserForm.TrevUserListGetImageIndex(Sender: TObject;
  163.   Node: TTreeNode);
  164. begin
  165.   if Node.StateIndex = -1 then
  166.   begin
  167.       if Node.Expanded then
  168.         Node.ImageIndex:=4
  169.       else
  170.         Node.ImageIndex:=5;
  171.   end;
  172.   if Node.StateIndex = 0 then
  173.   begin
  174.       if Node.Expanded then
  175.         Node.ImageIndex:=1
  176.       else
  177.         Node.ImageIndex:=0;
  178.   end;
  179.   if Node.StateIndex = 1 then
  180.   begin
  181.       if Node.Expanded then
  182.         Node.ImageIndex:=3
  183.       else
  184.         Node.ImageIndex:=2;
  185.   end;
  186.   Node.SelectedIndex:=Node.ImageIndex;
  187. end;
  188. procedure TSelUserForm.TrevUserListMouseDown(Sender: TObject;
  189.   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  190. var
  191.   HitTests: THitTests;
  192.   tmpNode: TTreeNode;
  193. begin
  194.   HitTests := TrevUserList.GetHitTestInfoAt(X, Y);
  195.   if htOnStateIcon in HitTests then
  196.   begin
  197.     tmpNode := TrevUserList.GetNodeAt(x, y);
  198.     tmpNode.Selected := True;
  199.     if IsNodeChecked(TrevUserList.Selected) then
  200.     begin
  201.       SetParentChecked(TrevUserList.Selected);
  202.       AllChildYNChecked(TrevUserList.Selected, true);
  203.     end
  204.     else
  205.     begin
  206.       SetParentNOChecked(TrevUserList.Selected);
  207.       AllChildYNChecked(TrevUserList.Selected, False);
  208.     end;
  209.   end;
  210. end;
  211. procedure TSelUserForm.FormShow(Sender: TObject);
  212. begin
  213.   SetComCtlStyle(TrevUserList,TVS_CHECKBOXES,True);
  214.   TBBranchsClick(nil);
  215. end;
  216. procedure TSelUserForm.SetAllFalse();
  217. var
  218.   iLoop:Integer;
  219. begin
  220.   for iLoop:=0 to TrevUserList.Items.Count-1 do
  221.   begin
  222.     DOYNChecked(TrevUserList.Items[iLoop],False);
  223.   end;
  224. end;
  225. procedure TSelUserForm.TBBranchsClick(Sender: TObject);
  226. begin
  227.   RealMessengerX.GetListViewData(TrevUserList,vsTree,True);
  228.   SetAllFalse;
  229. end;
  230. procedure TSelUserForm.TBGroupsClick(Sender: TObject);
  231. begin
  232.   RealMessengerX.GetListViewData(TrevUserList,vsGroup,True);
  233.   SetAllFalse;
  234. end;
  235. procedure TSelUserForm.TBOrOrOffClick(Sender: TObject);
  236. begin
  237.   RealMessengerX.GetListViewData(TrevUserList,vsOnlineOffline,True);
  238.   SetAllFalse;
  239. end;
  240. procedure TSelUserForm.FormDestroy(Sender: TObject);
  241. var
  242.   i:Integer;
  243. begin
  244.     for i:=0 to TrevUserList.Items.Count-1 do FreeMem(TrevUserList.Items[i].Data,SizeOf(Employee));
  245. end;
  246. end.