По API хелпните чуть, плиз

Kotъ-Begemotъ
Дата: 11.11.2007 19:34:38
var vPoint: TPoint;
      Hnd: THandle;
...
Hnd := GetDesktopListViewHandle; // Текст функции не привожу, но работает нормально :)
...
SendMessage(Hnd, LVM_GETITEMPOSITION, I, @vPoint); // Ругается [Error] Main.pas(98): Incompatible types: 'Integer' and 'Pointer'.
Ничего не понял... Ведь по описанию:

The LVM_GETITEMPOSITION message retrieves the position of a list view item. You can send this message explicitly or by using the ListView_GetItemPosition macro.

LVM_GETITEMPOSITION
wParam = (WPARAM) (int) i;
lParam = (LPARAM) (POINT FAR *) ppt;

Parameters
i Index of the list view item.
ppt Pointer to a POINT structure that receives the position of the item's upper-left corner, in view coordinates.
A.K.
Дата: 11.11.2007 19:52:55
Последний параметр функции SendMessage определен в windows.pas как тип LPARAM, тождественный типу LongInt. Указатель "совместим" с LongInt в том плане, что имеет одинаковую с ним длину. Однако необходимо явно привести тип данных. То есть передать указатель вы можете, но вы должны представить как будто это у вас просто число, но при этом и вам и получателю сообщения известно, что это число следует интерпретировать как адрес в памяти.
SendMessage(Hnd, LVM_GETITEMPOSITION, I, LPARAM(@vPoint));
Kotъ-Begemotъ
Дата: 11.11.2007 20:00:18
A.K.
Последний параметр функции SendMessage определен в windows.pas как тип LPARAM, тождественный типу LongInt. Указатель "совместим" с LongInt в том плане, что имеет одинаковую с ним длину. Однако необходимо явно привести тип данных. То есть передать указатель вы можете, но вы должны представить как будто это у вас просто число, но при этом и вам и получателю сообщения известно, что это число следует интерпретировать как адрес в памяти.
SendMessage(Hnd, LVM_GETITEMPOSITION, I, LPARAM(@vPoint));


Да, спасибо, так жрёт. Но... не работает :( Я для начала пробовал еще LongInt(@vPoint) для vPoint выдаются значения вида X=5915344 (меняется, разное всегда), Y=43 (всегда одно и то же)... уже почитал эту статью и взял оттуда функцию GetXY вида:
function GetXY(hwndLV: HWND; i: Integer; var ppt:TPoint): Bool;
var PointBuf : ^TPoint;
begin
 try
   PointBuf := VirtualAlloc(NIL,Sizeof(TPoint),$8000000 or MEM_COMMIT, PAGE_READWRITE);
   Result := Bool(SendMessage(hWndLV,LVM_GETITEMPOSITION, i, Longint(PointBuf)));
   if Result then
    begin
     ppt.x := PointBuf^.x;
     ppt.y := PointBuf^.y;
    end;
   finally
     VirtualFree(PointBuf,0,MEM_RELEASE);
  end;
end;

Проблема в том, что если поставить точку останова на конструкцию if Result... то она никогда не выполняется. То есть Bool(SendMessage(hWndLV,LVM_GETITEMPOSITION, i, Longint(PointBuf))) всегда возвращает False почему-то (
Tellur
Дата: 12.11.2007 06:42:16
Kotъ-Begemotъ
То есть Bool(SendMessage(hWndLV,LVM_GETITEMPOSITION, i, Longint(PointBuf))) всегда возвращает False почему-то (

Так и должно. Память то вы выделели с помощью VirtualAlloc в адресном пространстве своего процесса. А надо было выделять в адресном пространстве того процесса которому принадлежит этот ListView.
Пользуйте VirtualAllocEx
Kotъ-Begemotъ
Дата: 12.11.2007 19:55:05
Tellur
Так и должно. Память то вы выделели с помощью VirtualAlloc в адресном пространстве своего процесса. А надо было выделять в адресном пространстве того процесса которому принадлежит этот ListView.
Пользуйте VirtualAllocEx


Угу. Уже разобрался, спасибо. Там наворотов - мама не горюй... Кучу дополнительного приходится делать, чтобы такую, казалось бы простую проблему решить.