尝试在 Delphi Sydney CE中完成ShFileOpStruct

23c0lvtd  于 2023-05-12  发布在  其他
关注(0)|答案(1)|浏览(111)

我试图从 Delphi 7和这些pWide移动...
下面的代码只加载'123'字符串。pFrom是一个PWideChar,那么我如何加载带有#0分隔符的文件名?并追加#0#0以完成需求?

procedure TForm13.Button1Click(Sender: TObject);
var
  s: String;
  sfo: TSHFileOpStruct;
begin
  s:='123'+#0+'456'+#0;
  sfo.pfrom:=pchar(s);
end;

我已经尝试了各种选项,使用如上所述的pWideStringpChar,但都无济于事。尝试将pFrom#0连接也失败,并出现错误:
运算符不适用于此操作数类型
请帮助新手。

6fe3ivhb

6fe3ivhb1#

在构建字符串文字时,只需删除+,例如:

procedure TForm13.Button1Click(Sender: TObject);
var
  s: String;
  sfo: TSHFileOpStruct;
begin
  s := '123'#0'456'#0;
  sfo.pfrom := PChar(s);
end;

这在 Delphi 的文档中有描述:
基本语法元素( Delphi ):字符串
控制字符串是一个或多个控制字符的序列,每个控制字符由#符号和一个无符号整数常量组成,该常量在0到65,535(十进制)之间或在UTF-16编码中从$0到$FFFF(十六进制)之间,并表示与指定代码值对应的字符。每个整数在内部由字符串中的2个字节表示。这对于表示控制字符和多字节字符很有用。控制字符串:
#89#111#117
等效于带引号的字符串:
'You'

**您可以将带引号的字符串与控制字符串组合在一起,形成更大的字符串。**例如,您可以用途:

'Line 1'#13#10'Line 2'
在“行1”和“行2”之间放置回车换行。但是,不能用这种方式连接两个带引号的字符串,因为一对连续撇号被解释为单个字符。(要连接带引号的字符串,请使用+运算符或将它们合并为一个带引号的字符串。)
这在 Delphi 7中也可以使用。
另一方面,如果你想更动态地执行它(比如,文件名来自变量),那么你可以这样做:

procedure TForm13.Button1Click(Sender: TObject);
var
  fileNames: array of string; // or whatever container you want
  fileName, s: String;
  len: Integer;
  P: PChar;
  sfo: TSHFileOpStruct;
begin
  SetLength(fileNames, 2);
  fileNames[0] := '123';
  fileNames[1] := '456';

  len := 0;
  for fileName in fileNames do
    Inc(len, Length(fileName)+1);

  SetLength(s, len);
  P := PChar(s);

  for fileName in fileNames do
  begin
    len := Length(fileName);
    Move(PChar(fileName)^, P^, len*SizeOf(Char));
    Inc(P, len);
    P^ := #0;
    Inc(P);
  end;

  sfo.pfrom := PChar(s);
end;

或者:

procedure TForm13.Button1Click(Sender: TObject);
var
  fileNames: TStringList;
  s: String;
  sfo: TSHFileOpStruct;
begin
  fileNames := TStringList.Create;
  try
    fileNames.Add('123');
    fileNames.Add('456');

    fileNames.Delimiter := #0;
    fileNames.QuoteChar := #0;
    fileNames.StrictDelimiter := True;

    s := fileNames.DelimitedText + #0;
  finally
    fileNames.Free;
  end;

  sfo.pfrom := PChar(s);
end;

相关问题