Wenn Sie einen START-Event erhalten, können Sie einen Thread erzeugen und die Start-Parameter an diesen übergeben. Wenn Ihre Entwicklungsumgebung keine Threads unterstützt, können Sie auch im Hauptthread einen Druck starten, dann ist allerdings die Oberfläche Ihres Programms während der Erstellung nicht bedienbar.
Der Rückgabewert des Callbacks (bzw. der _lReply-Member der scLlCallback-Struktur bei Nachrichten) sollte auf eine von Ihnen vergebene eindeutige Zahl gesetzt werden, so dass Sie im FINALIZE-Event den Drilldown-Berichten dem richtigen Thread zuordnen können.
Beispiel:
…
LRESULT
lResult = 0;
case
LL_DRILLDOWN_START:
{
scLlDrillDownJob* pDDJob =
(scLlDrillDownJob*)lParam;
…
StartSubreport(pDDJob); …
// generate
new Drilldown-JobID
lResult =
++m_nUniqueDrillDownJobID;
}
case
LL_DRILLDOWN_FINALIZE:
{
scLlDrillDownJob* pDDJob =
(scLlDrillDownJob*)lParam;
if
(pDDJob->_nID == 0)
{
// clean up
}
else
{
// clean up the corresponding job
}
}
…
return (lResult);
}
…
Dieser Thread erzeugt also nach dem Kopieren der Parameter einen neuen List & Label-Job, und führt in diesem neuen Job im Wesentlichen die "ganz normale" Druckschleife aus. Abweichend zu Ihrer normalen Druckschleife müssen Sie lediglich vor dem Aufruf von LlPrintStart() folgende Änderungen durchführen:
•Setzen Sie die Option LL_OPTIONSTR_PREVIEWFILENAME auf den Pfad, der in der Struktur mit _pszPreviewFileName mitgeliefert wurde.
Beispiel:
// set preview filename
::LlSetOptionString(pMyDrillDownParameters->m_hLlJob,
LL_OPTIONSTR_PREVIEWFILENAME,
pMyDrillDownParameters
->m_sPreviewFileName);
•Übergeben Sie die _hAttachInfo, die über die Callback-Struktur übergeben wurde an List & Label, so dass der Druckjob darüber informiert wird, wo er die Daten darstellen soll.
Beispiel:
// attach viewer
::LlAssociatePreviewControl(pMyDrillDownParameters->m_hLlJob,
(HWND)pMyDrillDownParameters->_hAttachInfo,
LL_ASSOCIATEPREVIEWCONTROLFLAG_DELETE_ON_CLOSE |
LL_ASSOCIATEPREVIEWCONTROLFLAG_HANDLE_IS_ATTACHINFO);