버튼이 있습니다. 해당 OnClick 이벤트는 단추를 파괴하는 프로 시저를 호출하지만 "스레드"가 OnClick 이벤트로 돌아가려고하면 액세스 위반이 발생합니다.상기 객체에 의해 호출 된 이벤트 동안 객체를 파기하십시오.
나는 완전히 뒤죽박죽이다!
버튼이 있습니다. 해당 OnClick 이벤트는 단추를 파괴하는 프로 시저를 호출하지만 "스레드"가 OnClick 이벤트로 돌아가려고하면 액세스 위반이 발생합니다.상기 객체에 의해 호출 된 이벤트 동안 객체를 파기하십시오.
나는 완전히 뒤죽박죽이다!
모든 코드 실행이 끝나면 버튼을 삭제해야합니다. 이를 수행하는 표준 방법은 사용자 정의 메시지를 양식에 게시하고 양식에 해석 할 메시지 메소드를 제공하는 것입니다. 예를 들면 :
메시지가 윈도우의 메시지 큐에 넣어 도착하고 (버튼이 현재에 응답하는 클릭 메시지 포함)가 처리를 완료하기 전에 모든 때까지 나오지 않기 때문에이 작동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.
.
대신 OnClick 이벤트에서 타이머를 활성화 한 다음 타이머 이벤트를 먼저 작성하여 타이머를 비활성화 한 다음 현재 OnClick 이벤트에서 호출중인 프로 시저를 호출 할 수 있습니다. 타이머를 사용하지 않도록 설정하고 짧은 시간 간격으로 설정하십시오.
이것은 멋지게 작동했습니다. 감사합니다! "SendMessage"를 시도했지만 작동하지 않아서이 접근법을 포기했습니다. "PostMessage"가 트릭을 만들었습니다! – Pmmlr
@Pmmlr : 예. SendMessage는 메시지를 즉시 처리하지만 PostMessage는 메시지 대기열에 메시지를 게시하므로 처리하기 전에 차례를 기다려야합니다. –
@Pmmlr : 이것은 'procedure TForm.Release'가 델파이 1 이후에 해왔 던 것과 같은 방식입니다 :'PostMessage (Handle, CM_RELEASE, 0, 0);''TForm.CMRelease' 프로 시저와 함께 작동합니다. ','PostMessage'와'SendMessage'의 차이점을 아는 것이 중요합니다. 이것이 그것이 작동하는 이유입니다. 이 질문은 PostMessage에 대해 자세히 설명합니다. http://stackoverflow.com/questions/2551435/postmessage-tutorial –