Почему PAINTSTRUCT в C — это TpaintStruct в PASCAL?

#c #winapi #pascal

#c #winapi #pascal

Вопрос:

Я просматривал приложение, портируемое с C на PASCAL (win32 API), и не могу понять, почему тип PAINTSTRUCT в C изменяется на TpaintStruct в PASCAL.

Вот фрагменты, где это можно было увидеть:

 long FAR PASCAL ClientWndProc(HWND hwnd, UINT msg, UINT mp1, LONG mp2)
{
    static int cxClient, cyClient;
    HBITMAP hbm;
    BITMAP bm;
    PAINTSTRUCT ps;
    ...
  

превращается в

 function ClientWndProc(hwnd: WinTypes.HWND; msg: Word; mp1: Word; mp2: Longint): Longint; export;

var
    hdc: WinTypes.HDC;
    hdcMem: WinTypes.HDC;
    hbm: WinTypes.HBITMAP;
    bm: TBITMAP;
    ps: TpaintStruct;
    ...
  

Мне нужно самому портировать одно приложение. Должно ли то же самое применяться и к TEXTMETRIC типу? Должен ли я вызывать это TtextMetric на PASCAL?

Комментарии:

1. В Pascal ничего не говорится о Windows. Вы говорите о Delphi? Или, возможно, Borland TurboPascal?

Ответ №1:

В Delphi (и Turbo Pascal до него, IIRC) всегда был обычай добавлять к типам префиксы с T , как в TStringList , TButton , TCustomForm , TDateTime и так далее.

Вы можете найти TTextMetric TPaintStruct ), объявленные для вас уже в Windows.pas модуле, наряду со многими стандартными функциями WinAPI.

( WinTypes кстати, устарело. Это старый перенос из Delphi 1 для 16-разрядных приложений, и он автоматически заменяется Windows в более поздних версиях Delphi.)

Комментарии:

1. Таким образом, модуль Windows.pas в основном принимает каждую отдельную функцию API и повторно объявляет ее с префиксом «T»? Разве это полностью не сводит на нет назначение независимых от языка функций win32 API?

2. Объявления Win32 API подходят только для компиляторов C.

3. @joncys, нет, это совсем не то, что я сказал. Функции API определены так, как вы и ожидали. Типы имеют префикс T , а не функции. И невозможно «использовать каждую отдельную функцию API» где угодно; Windows.pas объявляются многие, но никоим образом не все, из наиболее часто используемых.

4. @KenWhite Прошу прощения, я по глупости перепутал типы с функциями в своем комментарии. Для меня все еще не имеет смысла, почему вы назвали бы их по-другому. О, и эта университетская задача включает в себя перенос приложений OS / 2 на win32 API, поэтому все «устаревшее» добавляет иронии.

5. @joncys, это проблема совместимости / пользовательских настроек. Поскольку во всех Borland Pascal (Turbo или Delphi) объявлены типы, начинающиеся с T (я подозреваю, чтобы их было легче распознать как таковые), и в VCL и RTL есть тысячи таких T объявлений типов, имело смысл добавить T также типы в WinAPI для согласованности. (По крайней мере, это мое предположение, во всяком случае).

Ответ №2:

Это просто для того, чтобы лучше соответствовать соглашению об именовании Pascal. Вы можете следовать ему, если хотите, и ваш код будет выглядеть более похожим на Pascal, но ничего плохого не произойдет, если вы этого не сделаете.

Ответ №3:

Изначально в Pascal было унифицированное пространство имен для идентификаторов. Это означает, что X как тип и X как имя переменной, поле и т.д. Будут конфликтовать.

Чтобы исправить API, которые использовали тот факт, что это работает по-другому в C (и, следовательно, не зависели от языка), было введено соглашение о типах префиксов с T.

Afaik это уже было сделано для Turbo Vision, пакета, для которого ООП был добавлен в (Turbo) Pascal. Который, afaik, был портом с C .

Позже, в Delphi эта схема была расширена. (используя, например, «A» для имен параметров). Но некоторые венгерские обозначения в Delphi, возможно, также были полезны разработчику GUI.

Afaik только в D4, Delphi разрешил, чтобы идентификаторы типов полей совпадали с именами полей.

Комментарии:

1. Извините. не имена записей, а имена полей в зависимости от типов полей. Я исправил это.