如何實現;鼠標進入一個動態生成的可視控件後對其操作(100分)

L

leway

Unregistered / Unconfirmed
GUEST, unregistred user!
我在程序運行期間在窗體動態生成了多個TLabel可視控件,然後我想用鼠標選中其中任意一個TLabel,逕行一些操作,比如想移動該TLabel的位置等操作.問題是如何獲的鼠標選中的可視控件.
 
你在创建的时候为每一个label的mousedown事件指定一个过程
onMousedown(Sender:TObject,....)(自己写的),
给每一个label的taborder指定一个不同的值,然后在onMousedown(Sender:TObject,....)
事件中你就可以得到Sender的taborder属性,根据这个属性你就知道是那个label了。
也可以根据name数据判断,就看你自己了
 
to:yanghai0437
label是在程序運行期間動態創建的,那如何在创建的时候为每一个label的mousedown事件指定一个过程
 
你先从TLabel里派生一个子类TMyLabel,然后在TMylabel事件写入处理代码。
然后你运态创建TmyLabel就可以了。
 
to:DDK
能否說詳細些。請舉例說明
 
...
private
{ Private declarations }
labno,lch,xh:integer;
p:tpoint;
moved:boolean;
lableft,labtop:integer;
procedure labmousedn(sender:tobject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure labmouseup(sender:tobject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure labmousemv(sender:tobject;Shift: TShiftState; X,
Y: Integer);
procedure labdbclick(sender:tobject);
public
{ Public declarations }
end;
...

procedure Tmodtab.BitBtn1Click(Sender: TObject);
var
lab:tlabel;
begin
lab:=tlabel.Create(scrollbox1);
lab.parent:=scrollbox1;
lab.Transparent:=true;
lab.Caption:='标签'+inttostr(labno);
lablist.Items.Add(lab.caption);
lablist.ItemIndex:=labno-1;
lab.Font.Color:=clred;
lab.Name:='lab'+inttostr(labno);
lab.Hint:=lab.Caption;
lab.ShowHint:=true;
lab.OnMouseDown:=labmousedn;//(sender,button,shift,x,y);
lab.OnMouseMove:=labmousemv;//(sender,shift,x,y);
lab.OnMouseUp:=labmouseup;//(sender,button,shift,x,y);
lab.OnDblClick:=labdbclick;
inc(labno);
end;
 
procedure Tmodtab.labmousedn(sender: tobject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
moved:=true;
getcursorpos(p);
clienttoscreen(p);
if sender is tlabel then
begin
lableft:=tlabel(sender).left;
labtop:=tlabel(sender).top;
end;
end;

procedure Tmodtab.labmouseup(sender: tobject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
moved:=false;
end;

procedure Tmodtab.labmousemv(sender: tobject;Shift: TShiftState; X,
Y: Integer);
var
lp:tpoint;
begin
if sender is tlabel then
begin
if moved then
begin
getcursorpos(lp);
clienttoscreen(lp);
tlabel(sender).left:=lableft+lp.x-p.x;
tlabel(sender).top:=labtop+lp.y-p.y;
lleft.Caption:=inttostr(tlabel(sender).left);
ltop.caption:=inttostr(tlabel(sender).top);
end;
end;
end;

 
to:南宫吹云
你的代碼對我很有用,謝謝。隻是有些地方不明白;
Tmodtab,TMouseButton ,TShiftState是什麼。
getcursorpos(p); clienttoscreen(p);分別是什麼意思。
 
Tmodtab,TMouseButton ,TShiftState是什麼。
getcursorpos(p); clienttoscreen(p);分別是什麼意思。

这些东西帮助上面全部都有啊,按一下F1,多省事!
 
lablist是什麼類型,是label鏈表嗎?
 
lablist是一个Tcombobox,是所有的标签列表

tmobtab是我的单元的名字,你可以和我的不一样,如TFORM1。
getcursorpos(p); 是得到当前鼠标的位置;
clienttoscreen(p);是将P转化为相对于屏幕的点。

TMouseButton ,TShiftState嘛,看一下帮助吧
 
to:南宫吹云
lleft,ltop怎麼沒有聲明,它們的類型是什麼。
 
to:南宫吹云
labdbclick沒有定義。請貼出過程定義。謝謝!我快大功告成了。
 
lleft,ltop是两个Lable,用来显示你正在移动的标签的位置的,如果你用不上,可以不用
labdbclick事件我是用来设置标签的字体的,也许你用不上,还是贴给你吧:
procedure Tmodtab.labdbclick(sender: tobject);
begin
if sender is tlabel then
begin
lleft.Caption:=inttostr(tlabel(sender).left);
ltop.caption:=inttostr(tlabel(sender).top);
if edit1.text<>'' then
begin
tlabel(sender).caption:=edit1.Text;
tlabel(sender).font:=panel1.font;
end
else edit1.SetFocus;
end;
end;

edit1用来输入标签的内容
panel用来显示示例字体

祝你好运。
 
to:all
謝謝!
 
顶部