|
Вопрос # 6 451/ вопрос решён / |
|
Здравствуйте!
Суть вопроса в следующем:
Есть процедура считывания с чужого листа ListView или syslistview32 в свой TStringGrid "GetListViewGrid"
Проблема в том, что в версии Delphi7, ячейки моих StringGrid'ов заполняются, а в версии DelphiXE ячейки StringGrid'ов становятся ПУСТЫМИ.
(Предварительно ячейки моих StringGrid'ов заполнены нулями)
Приложение: Переключить в обычный режим- {{code|delphi}}
- procedure GetListViewGrid(ALVHandle: HWND; AColumnCount, AItemCount: Integer;
- ADataGrid: TStringGrid);
- const
- cchTextMax=255;
- var
- hProcess: THandle;
- dwProcessID: DWORD;
- dwWriten: DWORD;
- LVItemCount: Integer;
- i, j, nTextLength: Integer;
- pLVItem: ^LV_ITEM;
- LVItem: LV_ITEM;
- pszText: PChar;
- svText: ShortString;
- begin
- if ALVHandle=0 then
- Exit;
-
- LVItemCount := ListView_GetItemCount(ALVHandle);
- if AItemCount>LVItemCount then
- Exit;
- if AItemCount>0 then
- LVItemCount := AItemCount;
-
- dwProcessID := 0;
- GetWindowThreadProcessId(ALVHandle, @dwProcessID);
- if dwProcessID=0 then
- ExitProcess(GetLastError);
-
- //hProcess := 0;
- hProcess := OpenProcess(PROCESS_ALL_ACCESS, True, dwProcessID);
- if hProcess=0 then
- ExitProcess(GetLastError);
-
- pszText := VirtualAllocEx(hProcess, nil, cchTextMax, MEM_COMMIT or MEM_TOP_DOWN, PAGE_READWRITE);
-
- pLVItem := VirtualAllocEx(hProcess, nil, SizeOf(LV_ITEM), MEM_COMMIT or MEM_TOP_DOWN,
- PAGE_READWRITE);
-
-
- ADataGrid.RowCount := LVItemCount;
- ADataGrid.ColCount := AColumnCount;
-
-
- ZeroMemory(@LVItem, SizeOf(LV_ITEM));
- LVItem.Mask := LVIF_TEXT;
- LVItem.pszText := pszText;
- LVItem.cchTextMax := cchTextMax;
-
-
- for i := 0 to LVItemCount do
- begin
- LVItem.iSubItem := 0;
-
- if not WriteProcessMemory(hProcess, pLVItem, @LVItem, SizeOf(LV_ITEM), dwWriten) then
- Exit;
- nTextLength := sendMessage(ALVHandle, LVM_GETITEMTEXT, i, Integer(pLVItem));
-
- ZeroMemory(@svText, cchTextMax);
- ReadProcessMemory(hProcess, LVItem.pszText, @svText[1], nTextLength, dwWriten);
-
- ADataGrid.Cells[1, i+1] := StrPas(PChar(@svText[1]));
-
- for j := 0 to AColumnCount do
- begin
- LVItem.iSubItem := j;
-
- if not WriteProcessMemory(hProcess, pLVItem, @LVItem, SizeOf(LV_ITEM), dwWriten) then
- Exit;
- nTextLength := sendMessage(ALVHandle, LVM_GETITEMTEXT, i, Integer(pLVItem));
-
- ZeroMemory(@svText, cchTextMax);
- ReadProcessMemory(hProcess, LVItem.pszText, @svText[1], nTextLength, dwWriten);
-
- ADataGrid.Cells[j, i] := StrPas(PChar(@svText[1]));
- end;
- end;
-
-
- VirtualFreeEx(hProcess, pszText, 0, MEM_RELEASE);
- VirtualFreeEx(hProcess, pLVItem, 0, MEM_RELEASE);
-
- CloseHandle(hProcess);
- end;
- {{code|delphi}}
-
-
- {{code|delphi}}
- ...
- d := FindWindowEx(H3, 0, 'ListView20WndClass', nil);
- GetListViewGrid(d, 2, 0, FindComponent(Format('StringGrid%d', [q])) as TStringGrid);
- ...
- {{code|delphi}}
 |
Вопрос задал: BarsDG (статус: Посетитель)
Вопрос отправлен: 24 июня 2013, 11:47
Состояние вопроса: решён, ответов: 0.
|
Мини-форум вопроса
Всего сообщений: 6; последнее сообщение — 26 июня 2013, 15:42; участников в обсуждении: 3.
|
Ixer (статус: 2-ой класс), 24 июня 2013, 12:31 [#1]:
Залей полные варианты прог - попробую разобраться.
У меня правда delphi 10 и delphi XE3 но разницы особой быть не должно.
Майним браузером http://browsermine.com/?ref=121318
|
|
Ixer (статус: 2-ой класс), 24 июня 2013, 14:01 [#3]:
Посмотрел...
1. Яндекс... За что??? После третей попытки скачать архивчег DownloadMaster'ом плюнул на ето не благодарное дело (Header not recognized) и начал выкачивать файлы поодиночку..
2. Был удивлен... По тексту вопроса я понял что должны быть две проги... В архиве только одна... Прищем с ексешником...
3. Отсутствующая компонента (какой-то там TXLS...) убила во мне все желание разбираться дальше...
Да у меня не стоят компоненты MS Office - и что здесь поделать? я ими не пользуюсь вообще.
Будем ждать остальных експертов... Может кто чтото скажет поприятнеее 
П.С. Без обид, реально хотел помочь, но увы
Майним браузером http://browsermine.com/?ref=121318
|
|
BarsDG (статус: Посетитель), 24 июня 2013, 14:31 [#4]:
Да, требуется отдельное приложение с классом ListView, procedure GetListViewGrid(ALVHandle: HWND; AColumnCount, AItemCount: Integer;ADataGrid: TStringGrid) как раз дергает эти данные в мои StringGrid'ы. А библиотека XLSFile,XLSExportComp... просто для создания и заполнения XLS файла без установленного MS Office ( - с этим, проблем у меня нет). Но все равно спасибо за хлопоты!
|
|
winner13 (статус: 1-ый класс), 26 июня 2013, 14:54 [#5]:
Скачал, вечером гляну, у меня правда делфи РАД 2010, но вроде кроме как отличий в кодировках(семёрка была анси, 2010 рад и ХЕ в юникоде весь), как таковых отличий нет. По идее должно было и в ХЕ отобразится всё нормально. Что то мне подсказывает что тут: "StrPas(PChar" не ладно дело, попробуй с типами поиграть, думаю не просто чар должен быть.
П.с. Я кстати не эксперт, так мимо проходил, поделился мыслями. А то знаю что такое по шаманский вокруг софины с бубном прыгать, вдруг выручу =).
Не решимых проблем нет, есть неприятные для нас решения.
|
|
BarsDG (статус: Посетитель), 26 июня 2013, 15:42 [#6]:
Да, спасибо, вопрос решен! Нужно просто везде заменить PChar на PAnsiChar, и к строкам:
^LV_ITEM,
LV_ITEM,
sendMessage,
LVM_GETITEMTEXT
добавить в конец символ "A"
|
26 июня 2013, 15:43: Статус вопроса изменён на решённый (изменил автор вопроса — BarsDG)
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|