動的に作成したImageを削除するには

解決


Delphi初心者  2006-04-27 09:28:18  No: 21216

表題の通り動的に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;


えーと  2006-04-27 12:14:01  No: 21217

動的に作成したコンポは自分のイベントハンドラのなかで 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;


Delphi初心者  2006-04-28 08:14:03  No: 21218

返信ありがとうございます。
えーとさんのおかげで思い通りの動作が出来ました。
ありがとうございました。

ちなみにちょっとお聞きしたいのですが、メッセージコードが「WM_APP+100」となっていますが、「WM_APP」だけでもいいのですか?
100をプラスしている理由とかありますか?

WM_APP(0x8000)〜0xBFFF:Windows で将来のため予約(システム定義と衝突する心配がないので安心)


えーと  2006-04-29 02:43:20  No: 21219

> 100をプラスしている理由とかありますか?

衝突がなければなんでもいいです。


Delphi初心者  2006-04-29 09:09:56  No: 21220

そうですか。わかりました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加