Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.22;
Скачать: CL | DM;

Вниз

TreeView   Найти похожие ветки 

 
djone ©   (2004-06-29 20:59) [0]

Ребята подскажите пожалуйста как иЗ TreeView достать текст

Я использую такой вот метод

Function GetTreeItem(opt:string):string;
const
 PROCESS_ACCESS = PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE;
type
 PProcData = ^TProcData;
 TProcData = record
   Item: TTVItem;
   Txt: packed array [0 .. 1023] of AnsiChar;
   ItemRect: TRect;
 end;
var
 Cnt,I: Integer;
 ProcID: DWord;
 ProcessHandle: THandle;
 Data: TProcData;
 ProcData: PProcData;
 Res: Boolean;

begin
 ZHWND:=GetFocus;
 ProcID := 0;
 GetWindowThreadProcessId(ZHWND, ProcID);

 ProcessHandle := OpenProcess(PROCESS_ACCESS, False, ProcID);
 //if ProcessHandle = 0 then RaiseLastOSError;
 try
   ProcData := VirtualAllocEx(ProcessHandle, nil, SizeOf(ProcData^),
     MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
   //if ProcData = nil then RaiseLastOSError;
   try
     Cnt := TreeView_GetCount(ZHWND);
     for I := 0 to Cnt - 1 do
     begin

       with Data.Item do
       begin

         //iSubItem := 0;
         pszText := @ProcData^.Txt;
         cchTextMax := Length(ProcData^.Txt) - 1;
         hitem:=;
       end;

       Res := WriteProcessMemory(ProcessHandle, ProcData,
         @Data, SizeOf(Data), PLongWord(nil)^);
       if not Res then RaiseLastOSError;

           SendMessage(ZHWND, TVM_GETITEM, 0, LongInt(@ProcData^.Item));
           Res := ReadProcessMemory(ProcessHandle, ProcData,
           @Data, SizeOf(Data), PLongWord(nil)^);
           if not Res then RaiseLastOSError;
         result:= Data.Txt;
         if data.Item.state  =TVIS_SELECTED  then
         begin
           if opt="txt" then result:= Data.Txt;
           if opt="num" then result:=inttostr(i);

         end;
     end;
   finally
     //Res := LongBool(VirtualFreeEx(ProcessHandle, ProcData, 0, MEM_RELEASE));
     //if not Res then RaiseLastOSError;
   end;
 finally
   CloseHandle(ProcessHandle);
 end;

end;

Но он не работает!


 
djone ©   (2004-06-30 12:28) [1]

Никто не поможет?


 
inic ©   (2004-06-30 15:01) [2]

Во-первых вызывает сомнения GetFocus: в Win32 SDK сказано, что эта функция вернет окно с фокусом, если только ее вызвал thread, связанный с этим окном, у тебя же необходимо заиметь окно (treeview) из другого процесса.


 
inic ©   (2004-06-30 15:08) [3]

Во-вторых: hitem ничему не присваивается !!!

Присвой например SendMessage(hTree, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0);

Я скопировал твой код, для примера явно присвоил конкретный handle дерева из другого процесса, все работает


 
djone ©   (2004-07-05 01:19) [4]

А как ты это сделал?
Я не смог потомучто он сказал SendMessage(hTree, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0); и Htree - Несовместимые типы.


 
djone ©   (2004-07-06 13:03) [5]

Помогите!!!!! ПОЖАЛУЙСТА!


 
GrayFace ©   (2004-07-06 15:58) [6]

inic ©   (30.06.04 15:08) [3]
Скопируй обратно исправленный код и будет всем счастье.


 
dosik   (2004-07-07 01:25) [7]

Посмотри макросы типа TreeView_XXX. TreeView - это стандартаная виндовская приблуда, а делфийский компонент, это просто оболочка к ней. В принцие делфи так с ней и работает, посмотри исходники, там все ясно описанно. Удачи )))


 
djone ©   (2004-07-08 00:23) [8]

Ребята спасайте! Я всё сделал. Всё работает нормально но когда мышкой начинаешь водить , начинаеться пакость

Function GetTreeItem(opt:string):String;
const
PROCESS_ACCESS = PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE;
type
PProcData = ^TProcData;
TProcData = record
  Item: TTVItemA;
  Txt: packed array [0 .. 1023] of AnsiChar;
  ItemRect: TRect;
end;
var
Cnt,I: Integer;
ProcID: DWord;
ProcessHandle: THandle;
Data: TProcData;
ProcData: PProcData;
Res: Boolean;

begin
ZHWND:=getfocus;
ProcID := 0;
GetWindowThreadProcessId(ZHWND, ProcID);

ProcessHandle := OpenProcess(PROCESS_ACCESS, False, ProcID);
//if ProcessHandle = 0 then RaiseLastOSError;
try
  ProcData := VirtualAllocEx(ProcessHandle, nil, SizeOf(ProcData^),
    MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
  //if ProcData = nil then RaiseLastOSError;
  try
    Cnt := TreeView_GetCount(ZHWND);
   // for I := 0 to Cnt - 1 do
    //begin
     
      with Data.Item do
      begin

        //iSubItem := 0;
        hitem:=TreeView_GetSelection(zhwnd);
        cchTextMax := Length(ProcData^.Txt) - 1;
        pszText := @ProcData^.Txt;

      end;

      Res := WriteProcessMemory(ProcessHandle, ProcData,
        @Data, SizeOf(Data), PLongWord(nil)^);
      if not Res then RaiseLastOSError;

          SendMessage(ZHWND, TVM_GETITEM, 0, LongInt(@ProcData^.Item));
          Res := ReadProcessMemory(ProcessHandle, ProcData,
          @Data, SizeOf(Data), PLongWord(nil)^);
          if not Res then RaiseLastOSError;
        result:= Data.Txt
        {if data.Item.state  =TVIS_SELECTED  then
        begin

          //if opt="txt" then result:= Data.Txt;
          //if opt="num" then result:=inttostr(i);

        end;}
    //end;
  finally
    //Res := LongBool(VirtualFreeEx(ProcessHandle, ProcData, 0, MEM_RELEASE));
    //if not Res then RaiseLastOSError;
  end;
finally
  CloseHandle(ProcessHandle);
end;
end;



Страницы: 1 вся ветка

Текущий архив: 2004.08.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.048 c
3-1091083229
WondeRu
2004-07-29 10:40
2004.08.22
SQL. Как использовать процедуру для WHERE


3-1091002043
Wolfram
2004-07-28 12:07
2004.08.22
Проблемы при переходе с Paradox на Access


1-1091702482
Aleksandr.
2004-08-05 14:41
2004.08.22
Как переделать код расчета CRC32?


1-1091791595
dizrov
2004-08-06 15:26
2004.08.22
диалог выбора директории


14-1091769275
ИМХО
2004-08-06 09:14
2004.08.22
Гугл