안녕하십니까.
이전에 어플리케이션간 ( Pc내 ) 통신 질문을 하였습니다.
현재 write 부분과 read 부분을 Test를 하였습니다.
그리고 , component로 만들었는데요. component를 만들면서
event 방식으로 read를 할려고 합니다.
여러분도 알다시피 component는 form 이 없어서 form unit를 생성하고
여기에 timer를 만들어서 read 하는 procedure를 넣어서 실시간 check 한후
event 함수에 data를 넣습니다.
프로그램에서 component 제작후 event 를 보내는 부분은 아래와 같습니다.
///////////////////////////////
type
// Event Procedure
TMemMapReadMsg = procedure (Sender : Tobject; GetLpName : String; GetData : String) of object; //
TMemMapStateEvent = procedure (Sender : Tobject; GetLpName: String; GetErrorCode: String) of object;
TGgmIPCMemMap = class(TComponent)
private
{ Private declarations }
FOnGgmMemMapMsg : TMemMapReadMsg;
FOnMemMapRdEvent : TMemMapStateEvent;
procedure DoMemMapMsg(GetLpName : String; GetData : String); //바뀐 Data시 event 호출
procedure DoMemMapMsgEvent(GetLpName : String; GetErrorcode : String); //Error event 호출
// procedure fLpNameWriteList; // Write시 lpname list file -> FormCreat시 꼭 사용.
protected
{ Protected declarations }
....................
public
{ Public declarations }
procedure Open;
procedure mStart; // Write시 lpname 함수. ( lpname 당 handle 생성 )
procedure fLpNameReadList; // read시 lpname list file // 외부에서 못 읽어야 함.
procedure fLpNameWriteList; // Write시 lpname list file -> FormCreat시 꼭 사용.
procedure mWrite(GetLpName : String; GetWriteWord : String);
// Procedure mRead;
procedure RealData(GetLpname : String; GetData : String);
// procedure DoMemMapMsg(GetLpName : String; GetData : String); //바뀐 Data시 event 호출
// procedure DoMemMapMsgEvent(GetLpName : String; GetErrorcode : String); //Error event 호출
constructor Create(AOwner: Tcomponent) ; override;
destructor Destroy; override;
published
{ Published declarations }
property OnMemMapRdMsg : TMemMapReadMsg read FOnGgmMemMapMsg write FOnGgmMemMapMsg;
property OnMemMapRdEvent : TMemMapStateEvent read FOnMemMapRdEvent write FOnMemMapRdEvent;
end;
.........................................
procedure TGgmIPCMemMap.DoMemMapMsg(GetLpName : String; GetData : String);
begin
if Assigned(FOnGgmMemMapMsg) then // FOnGgmMemMapMsg
begin
FOnGgmMemMapMsg( Self,GetLpName, GetData);
end;
end;
procedure TGgmIPCMemMap.DoMemMapMsgEvent(GetLpName : String; GetErrorcode : String); //Error event 호출
begin
if Assigned(FOnMemMapRdEvent) then
begin
FOnMemMapRdEvent(Self, GetLpName, GetErrorcode);
end
end;
위와 같이 read 한 data가 있을 경우 DoMemMapMsg , DoMemMapMsgEvent procedure
를 호출하면 event가 발생합니다. 예전에 같은 방식으로 event 부분을 처리 하였는데 이번엔
이상하게 안됩니다. read 함수는 uses 한 form unit에서 timer에 넣었습니다.
그래서 혹시 프로그램 문제인가 해서 test 프로그램내에 component를 넣고 read를 test 프로그램
내 timer로 돌리면 event 가 제대로 됩니다. 그런데 component uses form의 timer에 read를
넣고 하면 event가 발생 안합니다.
부연 설명을 하자면,DoMemMapMsg , DoMemMapMsgEvent 함수에서 parameter GetLpname
과 GetErrorCode , GetData 에 Data 도 잘 들어 갑니다. 문제는 FOnGgmMemMapMsg, FOnMemMapRdEvent가 계속적으로 Nil 값이 들어갑니다. 그래서 안되는 거 같은데 해결 제가 좀 지식이 짧아서 잘 모르겠네요.
결과적으로 정리하면 FOnGgmMemMapMsg, FOnMemMapRdEvent 부분이 Nil로 지속되는 것인데
test 프로그램내에서 timer로 read를 하면 잘되고 component 에서 uses한 form unit내 timer로 하면
안됩니다. 해결 방법 부탁드립니다.
긴 내용을 읽어 주어서 감사합니다. ㅠㅠ
즐프~~ㅠㅠ