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

Delphi控件源码

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {         Delphi VCL Extensions (RX)                    }
  4. {                                                       }
  5. {         Copyright (c) 1995 AO ROSNO                   }
  6. {         Copyright (c) 1997, 1998 Master-Bank          }
  7. {                                                       }
  8. {*******************************************************}
  9. unit BoxProcs;
  10. {$I RX.INC}
  11. interface
  12. uses Classes, Controls, StdCtrls, RxCtrls;
  13. procedure BoxMoveSelectedItems(SrcList, DstList: TWinControl);
  14. procedure BoxMoveAllItems(SrcList, DstList: TWinControl);
  15. procedure BoxDragOver(List: TWinControl; Source: TObject;
  16.   X, Y: Integer; State: TDragState; var Accept: Boolean; Sorted: Boolean);
  17. procedure BoxMoveFocusedItem(List: TWinControl; DstIndex: Integer);
  18. procedure BoxMoveSelected(List: TWinControl; Items: TStrings);
  19. procedure BoxSetItem(List: TWinControl; Index: Integer);
  20. function BoxGetFirstSelection(List: TWinControl): Integer;
  21. function BoxCanDropItem(List: TWinControl; X, Y: Integer;
  22.   var DragIndex: Integer): Boolean;
  23. implementation
  24. uses {$IFDEF WIN32} Windows {$ELSE} WinTypes, WinProcs {$ENDIF}, Graphics;
  25. function BoxItems(List: TWinControl): TStrings;
  26. begin
  27.   if List is TCustomListBox then
  28.     Result := TCustomListBox(List).Items
  29.   else if List is TRxCustomListBox then
  30.     Result := TRxCustomListBox(List).Items
  31.   else Result := nil;
  32. end;
  33. function BoxGetSelected(List: TWinControl; Index: Integer): Boolean;
  34. begin
  35.   if List is TCustomListBox then
  36.     Result := TCustomListBox(List).Selected[Index]
  37.   else if List is TRxCustomListBox then
  38.     Result := TRxCustomListBox(List).Selected[Index]
  39.   else Result := False;
  40. end;
  41. procedure BoxSetSelected(List: TWinControl; Index: Integer; Value: Boolean);
  42. begin
  43.   if List is TCustomListBox then
  44.     TCustomListBox(List).Selected[Index] := Value
  45.   else if List is TRxCustomListBox then
  46.     TRxCustomListBox(List).Selected[Index] := Value;
  47. end;
  48. function BoxGetItemIndex(List: TWinControl): Integer;
  49. begin
  50.   if List is TCustomListBox then
  51.     Result := TCustomListBox(List).ItemIndex
  52.   else if List is TRxCustomListBox then
  53.     Result := TRxCustomListBox(List).ItemIndex
  54.   else Result := LB_ERR;
  55. end;
  56. {$IFNDEF WIN32}
  57. function BoxGetCanvas(List: TWinControl): TCanvas;
  58. begin
  59.   if List is TCustomListBox then
  60.     Result := TCustomListBox(List).Canvas
  61.   else if List is TRxCustomListBox then
  62.     Result := TRxCustomListBox(List).Canvas
  63.   else Result := nil;
  64. end;
  65. {$ENDIF}
  66. procedure BoxSetItemIndex(List: TWinControl; Index: Integer);
  67. begin
  68.   if List is TCustomListBox then
  69.     TCustomListBox(List).ItemIndex := Index
  70.   else if List is TRxCustomListBox then
  71.     TRxCustomListBox(List).ItemIndex := Index;
  72. end;
  73. function BoxMultiSelect(List: TWinControl): Boolean;
  74. begin
  75.   if List is TCustomListBox then
  76.     Result := TListBox(List).MultiSelect
  77.   else if List is TRxCustomListBox then
  78.     Result := TRxCheckListBox(List).MultiSelect
  79.   else Result := False;
  80. end;
  81. function BoxSelCount(List: TWinControl): Integer;
  82. begin
  83.   if List is TCustomListBox then
  84.     Result := TCustomListBox(List).SelCount
  85.   else if List is TRxCustomListBox then
  86.     Result := TRxCustomListBox(List).SelCount
  87.   else Result := 0;
  88. end;
  89. function BoxItemAtPos(List: TWinControl; Pos: TPoint;
  90.   Existing: Boolean): Integer;
  91. begin
  92.   if List is TCustomListBox then
  93.     Result := TCustomListBox(List).ItemAtPos(Pos, Existing)
  94.   else if List is TRxCustomListBox then
  95.     Result := TRxCustomListBox(List).ItemAtPos(Pos, Existing)
  96.   else Result := LB_ERR;
  97. end;
  98. function BoxItemRect(List: TWinControl; Index: Integer): TRect;
  99. begin
  100.   if List is TCustomListBox then
  101.     Result := TCustomListBox(List).ItemRect(Index)
  102.   else if List is TRxCustomListBox then
  103.     Result := TRxCustomListBox(List).ItemRect(Index)
  104.   else FillChar(Result, SizeOf(Result), 0);
  105. end;
  106. procedure BoxMoveSelected(List: TWinControl; Items: TStrings);
  107. var
  108.   I: Integer;
  109. begin
  110.   if BoxItems(List) = nil then Exit;
  111.   I := 0;
  112.   while I < BoxItems(List).Count do begin
  113.     if BoxGetSelected(List, I) then begin
  114.       Items.AddObject(BoxItems(List).Strings[I], BoxItems(List).Objects[I]);
  115.       BoxItems(List).Delete(I);
  116.     end
  117.     else Inc(I);
  118.   end;
  119. end;
  120. function BoxGetFirstSelection(List: TWinControl): Integer;
  121. var
  122.   I: Integer;
  123. begin
  124.   Result := LB_ERR;
  125.   if BoxItems(List) = nil then Exit;
  126.   for I := 0 to BoxItems(List).Count - 1 do begin
  127.     if BoxGetSelected(List, I) then begin
  128.       Result := I;
  129.       Exit;
  130.     end;
  131.   end;
  132.   Result := LB_ERR;
  133. end;
  134. procedure BoxSetItem(List: TWinControl; Index: Integer);
  135. var
  136.   MaxIndex: Integer;
  137. begin
  138.   if BoxItems(List) = nil then Exit;
  139.   with List do begin
  140.     if CanFocus then SetFocus;
  141.     MaxIndex := BoxItems(List).Count - 1;
  142.     if Index = LB_ERR then Index := 0
  143.     else if Index > MaxIndex then Index := MaxIndex;
  144.     if Index >= 0 then begin
  145.       if BoxMultiSelect(List) then BoxSetSelected(List, Index, True)
  146.       else BoxSetItemIndex(List, Index);
  147.     end;
  148.   end;
  149. end;
  150. procedure BoxMoveSelectedItems(SrcList, DstList: TWinControl);
  151. var
  152.   Index, I, NewIndex: Integer;
  153. begin
  154.   Index := BoxGetFirstSelection(SrcList);
  155.   if Index <> LB_ERR then begin
  156.     BoxItems(SrcList).BeginUpdate;
  157.     BoxItems(DstList).BeginUpdate;
  158.     try
  159.       I := 0;
  160.       while I < BoxItems(SrcList).Count do begin
  161.         if BoxGetSelected(SrcList, I) then begin
  162.           NewIndex := BoxItems(DstList).AddObject(BoxItems(SrcList).Strings[I],
  163.             BoxItems(SrcList).Objects[I]);
  164.           if (SrcList is TRxCheckListBox) and (DstList is TRxCheckListBox) then
  165.           begin
  166.             TRxCheckListBox(DstList).State[NewIndex] :=
  167.               TRxCheckListBox(SrcList).State[I];
  168.           end;
  169.           BoxItems(SrcList).Delete(I);
  170.         end
  171.         else Inc(I);
  172.       end;
  173.       BoxSetItem(SrcList, Index);
  174.     finally
  175.       BoxItems(SrcList).EndUpdate;
  176.       BoxItems(DstList).EndUpdate;
  177.     end;
  178.   end;
  179. end;
  180. procedure BoxMoveAllItems(SrcList, DstList: TWinControl);
  181. var
  182.   I, NewIndex: Integer;
  183. begin
  184.   for I := 0 to BoxItems(SrcList).Count - 1 do begin
  185.     NewIndex := BoxItems(DstList).AddObject(BoxItems(SrcList)[I],
  186.       BoxItems(SrcList).Objects[I]);
  187.     if (SrcList is TRxCheckListBox) and (DstList is TRxCheckListBox) then
  188.     begin
  189.       TRxCheckListBox(DstList).State[NewIndex] :=
  190.         TRxCheckListBox(SrcList).State[I];
  191.     end;
  192.   end;
  193.   BoxItems(SrcList).Clear;
  194.   BoxSetItem(SrcList, 0);
  195. end;
  196. function BoxCanDropItem(List: TWinControl; X, Y: Integer;
  197.   var DragIndex: Integer): Boolean;
  198. var
  199.   Focused: Integer;
  200. begin
  201.   Result := False;
  202.   if (BoxSelCount(List) = 1) or (not BoxMultiSelect(List)) then begin
  203.     Focused := BoxGetItemIndex(List);
  204.     if Focused <> LB_ERR then begin
  205.       DragIndex := BoxItemAtPos(List, Point(X, Y), True);
  206.       if (DragIndex >= 0) and (DragIndex <> Focused) then begin
  207.         Result := True;
  208.       end;
  209.     end;
  210.   end;
  211. end;
  212. procedure BoxDragOver(List: TWinControl; Source: TObject;
  213.   X, Y: Integer; State: TDragState; var Accept: Boolean; Sorted: Boolean);
  214. var
  215.   DragIndex: Integer;
  216.   R: TRect;
  217.   procedure DrawItemFocusRect(Idx: Integer);
  218. {$IFDEF WIN32}
  219.   var
  220.     P: TPoint;
  221.     DC: HDC;
  222. {$ENDIF}
  223.   begin
  224.     R := BoxItemRect(List, Idx);
  225. {$IFDEF WIN32}
  226.     P := List.ClientToScreen(R.TopLeft);
  227.     R := Bounds(P.X, P.Y, R.Right - R.Left, R.Bottom - R.Top);
  228.     DC := GetDC(0);
  229.     DrawFocusRect(DC, R);
  230.     ReleaseDC(0, DC);
  231. {$ELSE}
  232.     BoxGetCanvas(List).DrawFocusRect(R);
  233. {$ENDIF}
  234.   end;
  235. begin
  236.   if Source <> List then
  237.     Accept := (Source is TWinControl) or (Source is TRxCustomListBox)
  238.   else begin
  239.     if Sorted then Accept := False
  240.     else begin
  241.       Accept := BoxCanDropItem(List, X, Y, DragIndex);
  242.       if ((List.Tag - 1) = DragIndex) and (DragIndex >= 0) then begin
  243.         if State = dsDragLeave then begin
  244.           DrawItemFocusRect(List.Tag - 1);
  245.           List.Tag := 0;
  246.         end;
  247.       end
  248.       else begin
  249.         if List.Tag > 0 then DrawItemFocusRect(List.Tag - 1);
  250.         if DragIndex >= 0 then DrawItemFocusRect(DragIndex);
  251.         List.Tag := DragIndex + 1;
  252.       end;
  253.     end;
  254.   end;
  255. end;
  256. procedure BoxMoveFocusedItem(List: TWinControl; DstIndex: Integer);
  257. begin
  258.   if (DstIndex >= 0) and (DstIndex < BoxItems(List).Count) then
  259.     if (DstIndex <> BoxGetItemIndex(List)) then begin
  260.       BoxItems(List).Move(BoxGetItemIndex(List), DstIndex);
  261.       BoxSetItem(List, DstIndex);
  262.     end;
  263. end;
  264. end.