Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要Delphi 6示例来更新TIdSmtp发送操作期间的进度条,尤其是大型附件_Delphi_Smtp_Progress Bar_Indy - Fatal编程技术网

需要Delphi 6示例来更新TIdSmtp发送操作期间的进度条,尤其是大型附件

需要Delphi 6示例来更新TIdSmtp发送操作期间的进度条,尤其是大型附件,delphi,smtp,progress-bar,indy,Delphi,Smtp,Progress Bar,Indy,我正在使用Indy TIdSmtp组件发送电子邮件。我正在发送的电子邮件将有一个很大的附件,通常在5到40 MB的范围内。我想更新一个进度条,该进度条将显示发送的总体进度占需要发送的总字节数的百分比。我不在乎它是否真的精确,只是足够好地让观看进度条的人知道整个电子邮件发送过程的进展程度 有人能给我指出一个代码示例,演示如何执行此操作吗?tidstp在电子邮件发送到服务器时对其进行动态编码。发送的总字节数事先未知。您能够确定一个合理接近的值的唯一方法是通过TIdMessage.SaveToStre

我正在使用Indy TIdSmtp组件发送电子邮件。我正在发送的电子邮件将有一个很大的附件,通常在5到40 MB的范围内。我想更新一个进度条,该进度条将显示发送的总体进度占需要发送的总字节数的百分比。我不在乎它是否真的精确,只是足够好地让观看进度条的人知道整个电子邮件发送过程的进展程度

有人能给我指出一个代码示例,演示如何执行此操作吗?

tidstp在电子邮件发送到服务器时对其进行动态编码。发送的总字节数事先未知。您能够确定一个合理接近的值的唯一方法是通过TIdMessage.SaveToStream方法将电子邮件编码到临时TStream,然后获取TStream.Size属性的值。由于您正在对大型附件进行编码,这将需要一些时间和大量内存开销。由于TIdSMTP将在传输过程中重新编码电子邮件,因此无法保证实际传输的字节数将与temp TStream.Size相匹配,因为各种电子邮件标题(如时间戳和MIME边界)具有动态特性

要确定实际发送的字节数,请使用tidstp.OnWork。。。事件,其中AWorkMode参数将设置为wmWrite。由于TIdSMTP.Send无法提前知道它将发送多少字节,因此TIdSMTP.OnWorkBegin事件的AWorkCountMax参数将为0,但至少您知道在TIdSMTP与服务器交换多个命令后,实际电子邮件数据何时开始编码/发送。TIdSMTP.OnWork事件的AWorkCount参数将是实际发送的总字节数。触发TIdSMTP.OnWorkEnd事件时,电子邮件已完成发送

基于temp TStream.Size属性和tidstp.OnWork事件的AWorkCount参数,您将能够显示进度条的近似百分比。它不能保证100%准确,但会很接近。

tidstp在电子邮件发送到服务器时对其进行动态编码。发送的总字节数事先未知。您能够确定一个合理接近的值的唯一方法是通过TIdMessage.SaveToStream方法将电子邮件编码到临时TStream,然后获取TStream.Size属性的值。由于您正在对大型附件进行编码,这将需要一些时间和大量内存开销。由于TIdSMTP将在传输过程中重新编码电子邮件,因此无法保证实际传输的字节数将与temp TStream.Size相匹配,因为各种电子邮件标题(如时间戳和MIME边界)具有动态特性

要确定实际发送的字节数,请使用tidstp.OnWork。。。事件,其中AWorkMode参数将设置为wmWrite。由于TIdSMTP.Send无法提前知道它将发送多少字节,因此TIdSMTP.OnWorkBegin事件的AWorkCountMax参数将为0,但至少您知道在TIdSMTP与服务器交换多个命令后,实际电子邮件数据何时开始编码/发送。TIdSMTP.OnWork事件的AWorkCount参数将是实际发送的总字节数。触发TIdSMTP.OnWorkEnd事件时,电子邮件已完成发送


基于temp TStream.Size属性和tidstp.OnWork事件的AWorkCount参数,您将能够显示进度条的近似百分比。它不能保证100%准确,但会很接近。

谢谢。这就是我需要的。任何东西都比一台看起来被挂了很长时间的电脑要好。至少我的用户会看到进度条在做什么,这样他们就知道我的应用程序没有被锁定。即使我做了一些非常不准确的事情,比如将附件的总大小乘以2,再除以工作计数得到一个百分比,至少会有一些视觉反馈。为了最小化编码临时流的开销,您可以使用Indy的public TIdDiscardStream或TIdEventStream类,或者从IdMulipartFormData.pas单元复制Indy的私有TIdCalculateSizeStream类的实现。这样,内存中就不会存储任何数据,但您仍然可以计算出写入流的字节数。谢谢。这就是我需要的。任何东西都比一台看起来被挂了很长时间的电脑要好。至少我的用户会看到进度条在做什么,这样他们就知道我的应用程序没有被锁定。即使我做了一些非常不准确的事情,比如用附件的总大小乘以2,再除以一个工作计数得到一个百分比,至少会有
一些视觉反馈。为了最大限度地减少对临时流进行编码的开销,您可以使用Indy的public TIdDiscardStream或TIdEventStream类,或者从IdMulipartFormData.pas单元复制Indy的私有TIdCalculateSizeStream类的实现。这样,内存中就不会存储任何数据,但您仍然可以统计写入流的字节数。