新手求助Panel的鼠标触发焦点问题

delphiers 2009-03-14 01:52:42
以下代码是来自“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;
...全文
255 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
delphiers 2009-03-31
  • 打赏
  • 举报
回复
好了揭帖了
ljluck7687 2009-03-24
  • 打赏
  • 举报
回复
对MyPanel数组中的每一个Panel指明一个tag,然后编一个事件,在事件中可根据tag值就可知道是哪一个小panel触发了事件。

你如果知道我在说些什么,问题自然会迎刃而解。否则我哪么说也是对牛弹琴
不得闲 2009-03-21
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 delphiers 的回复:]
DBCtrlGrid那种焦点的效果好像有一层颜色,然后带着焦点框.
[/Quote]

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

高手出招啊


delphiers 2009-03-19
  • 打赏
  • 举报
回复
DBCtrlGrid那种焦点的效果好像有一层颜色,然后带着焦点框.
delphiers 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 suiyunonghen 的回复:]
晕,代码帖给你了啊!
那个不是你要的效果?
[/Quote]

谢谢不得闲,
不是的,我想实现DBCtrlGrid那种焦点的效果.
不得闲 2009-03-19
  • 打赏
  • 举报
回复
晕,代码帖给你了啊!
那个不是你要的效果?
delphiers 2009-03-18
  • 打赏
  • 举报
回复
顶起来 高手出招啊
kye_jufei 2009-03-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 suiyunonghen 的回复:]
画的样子,你参考我这个代码吧,这个就可以在Panel上弄一个焦点框了

Delphi(Pascal) code
unit Unit2;

interface

uses
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…
[/Quote]
up
Dision LI 2009-03-16
  • 打赏
  • 举报
回复
学习了,不得闲的效果很好看
delphiers 2009-03-16
  • 打赏
  • 举报
回复
谢谢“suiyunonghen”
不得闲 2009-03-16
  • 打赏
  • 举报
回复
画的样子,你参考我这个代码吧,这个就可以在Panel上弄一个焦点框了

unit Unit2;

interface

uses
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);
begin

end;

{ 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.

delphiers 2009-03-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ameken 的回复:]
不知道是不是你想要的?
[/Quote]
首先谢谢"ameken".

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

Dision LI 2009-03-16
  • 打赏
  • 举报
回复

unit Unit1;

interface

uses
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.


不知道是不是你想要的?
delphiers 2009-03-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 suiyunonghen 的回复:]
有触发焦点,也就是,按下的时候,将获得焦点的信息显示出来给别人看而已
楼主可以重载他的paint方法,然后当鼠标按下的时候,将获得焦点变量设置成true
然后invalidate区域
这样,获得焦点的时候,界面重绘制,在上面画一个焦点框就可
[/Quote]

谢谢suiyunonghen,能否给下代码参考。
delphiers 2009-03-15
  • 打赏
  • 举报
回复
还不懂怎么做....楼上的各位阿兄帮忙写下行么!
lgx0914 2009-03-15
  • 打赏
  • 举报
回复
MyMouseDown 的声明
procedure MyMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
[Quote=引用 1 楼 bdmh 的回复:]
方法如下
写自定义MouseDown事件,比如MyMouseDown参数和panel的mousedown参数一致,然后在创建panel时把mousedown事件指向MyMouseDown事件

Delphi(Pascal) code
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 := 1…
[/Quote]
不得闲 2009-03-15
  • 打赏
  • 举报
回复
有触发焦点,也就是,按下的时候,将获得焦点的信息显示出来给别人看而已
楼主可以重载他的paint方法,然后当鼠标按下的时候,将获得焦点变量设置成true
然后invalidate区域
这样,获得焦点的时候,界面重绘制,在上面画一个焦点框就可
delphiers 2009-03-14
  • 打赏
  • 举报
回复
顶起来
金卯刀 2009-03-14
  • 打赏
  • 举报
回复
MyPanel[i].onclick := yourClickEvent

procedure yourClickEvent(Sender: Tobject);
begin
//your code
end;
加载更多回复(1)

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧