A запись в блоге от Raymond Chen сегодня заставила меня понять элегантное решение проблемы, с которой я сталкиваюсь.
Различные shell функции, а не все, принимающие структуру ITEMIDLIST
, могут быть приняты только для принятия:
-
ITEMID_CHILD
-
IDLIST_RELATIVE
-
IDLIST_ABSOLUTE
-
ITEMID_CHILD_ARRAY
структуры. Структуры все идентичны, но теперь вы можете применять концептуальные типы на уровне компилятора.
Вернуться к Delphi
i имеет набор функций:
- некоторые только берут путь: (например,
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): ...
и я должен верить, что я передаю нужные вещи; и я доверяю разработчикам (например, мне), знаю разницу между:
- a путь
- a имя_файла
- и папку
Я хочу изменить функции, чтобы использовать "типизированные" строки:
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
в той мере, в какой это префикс длины, отсчет ссылок, нуль завершен.