здравствуйте, получаю через WMI список запущеных процессов, хочу, чтобы они обновлялись в ListView, решил использовать для этого виртуальный режим ListView, но не могу понять почему у меня всегда чистый список, оно вообще не выводит в listview ничего, хотя во временный массив информацию заносить ... что я делаю не так ?! пример кода | Код | unit Unit100000000000000;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, WbemScripting_TLB, ComCtrls, ExtCtrls,Math, Grids, StdCtrls;
type TForm1 = class(TForm) Timer1: TTimer; ListView1: TListView;
type //Структура для хранения одной строки TSimpleRec=record caption:string; data:integer; end; //Массив структур TSimpleArr = array of TSimpleRec;
procedure Timer1Timer(Sender: TObject); procedure ListView1Data(Sender: TObject; Item: TListItem); procedure FormCreate(Sender: TObject);
private arr:TSimpleArr; services : ISWbemServices; refresher : ISWbemRefresher; refresherItem : ISWbemRefreshableItem;
pObject : ISWbemObject;
pid,mem : cardinal; // pItem : TListItem; public { Public declarations } end; var Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); var locator : ISWbemLocator; i : cardinal;
lc:TListColumn; begin
locator := CoSWbemLocator.Create(); services := locator.ConnectServer('.','root\cimv2','','','','',0,nil); refresher := CoSWbemRefresher.Create; refresherItem := refresher.AddEnum(services as ISWbemServicesEx,'Win32_PerfFormattedData_PerfProc_Process',0,nil);
timer1.Enabled := true; Refresher.Refresh(0); Listview1.OwnerData:=True;
ListView1.ViewStyle:=vsReport; lc:=ListView1.Columns.Add; lc.Caption:='PID'; lc.Width:=150; lc:=ListView1.Columns.Add; lc.Caption:='Memory'; lc.Width:=150;
ListView1.RowSelect:=true;
SetLength(arr,refresherItem.ObjectSet.Count);
ListView1.Items.Count:=Length(arr);
Caption:=IntToStr(Length(arr));
end;
procedure TForm1.Timer1Timer(Sender: TObject); var i : cardinal;
begin Refresher.Refresh(0);
SetLength(arr,refresherItem.ObjectSet.Count);
ListView1.Items.Count:=Length(arr);
Caption:=IntToStr(Length(arr));
for i:=0 to refresherItem.ObjectSet.Count-1 do begin pObject := refresherItem.ObjectSet.ItemIndex(i); pid := pObject.Properties_.Item('IdProcess',0).Get_Value; // name := pObject.Properties_.Item('Name',0).Get_Value; // usage:= pObject.Properties_.Item('PercentProcessorTime',0).Get_Value; mem:= pObject.Properties_.Item('WorkingSetPrivate',0).Get_Value;
arr[i].caption:=IntToStr(pid); arr[i].data:=mem;
pObject._Release;
end;
end;
procedure TForm1.ListView1Data(Sender: TObject; Item: TListItem); begin item.Caption:=arr[item.Index].caption; item.SubItems.Add(IntToStr(arr[item.Index].data)); end;
end.
|
|