úterý 5. ledna 2010

SysRecurrence

Formulář SysRecurrence slouží k definici opakování nějaké úlohy. Nejčastěji se používá pro nastavení dávkových úloh, takže lze například určit, že se má přepočet skladu spouštět automaticky každou sobotu. V základní podobě vypadá nějak takto: V horní části se nastavuje datum, čas (+ časové pásmo) prvního spuštění a případná ukončovací podmínka (po určitém počtu opakování nebo k určitém datu). V dolní části se pak definuje, jak se má úloha opakovat. Podle zvolené jednotky (minuty, hodiny, dny…) se v pravé části zobrazují další volby, například počet minut či den v týdnu. V případě dávkových úloh je tento formulář přístupný pomocí tlačítka Opakování (Recurrence) v dialogu dávkové úlohy:Získanou definici opakování je samozřejmě možné použít nejen pro dávkové úlohy, ale i třeba pro jednorázové generování plánovaných periodických úkolů a podobně. Implementace Otevřete-li formulář SysRecurrence v AOT, zjistíte, že Design je zcela prázdný. Design je totiž generován dynamicky na základě zadaných parametrů – je možné například vybrat jen určité jednotky nebo umožnit nastavit jen datum startu a nikoli konkrétní čas. Tuto logiku obstarává třída SysRecurrenceBuild. Z třídy SysRecurrenceBuild lze získat uživatelem zadané parametry opakování pomocí metody recurrence(). Ta vrací hodnotu typu SysRecurrenceData, což není nic jiného než obyčejný kontejner (v SysRecurrenceBuild.update() můžete prozkoumat způsob jeho plnění). SysRecurrenceData je pak možné zpracovávat pomocí třídy SysRecurrence. Ta poskytuje například metodu next(), vracející datum a čas dalšího opakování nebo metody čtoucí či modifikující SysRecurrenceData (např. setRecurrenceStartDate()). Použití může vypadat například takto:
SysRecurrenceBuild  recurrenceBuild = new SysRecurrenceBuild();
SysRecurrence       recurrence = new SysRecurrence();
SysRecurrenceData   recurrenceData;
date                runDate;
timeOfDay           runTime;
;

recurrence.initBuildDialog(recurrenceBuild);
recurrence.runBuildDialog();
recurrenceData = recurrence.recurrence();

if (recurrenceBuild.closeOk())
{
   runDate = SysRecurrence::getRecurrenceStartDate(recurrenceData);
   runTime = SysRecurrence::getRecurrenceTime(recurrenceData);

   while (runDate)
   {
       info(strFmt("%1 %2", runDate, time2str(runTime, -1, -1)));
       [runDate, runTime] = SysRecurrence::next(recurrenceData, runDate, runTime);
   }
}
Pokud jsou před vyvoláním dialogu změněny parametry SysRecurrenceBuild, vygeneruje se odlišný formulář. Například zavoláním
recurrenceBuild.addUnit(SysRecurrenceUnit::Day);
recurrenceBuild.addUnit(SysRecurrenceUnit::Week);
recurrenceBuild.addUnit(SysRecurrenceUnit::Month);
recurrenceBuild.showTime(false);
získá dialog následující podobu: Podobná, byť o něco složitější implementace se nachází ve třídě SysRecurrenceRun. Právě tato třída je volána z dialogu dávkových úloh (tlačítko je automaticky přidáno v BatchInfo.dialog()). Kromě podpory dávkových úloh umožňuje SysRecurrenceRun snadnou implementaci do libovolného formuláře – stačí přidat menu item SysRecurrenceRun a implementovat metodu recurrence(), kam SysRecurrenceRun předá kontejner SysRecurrenceData. Dále jsou podporované metody recurrenceText() pro textový popis opakování a recurrenceUnits() a recurrenceShowTime() pro ovlivnění designu formuláře. Ukázku lze najít na formuláři Tutorial_Recurrence.

1 komentář:

  1. Tomáš Trávníček19. dubna 2010 13:13

    Tak člověk hledá na Googlu informace o SysRecurrenceBuild a co mu nevyběhne jako první odkaz :)

    OdpovědětVymazat