Показать сообщение отдельно
Старый 09.08.2007, 14:14   #12  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Проект не прицепил по 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% - если что-то забыл.

Последний раз редактировалось Андре; 09.08.2007 в 14:29.
За это сообщение автора поблагодарили: kashperuk (4).