Delphi 是否将TuniCodeString转换为tString?
在Delphi XE7中,我使用Anders Melander的著名DragAndDropSuite。此套件中的TDropFileTarget组件将丢弃的文件作为代码字符串返回。但是,我需要在具有TStrings参数的过程中使用这些文件: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
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;