新手求助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;
...全文
244 21 打赏 收藏 转发到动态 举报
写回复
用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)
最新版本的jQuery EasyUI 1.3.6版全中文API汉化文档火热出炉,由于很多人和我要chm格式的,所以本次API我提供了2种版本的API,一个还是以前的EXE格式,另外一个就是人气颇高的chm格式。本次还将EasyUI 1.3.6版直接提供到API包里面,方便没有去官网下载的人直接使用。请大家持续关注我发布的资源,不出意外,我是会一直持续更新本API文档的。本次更新内容大约有30个,Bug修复的只有2个,剩下的全是新增内容,EasyUI的控件已经越来越好用了,顶一个。但是希望能把性能也提升提升,总是感觉在某些情况下EasyUI的性能不是太好。具体更新内容请看下面的说明: jQuery EasyUI 1.3.6版本更新内容: Bug(修复) treegrid:修复“getChecked”方法不能正确的返回被选择的行的问题; tree:修复在“onlyLeafCheck”属性为true时,复选框无法在异步树种正确显示的问题。 Improvement(改进) treegrid:所有的选择和选中的方法都扩展自datagrid组件; linkbutton:添加图标对齐功能的完整支持,可用值有:“top”、“bottom”、“left”、“right”; linkbutton:添加“size”属性,可用值有:“small”、“large”; linkbutton:添加“onClick”事件; menubutton:添加“menuAlign”属性,该属性允许用户设置顶级菜单对齐; combo:添加“panelAlign”属性,可用值有:“left”、“right”; calendar:添加“formatter”、“styler”和“validator”属性,这些属性允许用于自定义日历日期; calendar:添加“onChange”事件; panel:添加“method”、“queryParams”和“loader”选项; panel:添加“onLoadError”事件; datagrid:添加“onBeginEdit”事件,该事件在一个行进入编辑模式时触发; datagrid:添加“onEndEdit”事件,该事件在完成编辑但是编辑器尚未销毁之前触发; datagrid:添加“sort”方法和“onBeforeSortColumn”事件; datagrid:将“combogrid”编辑器集成到datagrid中; datagrid:添加“ctrlSelect”属性,在启用多行选择的时候允许使用Ctrl键+鼠标点击的方式进行多选操作; slider:添加“converter”属性,该属性允许用户决定如何将一个值转换为进度条位置或进度条位置值; searchbox:添加“disabled”属性; searchbox:添加“disable”、“enable”、“clear”、“reset”方法; spinner:添加“readonly”属性、“readonly”方法和“onChange”事件。
大家好,又见面了!EasyUI又更新了,这次更新内容还是不少的,具体内容请参考下面的更新说明,官方的更新说明中还少了1条,我给补上了。 jQuery EasyUI 1.3.5版本更新内容: Bug(修复) searchbox:修复“searcher”函数提供的“name”参数值错误的问题; combo:修复“isValid”方法无法返回布尔值的问题; combo:修复点击页面某一个combo组件的下拉列表时触发的“onHidePanel”事件会导致页面上其他combo组件的下拉列表被关闭的问题; combogrid:修复某些从combo组件继承来的方法无法使用的问题。 Improvement(改进) datagrid:改进检查行时候的性能; menu:允许追加菜单分隔符; menu:新增“hideOnUnHover”属性用于在鼠标离开菜单的时候指示是否需要隐藏菜单; slider:新增“clear”和“reset”方法; tabs:新增“unselect”方法、“onUnselect”事件; tabs:新增“selected”属性,用于指定的默认打开的面板; tabs:Tab Panel(Tab页)新增“collapsible”属性,用于设置是否允许摺叠面板; tabs:新增“showHeader”属性、“showHeader”方法和“hideHeader”方法; combobox:允许“disabled”属性禁用下拉列表选项; tree:改进数据加载时候的性能; pagination:新增“layout”属性,用于自定义控件的样式布局; accordion:新增“unselect”方法、“onUnselect”事件; accordion:新增“select”和“multiple”属性; accordion:新增“getSelections”方法; datebox:新增“sharedCalendar”属性,允许多个datebox控件共享使用同一个calendar控件。 datebox:新增“buttons”属性,用于自定义日历下方的按钮。 (译者注:该点更新内容官方更新公告上没有注明,具体内容和用法请看datebox的API。) 历史版本: - jQuery EasyUI 1.3.4 离线API简体中文版 http://download.csdn.net/detail/richie696/6302785 - jQuery EasyUI 1.3.4 离线API简体中文版 http://download.csdn.net/detail/richie696/5363933

5,388

社区成员

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

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