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.