需要TIdSmtp期间更新进度条的Delphi 6例如发送操作,特别是对于大的附件(Need Del

2019-10-16 17:11发布

我现在用的是印地TIdSmtp组件来发送电子邮件。 的电子邮件我送会产生大的附件,一般在5至40 MB的范围内。 我想更新进度条会显示发送为需要发送的总字节数的百分比的整体进度。 我不在乎,如果它真的精确,只是不够好,给别人看的进度条沿远的整体电子邮件发送的过程是怎样的指示。

有人点我到一个代码示例,说明我如何做到这一点?

Answer 1:

TIdSMTP因为它是被发送到服务器上进行编码的即时电子邮件。 被发送的字节总数不能提前知道。 你将能够确定的值甚至相当接近的唯一方法是将电子邮件编码到一个临时TStream通过TIdMessage.SaveToStream()方法,然后抓住的价值TStream.Size属性。 由于要在编码大的附件,这将需要一些时间和大量的内存开销。 由于TIdSMTP只会再次在传输过程中重新编码的电子邮件,也不能保证实际传输将匹配温度的字节数TStream.Size由于各种电子邮件标题,如时间戳和MIME边界的动态特性。

要确定多少字节实际上被发送,使用TIdSMTP.OnWork...事件,其中AWorkMode参数将被设置为wmWrite 。 由于TIdSMTP.Send()不事先知道有多少字节会被发送,该AWorkCountMax的参数TIdSMTP.OnWorkBegin活动将是0 ,但至少你会知道什么时候实际的电子邮件数据开始编码/发送(后TIdSMTP已与服务器交换几个命令)。 所述AWorkCount所述的参数TIdSMTP.OnWork事件将是实际发送的字节总数。 当TIdSMTP.OnWorkEnd事件被触发,电子邮件已经完成发送。

根据临时TStream.Size属性和AWorkCount的参数TIdSMTP.OnWork情况下,您将能够显示一个百分比的近似值的进度条。 这将不能保证100%准确,但它会很接近。



文章来源: Need Delphi 6 example for updating a progress bar during TIdSmtp send operation, especially for large attachments