2016-06-09 13 views
1

В Delphi7, TControl.Perform() принимает отрицательные значения для параметра wParam, и так оно и должно было делать, поскольку, например, сообщение EM_LINEFROMCHAR winapi ожидало бы -1 для wParam.Delphi XE4, wParam для TControl.Perform() принимает только unsigned int?

Но под Delphi XE4 тип данных для wParam изменился на NativeUInt, который не принимал отрицательные целые числа.

Это ошибка Delphi RTL, или я понимаю это неправильно? Благодарю.

+1

Вы можете использовать отрицательные значения. TControl.Perform (.., WPARAM (-1), ...) – RBA

ответ

5

Это дефект в переводах заголовков Delphi 7, один из многих. Этот тип documented on MSDN так:

WPARAM

Параметр сообщения. Этот тип объявлен в WinDef.h следующим образом:

typedef UINT_PTR WPARAM; 

В свою очередь, UINT_PTR это беззнаковое интегральный тип, размер которого совпадает с указателем платформы.

Во время внедрения 64-битного компилятора этот дефект был исправлен, и объявление Delphi этого типа стало неподписанным, чтобы соответствовать базовому API-интерфейсу платформы.

Если вы хотите передать отрицательное значение, вы должны бросить его. Как это:

WPARAM(-1) 

Такие забросы являются необходимым злом причина по SendMessage API, который представляет общий интерфейс для всех типов сообщений. Иногда вам просто нужно, чтобы ваша полезная нагрузка вашего сообщения соответствовала доступным типам. Я также хотел бы прокомментировать, что аргумент lParam имеет тип LPARAM, который представляет собой целое число со знаком указателя. Это означает, что, когда решено, как передавать дополнительные данные вместе с сообщением, вы можете выбрать между подписанными (lParam) и неподписанными (wParam) типами. Конечно, если вы хотите передать два значащих знака или два значения без знака, то вам нужно выполнить бросок.

В случае EM_LINEFROMCHAR вы можете заметить, что lParam не используется. Вы можете спросить, почему дизайнеры не передали индекс символов в подписанном аргументе lParam вместо аргумента unsigned wParam. Одна из возможных причин заключается в том, что -1 является контрольным значением. Используя беззнаковый аргумент, индекс символов может быть любым значением между 0 и $ffffffff - 1 (предполагая 32-битные целые числа). Это означает, что допустимый диапазон символьного индекса в два раза больше, чем при использовании знакового значения. Теперь, если использовалось значение со знаком, оно может быть снова выбрано для значений, превышающих $7fffffff, но имеет смысл требовать кастинг только для специального значения дозорного.

1

Тип WPARAM, который определяется как UINT_PTR. Если вы все равно хотите передавать отрицательные значения, вы можете передать, например.

WPARAM(-1) 

и это должно работать должным образом.