问题描述如下:比如多组checkbox,类似
1   2   3
4   5   6
7   8   9
这样排列鼠标拖动时,能出现个方框
框中哪些checkbox时,其状态会checkbox.checked=not checkbox.checked跟开发时按住CTRL拖选控件一样的意思  

解决方案 »

  1.   

    记录鼠标开始位置和结束位置,然后循环判断checkbox是否在其中即可
      

  2.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        CheckBox1: TCheckBox;
        CheckBox2: TCheckBox;
        CheckBox3: TCheckBox;
        CheckBox4: TCheckBox;
        procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
        procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
          Shift: TShiftState; X, Y: Integer);
      private
        { Private declarations }
        x1,y1,x2,y2:Integer;    procedure SetCheck;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.SetCheck;
    var
      i:Integer;
    begin
      for i := 0 to Self.ComponentCount - 1 do
      begin
        if Self.Components[i] is TCheckBox then
        begin
          if (TCheckBox(Self.Components[i]).Left >x1) and (TCheckBox(Self.Components[i]).Left<x2) and (TCheckBox(Self.Components[i]).Top>y1) and (TCheckBox(Self.Components[i]).Top<y2) then
            TCheckBox(Self.Components[i]).Checked := True;
        end;
      end;
    end;procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      x1 := X;
      y1 := Y;
    end;procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
      x2 := X;
      y2 := Y;
      SetCheck;
    end;end.这里是在由左到右的拖动鼠标,如果由右到左的话,只需要做一点处理即可
      

  3.   

    谢谢了现在就差在panel里鼠标画框
    panel不支持Canvas.DrawFocusRect吗?fDrag:   Boolean;   
          fRect:   TRect;   
      procedure   TForm1.FormMouseDown(Sender:   TObject;   Button:   TMouseButton;   
          Shift:   TShiftState;   X,   Y:   Integer);   
      begin   
      if   Button   =   mbLeft   then   
          begin   
              fDrag:=   True;   
              SetCapture   (Handle);   
              fRect.Left   :=   X;   
              fRect.Top   :=   Y;   
              fRect.BottomRight   :=   fRect.TopLeft;   
              Canvas.DrawFocusRect   (fRect);   
          end;   
      end;   
        
      procedure   TForm1.FormMouseMove(Sender:   TObject;   Shift:   TShiftState;   X,   
          Y:   Integer);   
      begin   
          if   fDrag   then   
          begin   
              Canvas.DrawFocusRect   (fRect);   
              fRect.Right   :=   X;   
              fRect.Bottom   :=   Y;   
              Canvas.DrawFocusRect   (fRect);   
          end;   
      end;   
        
      procedure   TForm1.FormMouseUp(Sender:   TObject;   Button:   TMouseButton;   
          Shift:   TShiftState;   X,   Y:   Integer);   
      begin   
      if   fDrag   then   
          begin   
              ReleaseCapture;   
              fDrag   :=   False;   
              Invalidate;   
          end;   
      end;有个类似的但画出来的是在form上 不是在panel里
    本人愚笨 请高手解答 谢谢