问题:动态创建了多个可视组件TImage并存到数组Array[i]中后,要为这些动态控件指定onmousemove事件,按照一般的方法,就是先定义一个函数,然后在创建TImage控件的时候直接指定onmousemove事件,但是我如何判断出是哪个控件的事件呢!
if ADOQuery1.FieldByName('xttpmc').AsString<>'' then
begin
//-------------------动态创建图片控件,并显示出子系统图片------------------------
ArrSubImage[i] := Timage.Create(self);
ArrSubImage[i].Parent := self.Image14.Parent;
ArrSubImage[i].Name :='JcSubImage'+inttostr(i);
ArrSubImage[i].Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+ADOQuery1.FieldByName('xttpmc').AsString);
ArrSubImage[i].Top := ADOQuery1.FieldByName('tpX').AsInteger;
ArrSubImage[i].left := ADOQuery1.FieldByName('tpY').AsInteger;
ArrSubImage[i].OnDblClick := FunDbClick;
ArrSubImage[i].OnMouseDown := FunMouseDown; //鼠标 OnMouseDown事件
ArrSubImage[i].OnMouseMove := FunMouseMove; //鼠标移动事件
i:=i+1;
ADOQuery1.Next;
end;(***************鼠标移动事件**** //请问ArrSubImage[i]是那个对象我该确定************)
procedure TMainWindow.FunMouseMove(Sender: TObject; Shift :TShiftState; x,y: Integer);
var iDeltaX,iDeltaY:integer;
begin
if ssLeft in Shift then
begin
iDeltaX:=X-iX;
iDeltaY:=Y-iY;
if iDeltaX<>0 then
ArrSubImage[i].Left:=ArrSubImage[i].Left+iDeltaX;
//请问ArrSubImage[i]是那个对象我该如何传递参数过来
if iDeltaY<>0 then
ArrSubImage[i].Top:=ArrSubImage[i].Top+iDeltaY;
end;
end;
if ADOQuery1.FieldByName('xttpmc').AsString<>'' then
begin
//-------------------动态创建图片控件,并显示出子系统图片------------------------
ArrSubImage[i] := Timage.Create(self);
ArrSubImage[i].Parent := self.Image14.Parent;
ArrSubImage[i].Name :='JcSubImage'+inttostr(i);
ArrSubImage[i].Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+ADOQuery1.FieldByName('xttpmc').AsString);
ArrSubImage[i].Top := ADOQuery1.FieldByName('tpX').AsInteger;
ArrSubImage[i].left := ADOQuery1.FieldByName('tpY').AsInteger;
ArrSubImage[i].OnDblClick := FunDbClick;
ArrSubImage[i].OnMouseDown := FunMouseDown; //鼠标 OnMouseDown事件
ArrSubImage[i].OnMouseMove := FunMouseMove; //鼠标移动事件
i:=i+1;
ADOQuery1.Next;
end;(***************鼠标移动事件**** //请问ArrSubImage[i]是那个对象我该确定************)
procedure TMainWindow.FunMouseMove(Sender: TObject; Shift :TShiftState; x,y: Integer);
var iDeltaX,iDeltaY:integer;
begin
if ssLeft in Shift then
begin
iDeltaX:=X-iX;
iDeltaY:=Y-iY;
if iDeltaX<>0 then
ArrSubImage[i].Left:=ArrSubImage[i].Left+iDeltaX;
//请问ArrSubImage[i]是那个对象我该如何传递参数过来
if iDeltaY<>0 then
ArrSubImage[i].Top:=ArrSubImage[i].Top+iDeltaY;
end;
end;
FunMouseMove(Sender: TObject; Shift :TShiftState; x,y: Integer)
这样调用方法和定义的方法不一致哦
把ArrSubImage[i]作为参数传入方法FunMouseMove中。
begin
iDeltaX:=X-iX;
iDeltaY:=Y-iY;
if iDeltaX < >0 then
if Sender = TImage then
TImage(Sender).Left:=TImage(Sender).Left+iDeltaX;
//请问ArrSubImage[i]是那个对象我该如何传递参数过来
if iDeltaY < >0 then
if Sender = TImage then
TImage(Sender).Top:=TImage(Sender).Top+iDeltaY;
end;
var iDeltaX,iDeltaY:integer;
var Img :TImage;
begin
if not (sender is TImage) then exit;
Img := TImage(Sender);
ShowMessage(Img.Name);//这里可以弹出image的name属性值
if ssLeft in Shift then
begin
iDeltaX:=X-iX;
iDeltaY:=Y-iY;
if iDeltaX < >0 then
ArrSubImage[i].Left:=ArrSubImage[i].Left+iDeltaX;
//请问ArrSubImage[i]是那个对象我该如何传递参数过来
if iDeltaY < >0 then
ArrSubImage[i].Top:=ArrSubImage[i].Top+iDeltaY;
end;
end;
var iDeltaX,iDeltaY:integer;
var Img :TImage;
begin
if not (sender is TImage) then exit;
Img := TImage(Sender);
ShowMessage(Img.Name);//这里可以弹出image的name属性值
后面应该改成
if ssLeft in Shift then
begin
iDeltaX:=X-iX;
iDeltaY:=Y-iY;
if iDeltaX < >0 then
Img.Left:=Img.Left+iDeltaX;
//请问ArrSubImage[i]是那个对象我该如何传递参数过来
if iDeltaY < >0 then
Img.Top:=Img.Top+iDeltaY;
end;
end;