Delphi动态创建多个image的绘图后,之前绘图的image无法右键操作

Delphi动态创建多个image的绘图后,连接动态创建的右键菜单。创建的最后一个image可以使用右键菜单,但之前绘图的image无法右键操作。该如何解决

要贴出你的代码来,检查下你是否正确处理了sender参数。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, Buttons, ExtCtrls;

type
TForm1 = class(TForm)
pnl1: TPanel;
btn1: TBitBtn;
btn2: TBitBtn;
btn3: TBitBtn;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
procedure FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);

private
{ Private declarations }
procedure imageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure imageMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure imageMouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
procedure moveclick(Sender: TObject);
procedure delclick(Sender: TObject);
public
{ Public declarations }

end;

var
Form1: TForm1;
del,flag,CanMove : boolean;
X1, Y1 ,k,index: integer;
Image:TImage;
imagelist1:TImageList;
n:array of Integer;
implementation

{$R *.dfm}
{$B-}
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.DoubleBuffered:=True;
SetLength(n,14);
flag:=False;
del:=False;
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
i:integer;
begin
try
for i:=0 to self.ComponentCount-1 do
begin
if self.Components[i] is TImage then
TImage(self.Components[i]).Free;
end;
except
exit;
end;
end;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
BMP:TBitmap;
pt:TPoint;
r:Integer;
str:string;
pm: TPopupMenu;

begin
if Button=mbLeft then
begin
Image:=TImage.Create(nil);
Image.parent :=Self;
BMP:=TBitmap.Create;
BMP.Transparent:=True;
BMP.Height:=Image.Height;
BMP.Width:=Image.Width;
Canvas.Pen.Color := clBlack;
if k=1 then
begin
n[1]:=n[1]+1;
r:=16;
BMP.Canvas.Ellipse(33-r,30-r,33+r,30+r);
BMP.Canvas.Pen.Color := clBlack;
BMP.Canvas.Brush.Color:=clWhite;

   BMP.Canvas.Font.Size := 15;
   BMP.Canvas.TextOut(27,20,'T');
   BMP.Canvas.MoveTo(19,43);
   BMP.Canvas.LineTo(8,55);
   BMP.Canvas.MoveTo(49,43);
   BMP.Canvas.LineTo(58,55);
  BMP.Canvas.Rectangle(58,55,8,70);
  BMP.Canvas.Font.Size := 8;
   BMP.Canvas.TextOut(18,56,'D O Y');
  BMP.Canvas.Font.Size :=5;
  str:=IntToStr(n[1]);
  BMP.Canvas.TextOut(28,71,str);
  Image.Picture.Assign(BMP);
  Image.Show;
  Image.Width:=70;
  Image.Height:=85;
  Image.Left := x-30;
  Image.Top := y-40;


 end;
 if k=2 then
 begin
   BMP.Canvas.Pen.Color:=clRed;
  BMP.Canvas.Pen.Width:=2;
 BMP.Canvas.Pen.Mode:=pmNot;
  BMP.Canvas.Polyline([Point(35,40),Point(20,35),Point(20,45),Point(35,40)]);
  BMP.Canvas.Polyline([Point(35,40),Point(50,35),Point(50,45),Point(35,40)]);

  BMP.Canvas.MoveTo(20,40);   BMP.Canvas.LineTo(10,40);
  BMP.Canvas.MoveTo(50,40);   BMP.Canvas.LineTo(60,40);
  BMP.Canvas.MoveTo(25,25);   BMP.Canvas.LineTo(45,55);
  Image.Picture.Assign(BMP);
  Image.Show;
  Image.Width:=70;
  Image.Height:=70;
  Image.Left := x-30;
  Image.Top := y-30;
 end;
  if k=3 then
  begin
    MoveToEx(Canvas.Handle, x, y, nil);
  end;

end;
if button = mbright then
begin
if k=1 then
begin
pm:= TPopupMenu.Create(self);
pm.Items.Add(NewItem('move',0,False,True,moveclick,0,'m1'));
pm.Items.Add(NewItem('delete',0,False,True,delclick,0,'m2'));
pt.X:=Image.Left;
pt.Y:=Image.Top+Image.Height;
pt:=ClientToScreen(pt) ;
TrackPopupMenu(pm.Handle, TPM_LEFTALIGN + TPM_LEFTBUTTON + TPM_RETURNCMD,
pt.x, pt.y, 0, Handle, nil);
Image.PopupMenu:=pm;

   Image.OnMouseUp:= imageMouseUp;
    Image.OnMouseMove:=imageMouseMove;
    Image.OnMouseDown:= imageMouseDown;

   end;


end;

end;

procedure TForm1.imageMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
CanMove := True;
X1 := X;
Y1 := Y;

end;

procedure TForm1.imageMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
CanMove := False;
flag:=False;
end;

procedure TForm1.imageMouseMove(Sender: TObject;Shift: TShiftState; X, Y: Integer);
begin
if CanMove and flag then
begin
with TImage(Sender) do
begin
Left := Left + (X - X1);
Top := Top + (Y - Y1);
end;

end;

end;

procedure TForm1.moveclick(Sender: TObject);
begin
flag:=True;

end;

procedure TForm1.delclick(Sender:TObject);

begin
del:=True;
Image.Free;
del:=False;
if k=1 then
n[1]:=n[1]-1;
end;
procedure TForm1.btn1Click(Sender: TObject);
begin
k:=1;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
k:=2
end;

procedure TForm1.btn3Click(Sender: TObject);
begin
k:=3;
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if k=3 then
begin
Canvas.Pen.Color := clBlack;
LineTo(Canvas.Handle, x, y);
end;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if k=3 then
begin
Canvas.Pen.Color := clBlack;
MoveToEx(Canvas.Handle, x, y, nil) ;
end;
end;

end.