我现在用的是印地TIdSmtp组件来发送电子邮件。 的电子邮件我送会产生大的附件,一般在5至40 MB的范围内。 我想更新进度条会显示发送为需要发送的总字节数的百分比的整体进度。 我不在乎,如果它真的精确,只是不够好,给别人看的进度条沿远的整体电子邮件发送的过程是怎样的指示。
有人点我到一个代码示例,说明我如何做到这一点?
我现在用的是印地TIdSmtp组件来发送电子邮件。 的电子邮件我送会产生大的附件,一般在5至40 MB的范围内。 我想更新进度条会显示发送为需要发送的总字节数的百分比的整体进度。 我不在乎,如果它真的精确,只是不够好,给别人看的进度条沿远的整体电子邮件发送的过程是怎样的指示。
有人点我到一个代码示例,说明我如何做到这一点?
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%准确,但它会很接近。