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 в той мере, в какой это префикс длины, отсчет ссылок, нуль завершен.