О чём не пишут в книгах по Delphi - страница 6
>WCHAR
. В Delphi нет прямого аналога типу >TCHAR
. Программист сам должен следить за тем, какой символьный тип требуется в данном месте. Строки в Windows API передаются как указатели на цепочку символов, завершающихся нулем. Поэтому указатель на >TCHAR
может указывать как на единичный символ, так и на строку. Чтобы было легче разобраться, где какой указатель, в Windows API есть типы >LPTCHAR
и >LPTSTR
. Они эквивалентны друг другу, но первый принято использовать там, где требуется указатель на одиночный символ, а второй — на строку. Если строка передается в функцию только для чтения, обычно используют указатель на константу, т.е. тип >LPCTSTR
. В Delphi это соответствует PChar для ANSI и PWideChar для Unicode. Здесь следует отметить особенность записи строковых литералов в языках C/C++. Символ \ в литерале имеет специальное значение: после него идет один или несколько управляющих символов. Например, \n означает перевод строки, \t — символ табуляции и т.п. В Delphi таких последовательностей нет, поэтому при переводе примеров из MSDN следует явно писать коды соответствующих символов. Например, литерал >"а\nb"
в Delphi превращается в >'a\'#13'b'
. После символа >\
может идти число — в этом случае оно трактуется как код символа, т.е. литерал >"a\0b9"
в C/C++ эквивалентен литералу '>а'#0'b'#9
в Delphi. Если нужно, чтобы строковый литерал включал в себя сам символ \, его удваивают, т.е. литерал >"\\"
в C++ соответствует >'\'
в Delphi. Кроме того, в примерах кода, приведенных в MSDN, можно нередко увидеть, что строковые литералы обрабатываются макросами >TEXT
или >_T
, которые служат для унификации записи строковых литералов в кодировках ANSI и Unicode. При переводе такого кола на Delphi эти макросы можно просто опустить. С учетом сказанного такой, например, код (взят из примера использования Named pipes):>LPTSTR lpszPipename = TEXT("\\\\.\\pipe\\mynamedpipe");
на Delphi будет выглядеть так:
>var
> lpszPipeName: PChar;
>...
>lpszPipeName:= '\\.\pipe\mynamedpipe';
Большинство названий типов из левой части табл. 1.1 в целях совместимости описаны в модуле Windows, поэтому они допустимы наравне с обычными типами Delphi. Кроме этих типов общего назначения существуют еще специальные. Например, дескриптор окна имеет тип >HWND
, первый параметр сообщения — тип >WPARAM
(в старых 16-разрядных Windows он был эквивалентен типу >Word
, в 32-разрядных — >LongInt
). Эти специальные типы также описаны в модуле Windows.
Записи (>record
) в C/C++ называются структурами и объявляются с помощью слова >struct
. Из-за особенностей описания структур на языке С структуры в Windows API получают два имени: одно основное имя, составленное из главных букв, которое затем и используется, и одно вспомогательное, получающееся из основного добавлением префикса >tag
. Начиная с четвертой версии Delphi приняты следующие правила именования таких типов: простое и вспомогательное имена остаются без изменений и еще добавляется новое имя, получающееся из основного присоединением общеупотребительного в Delphi префикса >T
. Например, в функции >CreatePenIndirect
одни из параметром имеет тип >LOGPEN
. Это основное имя данного типа, а вспомогательное — >tagLOGPEN
. Соответственно, в модуле Windows определена запись >tagLOGPEN
и ее синонимы — >LOGPEN
и >TLogPen
. Эти три идентификатора в Delphi взаимозаменяемы. Вспомогательное имя встречается редко, программисты, в зависимости от личных предпочтений, выбирают либо основное имя типа, либо имя с префиксом >T
.
Описанные здесь правила именования типов могут внести некоторую путаницу при использовании VCL. Например, для описания растра в Windows API определен тип >BITMAP
(он же— >tagBITMAP
). В Delphi соответствующий тип имеет еще одно имя — >TBitmap
. Но такое же имя имеет класс >TBitmap
, описанный в модуле >Graphics
. В коде, который Delphi создает автоматически, модуль >Graphics
находится в списке >uses
после модуля >Windows
, поэтому идентификатор >TBitmap
воспринимается компилятором как >Graphics.TBitmap
, а не как >Windows.TBitmap
. Чтобы использовать