1

我正在尝试使用 DataSnap 将 XML 文件从服务器传输到客户端,在 ldsandon 的帮助下,我能够从 embarcadero 下载示例,但我的问题是我无法遵循它。

程序的伪应该以这种方式工作。

客户端将从服务器请求组合框中选定的 xml 文件。服务器会将客户端选择的 xml 文件加载回客户端。

我只是想使用 delphi DataSnap 来解决这个问题,如果不是,我将使用 synapse 或 indy 来传输文件,但我发现 Datasnap 很有趣。

有人可以帮我吗,如果可能的话,可以工作吗?

多谢。

请帮助我,我非常需要你的帮助..谢谢,谢谢

我找到了这个链接,但我不知道如何将它转换为 TFileStream

4

1 回答 1

-1

// 服务器端

function TServerMethods1.GetCDSXML(SQL: String; var FileSize: Integer): TStream;
begin

  QryMisc.Close;
  QryMisc.SQL.Text := SQL;
  CDSMisc.Open;
  Result := TMemoryStream.Create;
  try
    CDSMisc.SaveToStream(Result, dfXML);
    FileSize := Result.Size; // not CDSMisc.DataSize;
    Result.Position := 0; // Seek not implemented in abstract class
  finally
    CDSMisc.Close;
  end;

end;

// 客户端

procedure TClientModule1.PopMiscCDS(SQL: String);
const
   BufSize = $8000;
var
   RetStream: TStream;
   Buffer: PByte;
   MemStream: TMemoryStream;
   BytesRead: Integer;
   FileSize: Integer;
begin
   try
     MemStream := TMemoryStream.Create;
     GetMem(Buffer, BufSize);
     try
       //---------------------------------------------------------
       RetStream := ServerMethods1Client.GetCDSXML(SQL, FileSize);
       //---------------------------------------------------------
       repeat
         BytesRead := RetStream.Read(Pointer(Buffer)^, BufSize);
         if BytesRead > 0 then
           MemStream.WriteBuffer(Pointer(Buffer)^, BytesRead);
       until BytesRead < BufSize;

       if FileSize <> MemStream.Size then
         raise Exception.Create('Error downloading xml');

       MemStream.Seek(0, TSeekOrigin.soBeginning);
       CDSMisc.Close;
       CDSMisc.LoadFromStream(MemStream);

     finally
       FreeMem(Buffer, BufSize);
       MemStream.Free;
     end;

   except
     on E: Exception do
     begin
        ShowMessage(E.Message);
     end;
   end;

end;
于 2016-02-04T13:21:46.200 回答