【问题标题】:Convert TUnicodeStrings to TStrings?将 TUnicodeStrings 转换为 TStrings?
【发布时间】:2015-03-09 14:26:26
【问题描述】:

在 Delphi XE7 中,我使用 Anders Melander 著名的 DragAndDropSuite。该套件中的TDropFileTarget 组件将删除的文件返回为TUnicodeStrings。但是,我需要在具有TStrings 参数的过程中使用这些文件:

procedure DoSomethingWithTheseFiles(const AFiles: TStrings);
begin
  // Do something...
end;

procedure DropFileTarget1Drop(Sender: TObject;
    ShiftState: TShiftState; APoint: TPoint; var Effect: Integer);
begin
  DoSomethingWithTheseFiles(DropFileTarget1.Files); // TUnicodeStrings
end;

因此,使用此代码我收到错误 E2010 Incompatible types: 'TStrings' and 'TUnicodeStrings'

那么如何将TUnicodeStrings 转换为TStrings

【问题讨论】:

    标签: delphi delphi-xe7 unicode-string


    【解决方案1】:

    TUnicodeStrings 支持TPersistentAssign()AssignTo() 方法。它知道如何将字符串复制到TStrings 对象或从TStrings 对象复制字符串,例如:

    Strings.Assign(UnicodeStrings);
    

    或者:

    UnicodeStrings.AssignTo(Strings);
    

    在你的情况下,它看起来像这样:

    var
      Strings: TStringList;
    begin  
      Strings := TStringList.Create;
      try
        Strings.Assign(DropFileTarget1.Files);
        DoSomethingWithTheseFiles(Strings);
      finally
        Strings.Free;
      end;
    end;
    

    【讨论】:

    • 谢谢大卫 - 我非常感谢你的回答!当 DropFileTarget1.AllowAsyncTransfer 设置为 True 时,这是否也可以安全使用?在这种情况下,DoSomethingWithTheseFiles 是否可能已经返回并释放 StringsDropFileTarget1 仍在后台线程中处理这些字符串?
    • DropFileTarget1 不知道Strings。它只有一个字符串的副本。但是,如果DropFileTarget1 正在修改字符串,而您将它们分配给Strings,那么这是一个问题。问题中的代码也有问题,而不是专门针对这里的代码,它大约是TUnicodeStrings -> TStrings。我想你需要检查线程问题。
    • AllowAsyncTransfer 为真时,OnDrop 事件处理程序直到拖动的数据完全传输后才会被调用,但请注意它是在后台传输线程的上下文中调用的 (因为你的处理程序返回的Effect值必须由线程发送回拖动源),所以如果你使用AllowAsyncTransfer=True,它必须是线程安全的。
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    相关资源
    最近更新 更多