| 
| 
 | Вопрос # 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) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |