表題の通り動的にImageを作成して、作成したImageをクリック時に
そのImageを削除するプログラムを作成したいのですが
エラーが出て削除することが出来ません。
やはり自分自身をクリック時に自分自身を削除することは出来ないのですか?
デバッグで追ってみると「DoMouseUp(Message, mbLeft);」で落ちているようなのですが・・・。
procedure TForm1.FormCreate(Sender: TObject);
begin
i := 1;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
objImage := TImage.Create(Self);
with objImage do begin
Parent := Form1;
Name := 'Image' + IntToStr(i);
Caption := 'Image' + IntToStr(i);
Height := 30;
Width := 30;
Top := 2;
Left := i * 40;
Tag := i;
OnClick := ImageClick;
Canvas.Brush.Color := clWhite;
Canvas.Font.Style :=[fsBold];
Canvas.TextOut(10, 10, '画');
end;
i := i + 1;
end;
procedure TForm1.ImageClick(Sender: TObject);
var
pnt : Pointer;
begin
pnt := FindComponent('Image' + IntToStr((Sender as TImage).Tag));
TImage(pnt).Free;
end;
動的に作成したコンポは自分のイベントハンドラのなかで Free するとエラーになります。
PostMessage() をつかって遅延するとうまくいきます。
{ Private 宣言 }
public
procedure ImageClick(Sender: TObject);
procedure WMApp100(var msg: TMessage); message WM_APP + 100;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
img: TImage;
begin
img := TImage.Create(self);
with img do
begin
Parent := self;
Height := 30;
Width := 30;
Top := 2;
Left := 10;
OnClick := ImageClick;
Canvas.Brush.Color := clWhite;
Canvas.Font.Style :=[fsBold];
Canvas.TextOut(10, 10, '画');
end;
end;
procedure TForm1.ImageClick(Sender: TObject);
begin
PostMessage(Handle, WM_APP+100, WParam(Sender), 0);
end;
procedure TForm1.WMApp100(var msg: TMessage);
var
obj: TObject;
begin
obj := TObject(msg.WParam);
if obj is TImage then obj.Free;
end;
返信ありがとうございます。
えーとさんのおかげで思い通りの動作が出来ました。
ありがとうございました。
ちなみにちょっとお聞きしたいのですが、メッセージコードが「WM_APP+100」となっていますが、「WM_APP」だけでもいいのですか?
100をプラスしている理由とかありますか?
WM_APP(0x8000)〜0xBFFF:Windows で将来のため予約(システム定義と衝突する心配がないので安心)
> 100をプラスしている理由とかありますか?
衝突がなければなんでもいいです。
そうですか。わかりました。
ありがとうございました。
ツイート | ![]() |