1

Тема: Сортировка списка в CreateListView (WindowSystemObject)

Вот есть пример скрипта, который выводим список процессов Windows. Оконный интерфейс реализован через компонент WindowSystemObject. Всего тир колонки. Вопрос, как осуществить сортировку данных по заданной колонке. В справке WSO все очень запутано:


//**************************************************************************
// Список процессов Windows
// process_list.js
//**************************************************************************

// Формируем ссылки на объект
var WSO = new ActiveXObject("Scripting.WindowSystemObject");
var WshShell = new ActiveXObject("WScript.Shell");
var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");

var list_view_obj, shared_data_array = [];
var Button_Update

// ************************* Параметры формы ************************************************
var f = WSO.CreateForm(0, 0, 0, 0, WSO.Translate("WS_CONTROLBOX | WS_MINIMIZEBOX"));
with(f){
    Text = "Список процессов Windows";
    ClientWidth = 700;
    ClientHeight = 600;
    CenterControl();
}

//********************************************************************************
//                  Управляющик кнопки
//********************************************************************************

// Обновить списк служб
Button_Update = f.CreateButton(530,10,100,25,"Обновить список");
Button_Update.OnClick = ServiceUpdate;


// функция для формирования массива с данными
function fill_data_array(data_array){
var objItem, colItems
   data_array.length = 0; // !!!!!
    
    // формируем коллекцию служб
    colItems = new Enumerator(objWMIService.ExecQuery("Select * from Win32_Process"));
    
    
    // произвдим перебор коллекции
    for (; !colItems.atEnd(); colItems.moveNext()){
        objItem = colItems.item();
        
        // добавляем в массив объект
        data_array.push({
            Caption: objItem.Caption,
            ParentProcessId: objItem.ParentProcessId,
            ProcessId: objItem.ProcessId
        });
    }
};
//***************************************************************


// массив с данными
var def_columns = [
    { name: "Описание",      width: 100, type: 1, 
        set_data: function(item, data) { item.Text = data.Caption;        }},
            
    { name: "PID родителя",      width:  100, type: 1, 
        set_data: function(item, data) { item.SubItems(0) = data.ParentProcessId;  } },
                                    
    { name: "PID",      width:  80, type: 1, 
        set_data: function(item, data) { item.SubItems(1) = data.ProcessId;  } }
];


// Формируем панель со списком
function CreateListView(){
    //Создаем объект ListView
    list_view_obj = f.CreateListView( 0, 0, 500, 600,WSO.Translate("LVS_REPORT | LVS_OWNERDATA | LVS_SHOWSELALWAYS"));
    //Свойства объекта ListView
    list_view_obj.GridLines = true;
    list_view_obj.RowSelect = true;
    list_view_obj.ReadOnly = false;
    list_view_obj.ItemIndex = 1;
    
    /*--------------------------------------------------------------*/
    //         Определяем имя и тип колонок
    /*--------------------------------------------------------------*/
   
    for(var ix = 0; ix < def_columns.length; ++ix){
        var def_col = def_columns[ix];
        var column = list_view_obj.Columns.Add(def_col.name, def_col.width);
        column.DataType = def_col.type;
    }
    
    /*--------------------------------------------------------------*/
    //                задаем обработчик событий
    /*--------------------------------------------------------------*/
    list_view_obj.OnData = function (sender, item){
        //начало
        sender.BeginUpdate();  
        //задаем текущий элемент
        // массив shared_data_array является обработчиком через него идет обработка событий
        var data = shared_data_array[item.Index];
        
        //назначаем свойства для текущего элемента
        for(var ix = 0; ix < def_columns.length; ++ix){
            def_columns[ix].set_data(item, data);
        }
        
        //конец
        sender.EndUpdate();
    };
    /* callbacks *************************************************** */
    
    // вызываем функцию получения списка данных
    fill_data_array(shared_data_array);
    //Определяем количество элементов
    list_view_obj.Count = shared_data_array.length; 
};

// Функция обновления списка
function ServiceUpdate(){
    //очищаем поле с данными
    list_view_obj.Clear();
    
    fill_data_array(shared_data_array);
    list_view_obj.Count = shared_data_array.length; // !!!!!
};

//вызываем функцию для формирования списка
CreateListView();

f.Show();
WSO.Run();

2

Re: Сортировка списка в CreateListView (WindowSystemObject)

Пробовал использовать событие OnColumnClick и метод Sort, но возникает ошибка


list_view_obj.OnColumnClick = function (sender, item){
        list_view_obj.Sort()
    //WScript.Echo(item.Index);
        
    };

3

Re: Сортировка списка в CreateListView (WindowSystemObject)

Какая именно ошибка? Я тоже попробовал метод Sort, но получаю сообщение, что команда не поддерживается объектом.

4

Re: Сортировка списка в CreateListView (WindowSystemObject)

С проблемой разобрался!


// Формируем ссылки на объект
var WSO = new ActiveXObject("Scripting.WindowSystemObject");
var FSO = new ActiveXObject("Scripting.FileSystemObject");
var WshShell = new ActiveXObject("WScript.Shell");
var objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");

var list_view_obj, data_array = [];

// ************************* Параметры формы ************************************************
var f = WSO.CreateForm(0, 0, 0, 0, WSO.Translate("WS_CONTROLBOX | WS_MINIMIZEBOX"));
with(f){
    Text = "Менеджер служб Windows";
    ClientWidth = 700;
    ClientHeight = 600;
    CenterControl();
}

// функция для формирования массива с данными
function fill_data_array(){
var objItem, colItems
   data_array.length = 0; // !!!!!
    
    // формируем коллекцию служб
    colItems = new Enumerator(objWMIService.ExecQuery("Select * from Win32_Process"));
    
    
    // произвдим перебор коллекции
    for (; !colItems.atEnd(); colItems.moveNext()){
        objItem = colItems.item();
        
        // добавляем в массив объект
        data_array.push({
            Caption: objItem.Caption,
            ParentProcessId: objItem.ParentProcessId,
            ProcessId: objItem.ProcessId
        });
    }
};
//***************************************************************


// массив с данными
var def_columns = [
    { name: "Описание",      width: 100, type: 1, 
        set_data: function(item, it) { item.Text = data_array[it].Caption; }},
            
    { name: "PID родителя",      width:  100, type: 1, 
        set_data: function(item, it) { item.SubItems(0) = data_array[it].ParentProcessId; } },
                                    
    { name: "PID",      width:  80, type: 1, 
        set_data: function(item, it) { item.SubItems(1) = data_array[it].ProcessId;  } }
];


// Формируем панель со списком
function CreateListView(){
    //Создаем объект ListView
    list_view_obj = f.CreateListView( 0, 0, 500, 600,WSO.Translate("LVS_REPORT | LVS_SHOWSELALWAYS"));
    //Свойства объекта ListView
    list_view_obj.GridLines = true;
    list_view_obj.RowSelect = true;
    list_view_obj.ReadOnly = false;
    
    /*--------------------------------------------------------------*/
    //         Определяем имя и тип колонок
    /*--------------------------------------------------------------*/
   
    for(var ix = 0; ix < def_columns.length; ++ix){
        var def_col = def_columns[ix];
        var column = list_view_obj.Columns.Add(def_col.name, def_col.width);
        column.DataType = def_col.type;
    }
    
    /*--------------------------------------------------------------*/
    //                задаем обработчик событий
    /*--------------------------------------------------------------*/

    
        fill_data_array();
        list_view_obj.Count = data_array.length; 
        //назначаем свойства для текущего элемента
        for(var ix = 0; ix < def_columns.length; ++ix){
            for (iy=0; iy<list_view_obj.Count; iy++){
                def_columns[ix].set_data(list_view_obj.item(iy), iy);
            }
        }    
};

//вызываем функцию для формирования списка
CreateListView();

f.Show();
WSO.Run();

5

Re: Сортировка списка в CreateListView (WindowSystemObject)

А как собственно у вас происходит сортировка?
Пример рабочий, но не понятно...
И еще, как подобная конструкция будет выглядеть на VBS?

Автоматизирую торговлю. Не 1С

6

Re: Сортировка списка в CreateListView (WindowSystemObject)

Сортировку производит сам контрол ListView. Раньше этому, видимо, мешал стиль LVS_OWNERDATA, при котором приложение, использующее ListView, должно само реализовать сортировку.

7 (изменено: Mat Skywalker, 2013-08-23 10:44:18)

Re: Сортировка списка в CreateListView (WindowSystemObject)

Не выходит. Переписал на VBS, сортировки нету, хоть убей. А как это у вас происходит? Нажатие на колонку не отрабатывается, насколько я вижу...

Автоматизирую торговлю. Не 1С

8

Re: Сортировка списка в CreateListView (WindowSystemObject)

Видимо, что-то неправильно переписали.

9

Re: Сортировка списка в CreateListView (WindowSystemObject)

Видимо

Автоматизирую торговлю. Не 1С