Проект не прицепил по 2-м причинам. Во первых, мне казалось все очевидно. Во вторых, проект сильно завязан на другой большой проект, частью которого он является.
Поэтому предложение - я сейчас распишу все куски кода, если что-то будет все-таки не понятно, подготовлю тестовый пример.
Итак:
1. Создаем форму, размещаем на ней ListView (listCtrl)
2. На форме создаем методы:
class declaration
X++:
boolean pulse; // для мигания стрелки
int timer; // для тайминга прорисовки
init():
X++:
public void init()
{
;
super();
listCtrl.addColumn(1, new FormListColumn("Операция", 1, 200));
listCtrl.addColumn(2, new FormListColumn("Прогресс", 2, 80));
imageList = gm_txRegMainClass::createImageList(['gm_archive', 'gm_next', 'gm_back', 'final']);
listCtrl.setImagelist(imageList);
timer = WinApi::getTickCount();
}
Вызов статического метода - это я конструирую imageList из АОТ.Resource.
Метод, который отображает перечень задач:
X++:
void setActionList(gm_containerCollection _actions)
{
gm_ContainerEnumerator enumerator = _actions.getEnumerator();
FormListItem item;
int idx;
;
while (enumerator.moveNext())
{
item = new FormListItem(enumerator.current(), 0);
idx = listCtrl.addItem(item);
listCtrl.setText(idx, '0%', 1);
}
WinApi::updateWindow(element.hWnd());
}
Это простое запонение listView + установка иконки.
Метод отображающий прогресс операции:
X++:
void setPercent(int _idx, str _percent)
{
FormListItem item;
;
item = listCtrl.getItem(_idx);
if (WinApi::getTickCount() - timer > 500)
{
if (pulse)
item.image(1);
else
item.image(2);
pulse = !pulse;
timer = WinApi::getTickCount();
listCtrl.setItem(item);
listCtrl.setText(item.idx(), _percent, 1);
WinApi::updateWindow(element.hWnd());
}
}
Передали номер задачи + текст (сколько то там процентов).
Для удобства метод завершения задачи:
X++:
void setFinalStatus(int _idx)
{
this.setPercent(_idx, 'Готово');
this.changeImage(_idx, 3);
}
Примерный способ использования:
X++:
// Показ формы
object initProgressBar(container _steps)
{
Args args = new Args();
Object formRunObject;
FormRun formRun;
;
args.name(formstr('gm_reportProgressForm'));
formRun = ClassFactory.formRunClass(args);
formRun.init();
formRun.run();
formRunObject = formRun;
formRunObject.setActionList(new gm_ContainerCollection(_steps));
formRunObject.setCaption('Сбор значений');
return formRunObject;
}
void run()
{
progressBar = this.initProgressBar([' Сохранение документа',' Захват значений', ' Учет настроек HQ консолидации',' Составление списка ячеек', ' Удаление старых значений', ' Открытие файла']);
this.openDocument();
progressBar.setFinalStatus(0); // мы сделали первую задачу
delete_from values where values.ReportId == report.ReportId;
progressBar.setFinalStatus(1); // мы сделали вторую задачу
num = this.total();
cnt = 0;
while select valuesSetup where valuesSetup.ReportType == report.ReportType
{
this.processCellSetup(valuesSetup.SheetName, valuesSetup.ExcelLabel);
cnt++;
progressBar.setPercent(2, strfmt('%1', cnt/num * 100) + '%'); // отображаем процесс длиетльной операции
}
progressBar.setFinalStatus(2); // мы сделали третью задачу
// ....
p.s. Я показал 99% полезного кода. 1% - если что-то забыл.