Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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 是否将TuniCodeString转换为tString?_Delphi_Delphi Xe7_Unicode String - Fatal编程技术网

Delphi 是否将TuniCodeString转换为tString?

Delphi 是否将TuniCodeString转换为tString?,delphi,delphi-xe7,unicode-string,Delphi,Delphi Xe7,Unicode String,在Delphi XE7中,我使用Anders Melander的著名DragAndDropSuite。此套件中的TDropFileTarget组件将丢弃的文件作为代码字符串返回。但是,我需要在具有TStrings参数的过程中使用这些文件: procedure DoSomethingWithTheseFiles(const AFiles: TStrings); begin // Do something... end; procedure DropFileTarget1Drop(Sender

在Delphi XE7中,我使用Anders Melander的著名DragAndDropSuite。此套件中的TDropFileTarget组件将丢弃的文件作为代码字符串返回。但是,我需要在具有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不兼容类型:“TStrings”和“TUnicodeStrings”

那么如何将TunicodeString转换为tString呢?

TunicodeString支持TPersistent的Assign和AssignTo方法。它知道如何将字符串复制到TStrings对象或从中复制字符串,例如:

Strings.Assign(UnicodeStrings);
或:

在您的情况下,它将如下所示:

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

谢谢大卫-我非常感谢你的回答!当DropFileTarget1.AllowAsyncTransfer设置为True时,这是否也可以安全使用?在这种情况下,当DropFileTarget1仍在后台线程中处理这些字符串时,这些文件中的DoSomethingWithFiles是否可能已经返回并释放字符串?DropFileTarget1不知道字符串。它只有一个字符串的副本。但是,如果DropFileTarget1在将字符串分配给字符串时修改字符串,则这是一个问题。问题中的代码也有问题,不是专门针对这里的代码,它只是关于TUnicodeStrings->TStrings。我想您需要检查线程问题。当AllowAsyncTransfer为true时,在完全传输拖动的数据之前,不会调用OnDrop事件处理程序,但是请注意,它是在后台传输线程的上下文中调用的,因为处理程序返回的效果值必须由线程发送回拖动源,因此如果使用AllowAsyncTransfer=True,它必须是线程安全的。
var
  Strings: TStringList;
begin  
  Strings := TStringList.Create;
  try
    Strings.Assign(DropFileTarget1.Files);
    DoSomethingWithTheseFiles(Strings);
  finally
    Strings.Free;
  end;
end;