-
Передо мной возникла следующая проблемка. Есть некое приложение (к сожалению, не моё). В нем используется визуальный компонент TTreeView. Мне надо узнать текст выделенного узла и его "вложенность" (1, 2, 3 ... n -ий уровень). До самого компонента TTreeView я то добрался (используя FindWindowEx) а вот дальше я не знаю как...
-
а дальше читать MSDN по поводу работы с ним. есть подозрение, что придётся код внедрять в чужое АП.
--- Understanding is not required. Only obedience.
-
Сообщение TVM_GETITEM в Win32 SDK или MSDN
-
-
Вот кусок кода, вроде бы правильно, но ничего не выводится в лейбле:
with tvItem do begin mask := TVIF_TEXT; hItem := TreeView_GetSelection(hTreeView); cchTextMax := 100; end; TreeView_GetItem(hTreeView, tvItem); lblMeshText.Caption := tvItem.pszText;
Хендл верен
-
>[4] Master_Of_Puppets (2008-02-08 11:52:00) ты [3] внимательно прочёл? или по ссылкам ходить — дело не барское?
--- Understanding is not required. Only obedience.
-
tvItem.pszText тоже нужно заполнять. Заполнять указателем, который, как тебя уже ткнул носом г-н Кетмарь, возвернёт функция VirtualAlloc (хотя по мне GlobalAlloc предпочтительнее).
-
Удалено модератором
-
Я думал, что нужен лиш код, который я привел в [4]. Пробывал сделать так как там, но Делфи ругается на хендл вот тут:
procedure ReadItemFromBuff(var Item: TTVITEM); var Readed: DWORD; begin --> Win32Check(ReadProcessMemory(hTreeView, aRemBuff, @Item, SizeOf(Item), Readed)); Win32Check(Readed = SizeOf(Item)); end;
А можно сделать другим способом (чуточку проще) или это единственный? Пробывал еще вот так (с учетом замечания [7]), но не работает:
var str : String ... with tvItem do begin mask := TVIF_TEXT; hItem := TreeView_GetSelection(hTreeView); cchTextMax := 100; pszText := @str; end; TreeView_GetItem(hTreeView, tvItem); lblCap.Caption := str;
-
>[8] Master_Of_Puppets (2008-02-08 17:43:00) бросай ты это дело. «Парфеша, куда тебе целоваться-то, ты ведь облеванный весь!» (ц) Даун Хаус
--- Understanding is not required. Only obedience.
-
Удалено модератором
-
Удалено модератором
-
> LongInt(pszText) := GlobalAlloc(GMEM_FIXED, TSZ);
а почему не pszText := PChar(GlobalAlloc(GMEM_FIXED, TSZ)) ?
-
> а почему не pszText := PChar(GlobalAlloc(GMEM_FIXED, TSZ) > ) ?
А какая сопстно разница? так или иначе - работает, окоянное :)
-
> [6] Dib@zol © (08.02.08 12:24) > tvItem.pszText тоже нужно заполнять. Заполнять указателем, > который, как тебя уже ткнул носом г-н Кетмарь, возвернёт > функция VirtualAlloc (хотя по мне GlobalAlloc предпочтительнее).
LPVOID VirtualAllocEx( HANDLE hProcess, ... VirtualAllocEx function reserves or commits a region of memory within the virtual address space of a specified process
vs
HGLOBAL GlobalAlloc( UINT uFlags, SIZE_T dwBytes );
ничего не смущает?
-
The GlobalAlloc function allocates the specified number of bytes from the heap.
Heap, в котором размещаем, надо считать, принадлежит вызывающему процессу. Или я опять чего-то невкурил? Ну тады просвещайте меня, тёмного :(
-
> Heap, в котором размещаем, надо считать, принадлежит вызывающему > процессу
беда в том, что дерево в другом
-
Удалено модератором
-
>[15] Dib@zol © (2008-02-08 18:21:00) невнимательно. [0]: «Есть некое приложение (к сожалению, не моё)». отсюда однозначно следует, что процесс запущен и живёт в своём АП.
--- Understanding is not required. Only obedience.
-
Удалено модератором
|