あなたのコードから、アラートを表示するまでに、ファイル転送がすでに発生していることは明らかです。「ファイルに保存しますか」または「既に受信したコンテンツを破棄しますか」だけの問題です。私はあなたの使用からこの情報を推測していますTMemoryStream.Write()
-その関数はパラメーターとしてバッファーを取るので、Content[1]
があなたにバッファーを与えると思います。これは、Content
必要なデータがすでに読み込まれていることも意味します。転送しないには遅すぎます。既にメモリ内にあります。できることは、ディスクに保存するか、破棄することだけです。
また、TMS の Alert がどのように機能するかはわかりませんが、一度に表示できる Alert は 1 つだけでAlert
あり、コンポーネントにドロップしたと仮定します (つまり、アラートは 1 つだけです)。プログラム全体)。
最初に「受信イベント」のコードを変更して、コンテンツをすぐにTMemoryStream
. また、再帰的な再入で問題が発生しないようにしてください。フォームにプライベート フィールドを追加し、それを呼び出しますFLastContentReceived: TMemoryStream
。コードを次のように変更します。
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;
if on を実行しようとしているので、コンポーネントに と呼ばれるAlert.OnAlertClick
イベントがあると思います。これをイベント ハンドラに記述します。Alert
OnAlertClick
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 を取り除く) は単純です: これをフォームの に追加しますOnDestroy
:
FLastContentRecevid;Free;
タイムアウトの処理は少し難しいかもしれません。Alert
アラートがタイムアウトし、バルーンがクリックされずに消えたときに呼び出されるイベントが にある場合は、そのイベント ハンドラを使用してこれを行います。
FreeAndNil(FLastContentRecevid);
TTimer
アラートのタイムアウトに等しい間隔(または安全のために少し長く)を設定できるようなものが提供されない場合は、アラートを表示する前に有効にし、次のようにしOnTimer
ます。
procedure TFrmReadFile.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled := False;
FreeAndNil(FLastContentRecevid);
end;