以下代码是来自“ameken”的。问题是:如何实现Panel有鼠标触发焦点呢?就是能1格1格的点击。procedure TForm1.FormCreate(Sender: TObject);
  Var
   MyPanel : Array of TPanel;
   i,j,k: Integer;
begin
   SetLength(MyPanel,12);
   for i := 0 to 11 do
   begin
     MyPanel[i] := TPanel.Create(Self);
     MyPanel[i].Width := 130;
     MyPanel[i].Height:= 80;
     MyPanel[i].Parent:=self;
     j:=Trunc(i/4);  //取整  行
       K:=i mod 4 ;   //取余  列
       if i<4 then
       begin
         MyPanel[i].Top:=30;
         MyPanel[i].Left:=30+i*130;
       end else
       begin
         MyPanel[i].Top:=30+80*j;
         MyPanel[i].Left:=30+k*130;
       end;
   end;
end;

解决方案 »

  1.   

    方法如下
    写自定义MouseDown事件,比如MyMouseDown参数和panel的mousedown参数一致,然后在创建panel时把mousedown事件指向MyMouseDown事件procedure TForm1.FormCreate(Sender: TObject);
      Var
       MyPanel : Array of TPanel;
       i,j,k: Integer;
    begin
       SetLength(MyPanel,12);
       for i := 0 to 11 do
       begin
         MyPanel[i] := TPanel.Create(Self);
         MyPanel[i].Width := 130;
         MyPanel[i].Height:= 80;
         MyPanel[i].Parent:=self;
         MyPanel[i].OnMouseDown := MyMouseDown;  //加上设句话
         j:=Trunc(i/4);  //取整  行
           K:=i mod 4 ;   //取余  列
           if i<4 then
           begin
             MyPanel[i].Top:=30;
             MyPanel[i].Left:=30+i*130;
           end else
           begin
             MyPanel[i].Top:=30+80*j;
             MyPanel[i].Left:=30+k*130;
           end;
       end;
    end;
      

  2.   

    MyPanel[i].onclick := yourClickEventprocedure yourClickEvent(Sender: Tobject);
    begin
      //your code
    end;
      

  3.   

    MyMouseDown 的声明
    procedure MyMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
      

  4.   

    有触发焦点,也就是,按下的时候,将获得焦点的信息显示出来给别人看而已
    楼主可以重载他的paint方法,然后当鼠标按下的时候,将获得焦点变量设置成true
    然后invalidate区域
    这样,获得焦点的时候,界面重绘制,在上面画一个焦点框就可
      

  5.   


    谢谢suiyunonghen,能否给下代码参考。
      

  6.   


    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ExtCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Panel1: TPanel;
        procedure FormCreate(Sender: TObject);
        procedure MyPanelClick(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;
      MyPanel : Array of TPanel;
    implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    Var
       i,j,k: Integer;
    begin
       SetLength(MyPanel,12);
       for i := 0 to 11 do
       begin
         MyPanel[i] := TPanel.Create(Self);
         MyPanel[i].Width := 130;
         MyPanel[i].Height:= 80;
         MyPanel[i].Parent:=self;
         MyPanel[i].Tag:= i ; //用tag标识
         MyPanel[i].OnClick :=MyPanelClick; //赋予事件
         j:=Trunc(i/4);  //取整  行
           K:=i mod 4 ;   //取余  列
           if i<4 then
           begin
             MyPanel[i].Top:=30;
             MyPanel[i].Left:=30+i*130;
           end else
           begin
             MyPanel[i].Top:=30+80*j;
             MyPanel[i].Left:=30+k*130;
           end;
       end;
    end;procedure TForm1.MyPanelClick(Sender: TObject); //自己定义的事件
    Var
      i : Integer;
    begin
      i := TPanel(Sender).Tag;
      MyPanel[i].Caption:=IntToStr(i);
      ShowMessage(IntToStr(i));
    end;end.
    不知道是不是你想要的?
      

  7.   

    首先谢谢"ameken".不知道该怎么说,比如有两个button,单击他们后,就会出现那个焦点了.
    我想在Panel上实现这样的效果.上面的代码在Panel上触发到了,但是看不到触发的焦急.
      

  8.   

    画的样子,你参考我这个代码吧,这个就可以在Panel上弄一个焦点框了unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls;type
      TPanel = class(ExtCtrls.TPanel)
      protected
        procedure Paint;override;
        procedure WMLBtnDown(var msg: TWMLButtonDown);message WM_LBUTTONDOWN;
        procedure WMLostFocus(var msg: TMessage);message WM_KILLFOCUS;
      end;
      TForm2 = class(TForm)
        Panel1: TPanel;
        Panel2: TPanel;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form2: TForm2;implementation{$R *.dfm}procedure TForm2.FormCreate(Sender: TObject);
    beginend;{ TPanel }procedure TPanel.Paint;
    var
      r: TRect;
      c: TColor;
    begin
      inherited;
      if Focused then
      begin
        c := Canvas.Brush.Color;
        Canvas.Brush.Color := clYellow;
        r := ClientRect;
        r.Right := r.Right - BorderWidth - 1;
        r.Bottom := r.Bottom - BorderWidth - 1;
        Canvas.DrawFocusRect(r);
        Canvas.Brush.Color := c;
      end;
    end;procedure TPanel.WMLBtnDown(var msg: TWMLButtonDown);
    begin
      inherited;
      SetFocus;
      invalidate;
    end;procedure TPanel.WMLostFocus(var msg: TMessage);
    begin
      Invalidate;
    end;end.
      

  9.   


    谢谢不得闲,
    不是的,我想实现DBCtrlGrid那种焦点的效果.
      

  10.   

    DBCtrlGrid那种焦点的效果好像有一层颜色,然后带着焦点框.
      

  11.   


    在Paint中,你自己绘制啊,你想要什么效果都可以做出来的。把我那个代码扩充一下,应该就可以了
    贴图还是填充颜色,随便你怎样都行
      

  12.   

    对MyPanel数组中的每一个Panel指明一个tag,然后编一个事件,在事件中可根据tag值就可知道是哪一个小panel触发了事件。你如果知道我在说些什么,问题自然会迎刃而解。否则我哪么说也是对牛弹琴