如何从缓慢的速度加快速度

时间:2015-03-11 19:09:49

标签: performance delphi tstringlist

我在用于邮件项目的表单上使用以下代码。 我有一个表单我可以使用其中一个字符串列表来添加更多联系人。这工作正常但是当我从选择联系人并返回'调用我的SetupMail时,需要很长时间才能使用新的联系人列表更新表单上的控件 当我使用写入文件的FormatDateTime('dd / mm / yyyy hh:nn:ss:zzz',现在)计时时,for循环的每一步大约需要1毫秒

procedure TfrmMailPrepare.SetupMail;
var
  i: integer;
  MailTo: string;
  MailCc: string;
  MailBcc: string;
begin
  MailTo := '';
  MailCc := '';
  MailBcc := '';

  for i := 0 to fMailTo.Count - 1 do
    MailTo := MailTo + fMailTo.Strings[i] + '; ';
  txtMailTo.Text := MailTo;

  for i := 0 to fMailCc.Count - 1 do
    MailCc := MailCc + fMailCc.Strings[i] + '; ';
  txtMailCc.Text := MailCc;

  for i := 0 to fMailBcc.Count - 1 do
    MailBcc := MailBcc + fMailBcc.Strings[i] + '; ';
  txtMailBcc.Text := MailBcc;

  Refresh;
end;

1 个答案:

答案 0 :(得分:2)

你正在进行大量的字符串连接,这意味着需要进行大量的内存(重新)分配。您可以使用TStrings.DelimiterTStrings.DelimitedText属性大大简化此代码(及其开销),例如:

procedure TfrmMailPrepare.SetupMail;
begin
  fMailTo.Delimiter := ';';
  txtMailTo.Text := fMailTo.DelimitedText;

  fMailCc.Delimiter := ';';
  txtMailCc.Text := fMailCc.DelimitedText;

  fMailBcc.Delimiter := ';';
  txtMailBcc.Text := fMailBcc.DelimitedText;
end;

如果您需要在每个分号后面加上空格(或DelimitedText包装每个字符串的引号),则可以改为使用TStrings.LineBreakTStrings.Text属性:

procedure TfrmMailPrepare.SetupMail;
begin
  fMailTo.LineBreak := '; ';
  txtMailTo.Text := fMailTo.Text;

  fMailCc.LineBreak := '; ';
  txtMailCc.Text := fMailCc.Text;

  fMailBcc.LineBreak := '; ';
  txtMailBcc.Text := fMailBcc.Text;
end;