는 시간에 당신이 경고를 표시 할 수 있음을 분명, 파일 전송이 이미 발생 : 그것은 의 문제이다 또는 "나는 내용을 폐기 마십시오"나는 파일로 저장합니까 " 이미 ""을 받았습니다. 나는이 정보를 당신의 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;
당신은이 경고 구성 요소가 무엇인지 우리에게 얘기를해야합니다. 대화 상자에 TCP 코드를 계속 실행 하시겠습니까? 대화 상자가 모달입니까? 질문은 여전히 이해하기가 어렵습니다. 보다 명확하게 편집하려면 편집해야합니다. –
Alert.ShowModal; Alert.Modalresult = mrOk 인 경우 ... intened가되지만 ReceiveEvent가 발생합니다. 전에 설정된 플래그가 더 나은 해결책이 될 것입니다. – bummi
프로그램 논리를 구현하려면 상태 시스템이 필요합니다. 사용하는 구성 요소의 이벤트는 상태 시스템의 상태를 변경하는 메소드를 호출해야하며 모든 실제 작업은 상태 시스템 메소드로 구현되어야합니다. – kludg