2013-01-15 6 views
1

서버 클라이언트 구성 요소를 사용하고이 구성 요소의 TransferFile 이벤트에서 파일을 수신 할 때 경고 메시지 구성 요소를 사용합니다. 따라서 사용자가 경고 메시지를 클릭하면 버튼을 클릭 할 때 파일 전송을 수락하거나 그렇지 않을 때 절차를 종료하기 위해 TransferFile 이벤트에서 코드를 계속 실행하는 프로그램이 필요합니다. "Alert.OnAlertClick 다음 경우"잘못Onclick 이벤트 알리기

procedure TfrmReadFile.ServerReceiveEvent(Sender: TObject; 
    Client: TSimpleTCPClient; Event: TTOOCSEvent); 
begin 
    if (Event is TTOOCSEventFileTransfert) then 
    begin 
    Alert.Show; 
     if Alert.OnAlertClick then 
     begin 
     with (Event as TTOOCSEventFileTransfert) do 
     if (dlgSaveFile.Execute) then 
      with TMemoryStream.Create do 
      try 
       Write(Content[1], Length(Content)); 
       SaveToFile(dlgSaveFile.FileName); 
      finally 
       Free; 
      end; 
     end; 
    end; 
end; 

하지만

procedure TfrmReadFile.AlertAlertClick(Sender: TObject); 
begin 

end; 

이 코드에 대한 제발 도와주세요 : PLS는 울부 짖는 코드를 참조하십시오.

AlertMessage는 TMS 구성 요소 중 하나이며 ShowModal이 아니지만 내가 사용하는 Alert.Show 프로 시저가 있습니다. 경고 표시 시간이 끝날 때까지 실행 코드를 일시 중지하고 사용자가 경고를 클릭하지 않으면 코드가 중단되고 파일이 저장되지 않습니다. 코드에서

+1

당신은이 경고 구성 요소가 무엇인지 우리에게 얘기를해야합니다. 대화 상자에 TCP 코드를 계속 실행 하시겠습니까? 대화 상자가 모달입니까? 질문은 여전히 ​​이해하기가 어렵습니다. 보다 명확하게 편집하려면 편집해야합니다. –

+1

Alert.ShowModal; Alert.Modalresult = mrOk 인 경우 ... intened가되지만 ReceiveEvent가 발생합니다. 전에 설정된 플래그가 더 나은 해결책이 될 것입니다. – bummi

+0

프로그램 논리를 구현하려면 상태 시스템이 필요합니다. 사용하는 구성 요소의 이벤트는 상태 시스템의 상태를 변경하는 메소드를 호출해야하며 모든 실제 작업은 상태 시스템 메소드로 구현되어야합니다. – kludg

답변

3

는 시간에 당신이 경고를 표시 할 수 있음을 분명, 파일 전송이 이미 발생 : 그것은 의 문제이다 또는 "나는 내용을 폐기 마십시오"나는 파일로 저장합니까 " 이미 ""을 받았습니다. 나는이 정보를 당신의 TMemoryStream.Write()의 사용으로부터 추론하고있다 -이 함수는 버퍼를 매개 변수로 사용하므로, Content[1]이 버퍼를 제공한다고 가정한다. 또한 Content에 이미 필요한 데이터가 채워져 있음을 의미합니다. 너무 늦게 전송하지 마십시오. 이미 메모리에 있습니다. 디스크에 저장하거나 버리면됩니다.

나는 또한 TMS의 경고가 어떻게 작동하는지 알지 못하지만 한 번에 하나의 경고 만 표시 할 수 있다고 가정 할 것이므로 구성 요소에 Alert을 떨어 뜨렸다 고 가정 할 것입니다. 전체 프로그램에서 하나의 경고 만).

콘텐츠를 즉시 TMemoryStream으로 이동하려면 먼저 "받은 이벤트"에 대한 코드를 변경해야합니다. 또한 재귀 재 입장과 관련하여 문제가 발생하지 않도록하십시오. 양식에 개인 필드를 추가하려면 FLastContentReceived: TMemoryStream; 당신이 경우 Alert.OnAlertClick에 일을하려고하고

procedure TfrmReadFile.ServerReceiveEvent(Sender: TObject; 
    Client: TSimpleTCPClient; Event: TTOOCSEvent); 
begin 
    if (Event is TTOOCSEventFileTransfert) then 
    begin 
    // Re-entry before we managed to handle the previous received file? 
    if Assigned(FLastContentReceived) then 
     raise Exception.Create('Recursive re-entry not supported.'); 

    // No re-entry, let's save the content we received so we can save it to file 
    // if the user clicks the Alert button. 
    FLastContentReceived := TMemoryStream.Create; 

    // I don't know what Content is, but you've got that in your code so I 
    // assume this will work: 
    FLastContentReceived.Write(Content[1], Length(Content); 

    // Show the alert; If the OnAlertClick event fires we'll have the received file content 
    // in the FLastContentRecevied and we'll use that to save the file. 
    Alert.Show; 
    end; 
end; 

- 그래서 나는 OnAlertClick를 불렀다 당신의 Alert 구성 요소의 이벤트가있다 가정 : 이제 다음과 같이하도록 코드를 변경합니다. 그것의 이벤트 처리기에서이 쓰기 :

procedure TfrmReadFile.AlertAlertClick(Sender: TObject); 
begin 
    if not Assigned(FLastContentReceived) then raise Exception.Create('Bug'); 
    try 
    if dlgSaveFile.Execute then 
     FLastContentReceived.SaveToFile(dlgSaveFile.FileName); 
    finally FreeAndNil(FLastContentReceived); 
    end; 
end; 

또한 경고 버튼을 클릭 또는 타임 아웃 거기되기 전에 폼이 닫힌 경우 FLastContentReceived을 폐기하는 방법이 필요할 것 (경고는 사용자없이 사라집니다 클릭). 형태가 닫혀 첫 번째 작업 (FLastContentReceived 치우는) simle입니다 :

FLastContentRecevid;Free; 

수도 조금 더 어려운 시간 초과를 취급 : 양식의 OnDestroy가이를 추가 할 수 있습니다.그것은 당신이 설정된 TTimer에 대한 수 같은 건을 제공하지 않는 경우

FreeAndNil(FLastContentRecevid); 

: 밖으로 경고 시간과 풍선은 다음 클릭이 작업을 수행하는 이벤트 핸들러를 사용하지 않고 사라질 때 Alert이라고 이벤트가있는 경우 경고의 제한 시간과 동일한 간격 (또는 약간 더 안전을 위해), 경고를 표시하기 전에 활성화하고 OnTimer의에서이 작업을 수행 :

procedure TFrmReadFile.Timer1Timer(Sender: TObject); 
begin 
    Timer1.Enabled := False; 
    FreeAndNil(FLastContentRecevid); 
end; 
+0

친애하는 Cosmin, 나는 사용자가 alertmessage 파일 전송을 클릭하면 원하는 콘텐츠를 확인하지 않을 다른 사람은 전송 파일을 거부했다. – Poorhoseini

+1

나는 당신이 말하는 것을 완전히 이해하지 못하지만 "transfer transfer file"을 중심으로 돌아가고 있다고 생각합니다. 자, 코드를보십시오. ServerReceiveEvent 이벤트가 호출 될 때 * 이미 파일을 받았다. 내용은 이미 'Content' 필드에서 로컬로 사용할 수 있습니다. 당신이 그것을받을 수 없다, 당신이 할 수있는 모든 파일을 저장하거나 그것을 버리는 것입니다. –

+1

나는 왜'ServerReceiveEvent'가 호출 될 때까지 이미 파일 전송이 일어난 것으로 가정했는지에 대한 해답을 편집했습니다. 너무 늦게 거부하면 할 수있는 일은 취소하는 것입니다. –