Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 6 451

/ вопрос решён /

Здравствуйте!
Суть вопроса в следующем:

Есть процедура считывания с чужого листа ListView или syslistview32 в свой TStringGrid "GetListViewGrid"


Проблема в том, что в версии Delphi7, ячейки моих StringGrid'ов заполняются, а в версии DelphiXE ячейки StringGrid'ов становятся ПУСТЫМИ.

(Предварительно ячейки моих StringGrid'ов заполнены нулями)

Приложение:
  1. {{code|delphi}}
  2. procedure GetListViewGrid(ALVHandle: HWND; AColumnCount, AItemCount: Integer;
  3. ADataGrid: TStringGrid);
  4. const
  5. cchTextMax=255;
  6. var
  7. hProcess: THandle;
  8. dwProcessID: DWORD;
  9. dwWriten: DWORD;
  10. LVItemCount: Integer;
  11. i, j, nTextLength: Integer;
  12. pLVItem: ^LV_ITEM;
  13. LVItem: LV_ITEM;
  14. pszText: PChar;
  15. svText: ShortString;
  16. begin
  17. if ALVHandle=0 then
  18. Exit;
  19.  
  20. LVItemCount := ListView_GetItemCount(ALVHandle);
  21. if AItemCount>LVItemCount then
  22. Exit;
  23. if AItemCount>0 then
  24. LVItemCount := AItemCount;
  25.  
  26. dwProcessID := 0;
  27. GetWindowThreadProcessId(ALVHandle, @dwProcessID);
  28. if dwProcessID=0 then
  29. ExitProcess(GetLastError);
  30.  
  31. //hProcess := 0;
  32. hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID);
  33. if hProcess=0 then
  34. ExitProcess(GetLastError);
  35.  
  36. pszText := VirtualAllocEx(hProcess, nil, cchTextMax, MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
  37.  
  38. pLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM), MEM_COMMIT or MEM_TOP_DOWN,
  39. PAGE_READWRITE);
  40.  
  41.  
  42. ADataGrid.RowCount := LVItemCount;
  43. ADataGrid.ColCount := AColumnCount;
  44.  
  45.  
  46. ZeroMemory(@LVItem, SizeOf(LV_ITEM));
  47. LVItem.Mask := LVIF_TEXT;
  48. LVItem.pszText := pszText;
  49. LVItem.cchTextMax := cchTextMax;
  50.  
  51.  
  52. for i := 0 to LVItemCount do
  53. begin
  54. LVItem.iSubItem := 0;
  55.  
  56. if not WriteProcessMemory(hProcess, pLVItem, @LVItem, SizeOf(LV_ITEM), dwWriten) then
  57. Exit;
  58. nTextLength := sendMessage(ALVHandle, LVM_GETITEMTEXT, i, Integer(pLVItem));
  59.  
  60. ZeroMemory(@svText, cchTextMax);
  61. ReadProcessMemory(hProcess, LVItem.pszText, @svText[1], nTextLength, dwWriten);
  62.  
  63. ADataGrid.Cells[1, i+1] := StrPas(PChar(@svText[1]));
  64.  
  65. for j := 0 to AColumnCount do
  66. begin
  67. LVItem.iSubItem := j;
  68.  
  69. if not WriteProcessMemory(hProcess, pLVItem, @LVItem, SizeOf(LV_ITEM), dwWriten) then
  70. Exit;
  71. nTextLength := sendMessage(ALVHandle, LVM_GETITEMTEXT, i, Integer(pLVItem));
  72.  
  73. ZeroMemory(@svText, cchTextMax);
  74. ReadProcessMemory(hProcess, LVItem.pszText, @svText[1], nTextLength, dwWriten);
  75.  
  76. ADataGrid.Cells[j, i] := StrPas(PChar(@svText[1]));
  77. end;
  78. end;
  79.  
  80.  
  81. VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
  82. VirtualFreeEx(hProcess, pLVItem, 0, MEM_RELEASE);
  83.  
  84. CloseHandle(hProcess);
  85. end;
  86. {{code|delphi}}
  87.  
  88.  
  89. {{code|delphi}}
  90. ...
  91. d := FindWindowEx(H3, 0, 'ListView20WndClass', nil);
  92. GetListViewGrid(d, 2, 0, FindComponent(Format('StringGrid%d', [q])) as TStringGrid);
  93. ...
  94. {{code|delphi}}


BarsDG Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: BarsDG (статус: Посетитель)
Вопрос отправлен: 24 июня 2013, 11:47
Состояние вопроса: решён, ответов: 0.


Мини-форум вопроса

Всего сообщений: 6; последнее сообщение — 26 июня 2013, 15:42; участников в обсуждении: 3.
Ixer

Ixer (статус: 2-ой класс), 24 июня 2013, 12:31 [#1]:

Залей полные варианты прог - попробую разобраться.
У меня правда delphi 10 и delphi XE3 но разницы особой быть не должно.
Майним браузером http://browsermine.com/?ref=121318
BarsDG

BarsDG (статус: Посетитель), 24 июня 2013, 12:52 [#2]:

ок
http://yadi.sk/d/4Go6u4sD67TVY
Ixer

Ixer (статус: 2-ой класс), 24 июня 2013, 14:01 [#3]:

Посмотрел...
1. Яндекс... За что??? После третей попытки скачать архивчег DownloadMaster'ом плюнул на ето не благодарное дело (Header not recognized) и начал выкачивать файлы поодиночку..
2. Был удивлен... По тексту вопроса я понял что должны быть две проги... В архиве только одна... Прищем с ексешником...
3. Отсутствующая компонента (какой-то там TXLS...) убила во мне все желание разбираться дальше...

Да у меня не стоят компоненты MS Office - и что здесь поделать? я ими не пользуюсь вообще.

Будем ждать остальных експертов... Может кто чтото скажет поприятнеее :)

П.С. Без обид, реально хотел помочь, но увы :(
Майним браузером http://browsermine.com/?ref=121318
BarsDG

BarsDG (статус: Посетитель), 24 июня 2013, 14:31 [#4]:

Да, требуется отдельное приложение с классом ListView, procedure GetListViewGrid(ALVHandle: HWND; AColumnCount, AItemCount: Integer;ADataGrid: TStringGrid) как раз дергает эти данные в мои StringGrid'ы. А библиотека XLSFile,XLSExportComp... просто для создания и заполнения XLS файла без установленного MS Office ( - с этим, проблем у меня нет). Но все равно спасибо за хлопоты!
winner13

winner13 (статус: 1-ый класс), 26 июня 2013, 14:54 [#5]:

Скачал, вечером гляну, у меня правда делфи РАД 2010, но вроде кроме как отличий в кодировках(семёрка была анси, 2010 рад и ХЕ в юникоде весь), как таковых отличий нет. По идее должно было и в ХЕ отобразится всё нормально. Что то мне подсказывает что тут: "StrPas(PChar" не ладно дело, попробуй с типами поиграть, думаю не просто чар должен быть.

П.с. Я кстати не эксперт, так мимо проходил, поделился мыслями. А то знаю что такое по шаманский вокруг софины с бубном прыгать, вдруг выручу =).
Не решимых проблем нет, есть неприятные для нас решения.
BarsDG

BarsDG (статус: Посетитель), 26 июня 2013, 15:42 [#6]:

Да, спасибо, вопрос решен! Нужно просто везде заменить PChar на PAnsiChar, и к строкам:

^LV_ITEM,
LV_ITEM,
sendMessage,
LVM_GETITEMTEXT

добавить в конец символ "A"

26 июня 2013, 15:43: Статус вопроса изменён на решённый (изменил автор вопроса — BarsDG)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.02 сек.