Показать сообщение отдельно
  #35  
Старый 28.04.2009, 22:03
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Что-то я стала отвлекаться...
В общем, пока придумала только как сделать выделенной n-ю строчку в ListView. Опять с громоздкими функциями резервирования памятив чужом процессе. По-другому у меня не получается.
Код:
procedure SelectItemN(ListViewHandle: HWND; N: Integer);
var
  hProcess: THandle;
  dwProcessID: DWORD;
  dwBytesWriten: DWORD;
  plviRemoteLVItem: PLVItem;
  lviRemoteLVItem: LV_ITEM;
begin
  if ListViewHandle = 0 then Exit;
  dwProcessID := 0;

  GetWindowThreadProcessId(ListViewHandle, @dwProcessID);
  if dwProcessID = 0 then Exit;

  hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID);
  if hProcess = 0 then Exit;

  plviRemoteLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM),
                                     MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
  if GetLastError <> 0 then Exit;

  ZeroMemory(@lviRemoteLVItem, SizeOf(LV_ITEM));
  with lviRemoteLVItem do
  begin
    mask := LVIF_STATE;
    iItem := N;
    state := LVIS_FOCUSED or LVIS_SELECTED;
    stateMask := LVIS_FOCUSED or LVIS_SELECTED;
  end;

  if not WriteProcessMemory(hProcess, plviRemoteLVItem, @lviRemoteLVItem,
                            SizeOf(LV_ITEM), dwBytesWriten) then Exit;

  SendMessage(ListViewHandle, LVM_SETITEM, 0, Integer(plviRemoteLVItem));

  VirtualFreeEx(hProcess, plviRemoteLVItem, 0, MEM_RELEASE);
  CloseHandle(hProcess);
end;
О контекстных меню пока помолчу. Не работала с ними раньше. Вы уверены, что команда может быть вызвана только из контекстного меню? Если есть аналогичная команда в основном меню, то не лучше ли воспользоваться им? Тем более, что рабочий пример уже имеется.

По поводу SpinEdit. Выяснила, что в Windows эти окна имеют класс msctls_updown32 и при прокрутке чисел родительскому окну отсылается сообщение WM_VSCROLL (если стрелочки вертикальные) или WM_HSCROLL (если горизонтальные). Вот этого сообщения, видимо, и не хватает вашему окну...
Ответить с цитированием