gpt4 book ai didi

delphi - 如何创建一个字符串类型?

转载 作者:行者123 更新时间:2023-12-03 14:41:07 27 4
gpt4 key购买 nike

一个blog entry from Raymond Chen today让我意识到解决我遇到的问题的优雅方法。

各种shell函数,而不是全部采用ITEMIDLIST结构,可以只接受:

  • ITEMID_CHILD
  • IDLIST_RELATIVE
  • IDLIST_ABSOLUTE
  • ITEMID_CHILD_ARRAY

结构。这些结构都是相同,但现在您可以在编译器级别强制执行概念类型。

返回德尔福

我有一组函数:

  • 某些采用路径:(例如C:\Users\Ian\Desktop\AllisonAngel.jpg)
  • 某些采用文件名:(例如AllisonAngel.jpg)
  • 某些采用文件夹:(例如C:\Users\Ian\Desktop)

现在它们都被声明为字符串,例如:

 function GetFilenames(Folder: string; ...): ...
function IsValidBatchFilename(Path: string): ...
function GetReportType(Filename: string): ...

我必须相信我正在传递正确的东西;我相信开发人员(例如)知道以下之间的区别:

  • 路径
  • 文件名
  • 和一个文件夹

我想更改函数以使用“类型化”字符串:

 function GetFilenames(Folder: TFolderOnly; ...): ...
function IsValidBatchFilename(Path: TFullPath): ...
function GetReportType(Filename: TFilenameOnly): ...

地点:

type
TFullPath = type string;
TFolderOnly = type string;
TFilenameOnly = type string;

除了没有发生实际的输入:

var
dropFolder: string;
begin
dropFolder := GetDropFolderPath(LCT);

GetFilenames(dropFolder); <-- no compile error

end;

我想要的是一个“不同”类型的字符串;这是字符串,因为它有长度前缀、引用计数、以 null 结尾。

最佳答案

您可以使用高级记录来完成此操作。例如,你可以这样做

type
TFileName = record
FFileName: string;
public
class function IsValidFileName(const S: string): boolean; static;
class operator Implicit(const S: string): TFileName;
class operator Implicit(const S: TFileName): string;
end;

implementation

class function TFileName.IsValidFileName(const S: string): boolean;
begin
result := true {TODO};
end;

class operator TFileName.Implicit(const S: string): TFileName;
begin
if IsValidFileName(S) then
result.FFileName := S
else
raise Exception.CreateFmt('Invalid file name: "%s"', [S]);
end;

class operator TFileName.Implicit(const S: TFileName): string;
begin
result := S.FFileName;
end;

对于TPathTFolder 也类似。优点:

  • 需要 TPath 的函数不会接受 TFileName(或其他一些组合)。
  • 您仍然可以将 TPath 分配给常规字符串或从常规字符串分配TPath。如果您从字符串转换为 TPath,您将自动检查该字符串以查看它是否包含有效路径。
  • (可选)您可以通过编写更多 Implicit 类来指定如何将 TPath 分配给 TFileName(或其他组合)运营商。

关于delphi - 如何创建一个字符串类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14507885/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com