Облагораживаем WSO. Контекстное меню ListView и работа с большим объемом данных.

Недавно, пообщавшись с Александром Борисовичем, я познал истину вызова контекстного меню для ListView.
Вас ждет пример вызова контекстного меню, а так же один из вариантов решения по заполнению таблицы большого объема.
Напоминаю, что WSO это библиотека для обеспечения доступа к оконной подсистеме Windows на базе архитектуры COM, для создания оконных интерфейсов в программах, написанных на сценарных (скриптовых) языках, а также в программах, написанных на других языках и в других системах программирования. С помощью WSO можно легко создавать оконные интерфейсы на JScript, VBScript, Perl, Python (с) www.veretennikov.org

o = new ActiveXObject("Scripting.WindowSystemObject") // Подключились к COM объекту
f = o.CreateForm(0,0,0,0)
f.ClientWidth = 550
f.ClientHeight = 350
f.CenterControl() // Создаем окно по центру экрана
f.Text = "Press right mouse button on an item"
f.BorderWidth = 10
f.MinWidth = 500
f.MinHeight = 350
Box = f.CreateListView(10,10,250,300,o.Translate("LVS_REPORT | LVS_SHOWSELALWAYS")) // Таблица в виде ListView report
Box.HotTrack = true
Box.RowSelect =true
Box.Align = o.Translate("AL_CLIENT");
 r1=Box.Columns.Add ("ID", 40);
 r2=Box.Columns.Add ("Sub 0", 90);
 r3=Box.Columns.Add ("Sub 1", 250)	;
 r4=Box.Columns.Add ("Sub 2", 140)	;
 r5=Box.Columns.Add ("Sub 3", 40); // Всего 5 колонок
Box.BeginUpdate () // Метод запрещает обновление компонента после изменения коллекции, полезно вызывать этот метод перед добавлением большого количества элементов.
// Окно не будет моргать при заполнении таблицы
for (i = 0; i<100000; i++) // Много тестовых значений
{
        Box.Add("Item "+i)
		Box.item(i).SubItems(0)="SubItem "+i
		Box.item(i).SubItems(1)="SubItem "+i
		Box.item(i).SubItems(2)="SubItem "+i
		Box.item(i).SubItems(3)="SubItem "+i
}
Box.EndUpdate () //Метод разрешает обновление компонента после изменения коллекции.
Box.ReadOnly = false
Box.PopupMenu.Add("Select item").OnExecute = OnSelectItem // Вызов контекстного меню 1 пункт.
Box.PopupMenu.Add("Delete item").OnExecute = OnDell // Вызов контекстного меню 2 пункт.

function OnDell(Sender) // Действие вызванное нажатием Delete item
{
        var ListView = Sender.Control
        var Index = ListView.ItemIndex
        ListView.Remove(Index)
}

function OnSelectItem(Sender) // Действие вызванное нажатием Select item
{
        var ListView = Sender.Control
        var Index = ListView.ItemIndex
        if (Index < 0) f.Text = "No item selected"; else        
                f.Text = ListView.Item(Index).Text + " "+ListView.item(ListView.ItemIndex).SubItems(1)
}
f.Show()
o.Run()

Выражаю благодарность за создание данного примера Александра Борисовича.
В будущем напишу пример сортировки ListView, алгоритм удаления повторяющихся записей, работу с объектом TreeView.