2010-04-20 4 views

답변

11

모든 코드 실행이 끝나면 버튼을 삭제해야합니다. 이를 수행하는 표준 방법은 사용자 정의 메시지를 양식에 게시하고 양식에 해석 할 메시지 메소드를 제공하는 것입니다. 예를 들면 :

메시지가 윈도우의 메시지 큐에 넣어 도착하고 (버튼이 현재에 응답하는 클릭 메시지 포함)가 처리를 완료하기 전에 모든 때까지 나오지 않기 때문에이 작동
unit Unit1; 

interface 

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

const 
    WM_KILLCONTROL = WM_USER + 1; 

type 

    TForm1 = class(TForm) 
    Button1: TButton; 
    procedure Button1Click(Sender: TObject); 
    private 
    { Private declarations } 
    procedure KillControl(var message: TMessage); message WM_KILLCONTROL; 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

{ TForm1 } 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    PostMessage(self.Handle, WM_KILLCONTROL, 0, integer(Button1)) 
end; 

procedure TForm1.KillControl(var message: TMessage); 
var 
    control: TControl; 
begin 
    control := TObject(message.LParam) as TControl; 
    assert(control.Owner = self); 
    control.Free; 
end; 

end. 

.

+0

이것은 멋지게 작동했습니다. 감사합니다! "SendMessage"를 시도했지만 작동하지 않아서이 접근법을 포기했습니다. "PostMessage"가 트릭을 만들었습니다! – Pmmlr

+0

@Pmmlr : 예. SendMessage는 메시지를 즉시 처리하지만 PostMessage는 메시지 대기열에 메시지를 게시하므로 처리하기 전에 차례를 기다려야합니다. –

+4

@Pmmlr : 이것은 'procedure TForm.Release'가 델파이 1 이후에 해왔 던 것과 같은 방식입니다 :'PostMessage (Handle, CM_RELEASE, 0, 0);''TForm.CMRelease' 프로 시저와 함께 작동합니다. ','PostMessage'와'SendMessage'의 차이점을 아는 것이 중요합니다. 이것이 그것이 작동하는 이유입니다. 이 질문은 PostMessage에 대해 자세히 설명합니다. http://stackoverflow.com/questions/2551435/postmessage-tutorial –

0

대신 OnClick 이벤트에서 타이머를 활성화 한 다음 타이머 이벤트를 먼저 작성하여 타이머를 비활성화 한 다음 현재 OnClick 이벤트에서 호출중인 프로 시저를 호출 할 수 있습니다. 타이머를 사용하지 않도록 설정하고 짧은 시간 간격으로 설정하십시오.

관련 문제