怎样知道点击了哪一个panel?(100)

  • 主题发起人 主题发起人 tsxq
  • 开始时间 开始时间
T

tsxq

Unregistered / Unconfirmed
GUEST, unregistred user!
动态生成了一组panel(数组)控件,程序中需要用鼠标拖动某一个panel,现在我需要把被移动的panel的名字传递到进行拖动的过程中去。找了几天的资料都没成功,请各位大侠指教!
 
procedure TForm1.Panel1Click(Sender: TObject);begin ShowMessage(TPanel(Sender).Name);end;
 
动态声称的panel有名字吗? 你要自己加吧....不如用handle来识别..
 
谢谢!问题在于,程序运行中并不知道点击的是Panel1,而可能是Mypanel,总不至于给每个Mypanel设置一个Click吧?
 
to:hs-kill可否详细给几句例子?谢谢!
 
我说的东西和你的问题关系不大,其实睢志强已经解决了你的问题var panellist:array of panel;... setlength(panellist,10);...procedure TForm1.tmppanelclick(Sender:TObject);begin caption:=TPanel(Sender).name;// caption:=inttostr(TPanel(Sender).handle); //因为不知道你取名字要做什么用,而动态生成的组件是没有名字的,所以一般都用handle来区分end;var i:integer; tmpp:tpanel;begin for i:=0 to length(panellist)-1 do begin panellist:=tpanel.create(self); panellist.name:='TmpPanel'+inttostr(i); //这里要手动指定名字,不过小心会和已存在的组件重名 panellist.onclick:=tmppanelclick; //这样点击panel时就能知道其名字了 panellist.parent:=self; end;end;
 
至少要写一个事件吧,比如:单击事件。让动态生成的组件的单击事件都指向这个事件。在事件中判断Sender就可以了。
 
来自:tsxq, 时间:2009-1-6 17:40:00, ID:3938584谢谢!问题在于,程序运行中并不知道点击的是Panel1,而可能是Mypanel,总不至于给每个Mypanel设置一个Click吧? 动态生成时候直接设置 Mypanel.onclick := PanelClick;喜欢取Name 就取 Name 喜欢取 handle 就取 handle
 
你在創建的時候直接把所有的動態創建出來的panel 控件的 onclick 事件代理到同一個事件不就可以了~~~~~~
 
unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } procedure myClick(Sender: TObject); end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.myClick(Sender: TObject);begin ShowMessage(TPanel(Sender).Caption);end;procedure TForm1.Button1Click(Sender: TObject);var i : integer;begin for i := 1 to 4 do begin with TPanel.Create(nil) do begin Caption := 'и琌材' + inttostr(i) +'?'; SetBounds(100*i,50,100,30); Parent := Form1; OnClick := myClick; end; end;end;end.
 
其实楼上的基本都已经能处理楼主的问题了,我也贴一个以前学习的代码让楼主参考一下unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForm1 = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); procedure MyButClick(Sender: TObject); private MyBut:Array of Tbutton; { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.MyButClick(Sender: TObject);beginshowmessage(format('%s%d%s',['你点的是第:',Tbutton(Sender).tag,'个按钮']));end;procedure TForm1.Button1Click(Sender: TObject);var i:Integer;begin Setlength(MyBut,3); for i :=0 to 2 do begin Mybut:=Tbutton.Create(self); with Mybut do begin Caption:=Format('%s%d',['MyBut',i]); Parent:=self; Top:=i*26; Tag:=i; OnClick:=MyButClick; end; end;end;end.对于要自定义标识的控件,我一般会使用Tag属性,因为有时候我动态创建的控件可能需要显示Caption,或是需要使用Name属生,所以自定义时我习惯用Tag属性
 
谢谢各位如此热心!我的panel要能被拖动,在动态创建时它们的MouseDown都指向procedure TForm1.PanelZMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);var c:Tcomponent;const SC_DragMove = $F012; { a magic number }begin ReleaseCapture;// c:=TImage(Sender).Parent; (C as TPANEL).perform(WM_SysCommand, SC_DragMove, 0);end;"(C as TPANEL)"实际上是将被拖动的panel,我想通过一个事件,在点击的panel后,直接用一个全局panel变量(MyP)代替,上面的语句就可以改成"MyP.perform(WM_SysCommand, SC_DragMove, 0);在运行中避免出错。因为每次程序运行到"c:=TImage……"就出错。假如点击的是Mypanel[5],我希望能自动识别后得到:MyP:=Mypanel[5];然后用上面的PanelZMouseDown,达到拖动Mypanel[5].对不起各位,我没有先讲清问题,耽误大家时间,还得请各位再帮忙。谢谢!
 
procedure TForm1.myClick(Sender: TObject);begin ShowMessage(TPanel(Sender).Caption);end;直接用Sender 不就得了 ~~~~
 
我顶~~~~ 你还 c:=TImage(Sender).Parent; 你用一个TImage类来 强制转换一个TPanel 的类 ,这不是找死的嘛~~~
 
我也不太明白你想干什么var CurrentPanel: TPanel; //全局变量procedure TForm1.PanelZMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);const SC_DragMove = $F012; { a magic number }begin ReleaseCapture; CurrentPanel := TPanel(Sender); CurrentPanel.perform(WM_SysCommand, SC_DragMove, 0);end;这样不就把Panel赋给全局变量了?没这么简单吧?
 
??? 没看明白 叶不归 最后说的意思 ~~~~~你是反语还是~~~~~~~
 
-_- 不是反语,就是这么简单但是不知道楼主到底是不是想这么做....全局变量实在是没必要
 
谢谢叶不归。你的做法是我最后的做法。我是在睢志强的提示后改过来的。昨天已经分配了积分,好像没被服务器接受,害大家还在讨论。补:我的目的是在程序运行时,动态生成了一组panel,每个panel可以被任意拖动。用于将常规试卷中的连线题改成电子试卷(把连红改成拖动panel).再次谢谢各位。
 
你是不是这个意思?unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;type TForm1 = class(TForm) Button1: TButton; ScrollBox1: TScrollBox; procedure CreatePanels(Sender: TObject); procedure MyPanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end;var Form1: TForm1;implementation{$R *.dfm}procedure TForm1.CreatePanels(Sender: TObject);Var i : Integer; CreateOwner : TWinControl;begin //创建到哪个容器 CreateOwner := ScrollBox1; //创建Panel For i := 0 to 9 do begin with TPanel.Create(CreateOwner) do begin //属性 Name := Format('MyPanel%d',); Caption := Name; left := i * 5; Top := i * 5; Width := 100; Height := 30; Parent := CreateOwner; //事件 OnMouseDown := MyPanelMouseDown; end; end;end;procedure TForm1.MyPanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);const SC_DRAGMOVE = SC_MOVE + 2;begin ReleaseCapture; PostMessage(TWinControl(Sender).Handle, WM_SYSCOMMAND, SC_DRAGMOVE,0);end;procedure TForm1.FormCreate(Sender: TObject);begin ScrollBox1.HorzScrollBar.Tracking := True; ScrollBox1.VertScrollBar.Tracking := True;end;end.
 
后退
顶部