進行状況インジケーターを表示する

適用対象: Outlook 2013 | Outlook 2016

進行状況インジケーターを表示するには、 IMAPIProgress::GetFlags を呼び出して、現在のフラグ設定を取得します。

MAPI_TOP_LEVEL フラグが設定されている場合は、次の手順を実行します。

  1. 操作で処理する項目の合計数に等しい変数を設定します。 たとえば、フォルダーの内容をコピーする場合、この値はフォルダー内のサブフォルダーの数とメッセージの数と等しくなります。

  2. 1000 を項目数で割った値に等しい変数を設定します。

  3. サブオブジェクトの進行状況を表示する場合は、progress オブジェクトの IMAPIProgress::SetLimits メソッドを呼び出し、3 つのパラメーターに次の値を渡します。

    • lpulMin パラメーターを 0 に設定します。

    • lpulMax パラメーターを 1000 に設定します。

    • lpulFlags パラメーターを MAPI_TOP_LEVEL に設定します。

  4. 処理するオブジェクトごとに、次の手順を実行します。

    1. IMAPIProgress::SetLimits を呼び出し、3 つのパラメーターに次の値を渡します。
    • lpulMin パラメーターを、手順 2 で設定した変数に現在の項目から 1 を乗算した値に設定します。

    • lpulMax パラメーターを、手順 2 で設定した変数に現在のオブジェクトを乗算した値に設定します。

    • lpulFlags パラメーターを 0 に設定します。

    1. このオブジェクトに対して実行する必要がある処理を実行します。 これがサブオブジェクトで、サブオブジェクトに進行状況を表示する場合は、 lpProgress パラメーターの progress オブジェクトへのポインターを メソッドに渡します。

    2. IMAPIProgress::P rogress を呼び出し、3 つのパラメーターに次の値を渡します。

    • ulValue パラメーターを、手順 2 で設定した変数に現在のオブジェクトを乗算した値に設定します。

    • ulCount パラメーターを現在のオブジェクトに設定します。

    • ulTotal パラメーターを、手順 1 で設定した変数 (オブジェクトの合計数) に設定します。

MAPI_TOP_LEVEL フラグが設定されていない場合は、次の手順を実行します。

  1. 進行状況オブジェクトの IMAPIProgress::GetMin メソッドを呼び出して、表示の最小値を取得します。

  2. IMAPIProgress::GetMax を呼び出して、ディスプレイの最大値を取得します。

  3. 処理するオブジェクトの合計数に等しい変数を設定します。

  4. 最大値から最小値を減算し、オブジェクトの合計数で除算した結果と等しい変数を設定します。

  5. 処理するオブジェクトごとに、次の手順を実行します。

    1. プロバイダーがサブオブジェクトの進行状況を示している場合は、 IMAPIProgress::SetLimits を呼び出し、3 つのパラメーターに次の値を渡します。
    • lpulMin パラメーターを最小値に加え、現在の項目から 1 を減算し、手順 4 で設定した変数を乗算します。

    • lpulMax パラメーターを最小値に、現在の単位に手順 4 で設定した変数を乗算した値に設定します。

    • lpulFlags パラメーターを 0 に設定します。

    1. このオブジェクトに対して実行する必要がある処理を実行します。 オブジェクトがサブオブジェクトであり、プロバイダーがサブオブジェクトの進行状況を表示する場合は、 lpProgress パラメーターの progress オブジェクトへのポインターを メソッドに渡します。

    2. IMAPIProgress::P rogress を呼び出し、3 つのパラメーターに次の値を渡します。

    • 手順 2 で設定した変数に ulValue パラメーターを設定し、現在のオブジェクトを乗算します。

    • ulCount パラメーターを 0 に設定します。

    • ulTotal パラメーターを 0 に設定します。

次のコード例は、5 つのサブフォルダーを含むフォルダーの内容をコピーする操作のすべてのレベルで進行状況を表示するために必要なロジックを示しています。

lpProgress->GetFlags (lpulFlags);
ulFlags = *lpulFlags;
/* The folder in charge of the display. It contains 5 subfolders. */
if (ulFlags & MAPI_TOP_LEVEL)
{
    ulItems = 5                         // 5 subfolders in this folder
    ulScale = (ulMax / ulItems)         // 200 because ulMax = 1000
    lpProgress->SetLimits(0, ulMax, MAPI_TOP_LEVEL)
    for (i = 1; i <= ulItems; i++)      // for each subfolder to copy
    {
        lpProgress->SetLimits( (i - 1) * ulScale, i * ulScale, 0)
        CopyOneFolder(lpFolder(i), lpProgress)
        lpProgress->Progress( i * ulScale, i, ulItems)
    }
}
else
/* One of the subfolders to be copied. It contains 3 messages. */
{
    lpProgress->GetMin(&ulMin);
    lpProgress->GetMax(&ulMax);
    ulItems = 3;
    ulDelta = (ulMax - ulMin) / ulItems;
    for (i = 1; i <= ulItems; i++)
    {
        lpProgress->SetLimits(ulMin + (i - 1) * ulDelta,
                              ulMin + i * ulDelta, 0)
        CopyOneFolder(lpFolder(i), lpProgress)
        /* Pass 0 for ulCount and ulTotal because this is not the */
        /* top-level display, and that information is unavailable */
        lpProgress->Progress( i * ulDelta, 0, 0)
    }
}
 

関連項目