2016-06-09 2 views
1

델파이 7에서 TControl.Perform()wParam 매개 변수에 음수 값을 허용합니다. 예를 들어, EM_LINEFROMCHAR winapi 메시지의 경우 wParam에 대해 -1이 필요하기 때문에 어떻게해야할까요?Delphi XE4, TControl.Perform()의 wParam은 unsigned int 만 허용합니까?

그러나 델파이 XE4에서는 wParam의 데이터 형식이 음수가 허용되지 않는 NativeUInt으로 변경되었습니다.

이것은 Delphi RTL의 버그입니까, 아니면 잘못 이해하고 있습니까? 감사.

+1

음수 값을 변환 할 수 있습니다. TControl.Perform (.., WPARAM (-1), ...) – RBA

답변

5

이것은 많은 델파이 7 헤더 번역의 결함입니다. 이 유형과 같이 documented on MSDN입니다 :

WPARAM

메시지 매개 변수입니다. 다음과 같이이 유형은 WinDef.h에 선언 :

typedef UINT_PTR WPARAM; 

은 차례로, UINT_PTR는 크기가 플랫폼 포인터와 동일한 부호없는 정수형이다.

64 비트 컴파일러가 출시 된 시점 즈음에이 결함이 수정되었으며 유형의 델파이 선언이 기본 플랫폼 API와 일치하도록 서명되지 않았습니다.

음수 값을 전달하려면 캐스팅해야합니다. 이처럼 :

WPARAM(-1) 

이러한 캐스트는 모든 메시지 유형에 대한 공통 인터페이스를 제시 SendMessage API에 의해 필요악 원인이다. 때로는 사용 가능한 유형에 맞는 메시지 페이로드를 작성해야합니다. 또한 lParam 인수에는 포인터 크기의 부호있는 정수인 LPARAM 유형이 있다고 설명합니다. 즉, 메시지 옆에 추가 데이터를 전달하는 방법을 결정할 때 부호가있는 유형 (lParam)과 서명되지 않은 유형 (wParam)을 선택할 수 있습니다. 물론 서명 된 두 개의 값 또는 서명되지 않은 두 개의 값을 전달하려면 캐스팅해야합니다.

EM_LINEFROMCHAR의 경우 lParam은 사용되지 않을 수도 있습니다. 설계자가 서명되지 않은 wParam 인수 대신 부호가있는 lParam 인수에서 문자 인덱스를 전달하지 않은 이유를 묻습니다. 한 가지 가능한 이유는 -1이 감시 가치라는 것입니다. 부호없는 인수를 사용하면 문자 색인은 0$ffffffff - 1 사이의 값이 될 수 있습니다 (32 비트 정수라고 가정). 즉, 문자 색인의 유효한 범위는 부호가있는 값이 사용 된 경우의 두 배입니다. 이제 서명 된 값이 사용 된 경우 $7fffffff보다 큰 값으로 다시 캐스팅 할 수 있지만 특수한 센티널 값에 대해서만 캐스팅을 요구하는 것이 좋습니다.

1

형식은 WPARAM이며 UINT_PTR로 정의됩니다. 어쨌든 음수 값을 전달하려면 예를 들어를 전달하면됩니다.

WPARAM(-1) 

예상대로 작동해야합니다.