문제

사용자가 dbgrid를 두 번 클릭하면 비 모달 양식을 표시합니다.

그들이 그 형태를 닫으면 그리드를 새로 고치고 싶습니다.

이를 달성하기 위해 다음을 시도했습니다.

1- 사용자 정의 메시지 상수 정의 :

const
  WM_REFRESH_MSG = WM_USER + 1;  //defined in a globally available unit

2- 비 모달 형태의 온 클로스 이벤트에서는 다음과 같습니다.

procedure TMyNonModalForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  PostMessage(Self.Handle,WM_REFRESH_MSG,0,0);
end;

3- DBGrid를 보유한 양식의 개인 선언에서 다음과 같습니다.

procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;

...

procedure TMyFormWithADBGrid.OnRefreshRequest(var Msg: TMessage);
begin
  RefreshGrid;
end;

이런 일을 한 후에는 사후 관리가 잘 발사되지만 onrefreshrequest 절차는 결코 실행되지 않습니다. 내가 뭘 잘못하고 있죠?

도움이 되었습니까?

해결책

다른 답변의 메시지 이름 외에도 Self.handle에 메시지를 게시합니다. 당신은 아마도 다른 손잡이 (모드가없는 창을 시작한 창)에 게시하려고했을 것입니다. Modeless Window를 만들 때 해당 핸들에 액세스하고 대신 메시지를 게시하십시오.

다른 팁

WM_USER는 TwinControl에서 직접 내려 오는 사용자 정의 컨트롤을 작성하지 않는 한 자신의 메시지를 기반으로하는 올바른 상수가 아닙니다. 대신 wm_app를 사용하십시오.

또한 접두사는 Windows 헤더 파일에 예약되어 있어야하기 때문에 WM_ 대신 사용자 메시지에 UM_를 사용하는 것이 좋은 스타일로 간주됩니다.

게시물 메시지는 나열된 Self.handle이 아닌 다른 창 핸들로 보내야합니다. 이를 수행하는 한 가지 방법은 비 모달 양식에 새 속성을 만들고 비 모달을 보여주기 직전에 다른 양식의 핸들을 할당하는 것입니다.

그 외에는 WM_Refresh_MSG를 올바르게 구현하는 데 제대로 작동해야합니다.

보내려고하는 메시지와 일치하도록 선언 끝을 변경하려고 시도 할 수 있습니다.

procedure OnRefreshRequest(var Msg: TMessage); message WM_CEA_REFRESH;

이것이어야합니다

procedure OnRefreshRequest(var Msg: TMessage); message WM_REFRESH_MSG;

"Kevin은 무엇을할까요?"의 예를 올렸습니다. EMBARCADERO의 뉴스 그룹 포럼 ENMARCADERO.public.attachments.

기본적으로 비 모달 양식이 닫힐 때 기본 형식 (또는 원하는 양식/객체)이 구독하는 사용자 정의 이벤트입니다. 메인 (또는 무엇이든) 형태로 ...

var
  NonModalForm :TfmNonModalForm;
begin
  NonModalForm := TfmNonModalForm.Create(nil); 
  NonModalForm.Execute(NonModalFormClosingListener);

실행 방법에서

procedure TfmNonModalForm.Execute(YourListenerMethod: THeyIClosedEvent);
begin
   FHeyIClosedEvent := YourListenerMethod;
   Show();
end;

포럼에 도달 할 수없고 추가 코드가 필요한 경우 의견을 남겨 주시면 누락 된 부분을 게시하겠습니다.

행운을 빕니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top