Raymond Chen 今天的一篇博客文章让我意识到我遇到的问题的优雅解决方案。
可以使各种shell函数,而不是全部采用ITEMIDLIST
结构,只接受:
ITEMID_CHILD
IDLIST_RELATIVE
IDLIST_ABSOLUTE
ITEMID_CHILD_ARRAY
结构。这些结构都是相同的,但现在您可以在编译器级别强制执行概念类型。
回到德尔福
我有一组功能:
- 有些只走一条路:(例如
C:\Users\Ian\Desktop\AllisonAngel.jpg
) - 有些只取文件名:(例如
AllisonAngel.jpg
) - 有些只拿一个文件夹:(例如
C:\Users\Ian\Desktop
)
现在它们都被声明为string
,例如:
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;
我想要的是“不同”类型的字符串;也就是说string
,它是以长度为前缀、引用计数、以空值结尾的。