So ließen sich anfänglich in der ersten Version über den Umweg der Datei dclusr.dpk auch ohne irgendwelche Tricks zusätzliche Komponenten installieren. Mittlerweile hat Borland durch ein Update diese Lücke jedoch geschlossen, sodass Anwender dieser Versionen auf vorinstallierte Komponenten oder dynamisch erzeugte Komponenten angewiesen ist. Dieser Artikel zeigt auf Basis des dynamischen Datenbankbeispiels aus der letzten Ausgabe des Entwickler Magazin einen flexiblen Weg auf, wie man Daten auch mit der Explorer Edition auf Papier bringen kann, obwohl keine Komponenten für die Zwecke mitgeliefert werden.
Erweiterungen in der Beispielanwendung
Zunächst wird das Projekt [1] aus optischen Gründen um eine Tpagecontrol-Komponente erweitert, auf der dann mit der rechten Maustaste zwei Tabsheets angelegt werden. Die Tabsheet-Komponente, die als Container für die Datenbankanzeigeelemente benutzt werden soll, bekommt den Namen tsDaten. Bei der dynamischen Erzeugung von Controls ist es wichtig, den Owner als Parameter für den Konstruktor zu übergeben. Dieser sollte üblicherweise das aktuelle Formular sein, welches über das Schlüsselwort self referenziert werden kann. Der Owner sorgt beim Zerstören dafür, dass alle Komponenten, die zu diesem Owner gehören, vorher zerstört werden.Bei visuellen Komponenten ist es zusätzlichen wichtig, die Eigenschaft Parent zu setzen, weil mit dieser erst der Bereich referenziert wird, auf dem die Komponente gezeichnet wird. In der ursprünglichen Version wurden dbgrid und dbnavigator direkt auf dem Formular erzeugt, in der neuen Version bekommen diese als Parent jedoch das Tabsheet tsDaten.
DBNavigator1:=TDBNavigator.create(Self);with DBNavigator1 dobeginalign:=alTop;Parent := tsDaten;Datasource:=Datasource1;end;
Wenn man sich im Internet umschaut, sieht man auch, welche Möglichkeiten sich durch den Einsatz des TWebBrowsers ergeben. Die möglichen HTML-Tags, die der Internet Explorer unterstützt, ermöglichen eine sehr flexible Druckausgabe. Mithilfe der Prozedur erzeugeDruckdaten werden nun die Daten aus der Tabelle in eine HTML-Seite geschrieben (Listing 1).
Listing 1
procedure TForm1.erzeugeDruckdaten;var i,z:integer;beginz:=0;JvUIBDataSet1.First;with TStringlist.Create dobeginadd('<html><head><title>Ausdruck</title></head><body>');add('<table style="table-layout:fixed" border="1">');add('<caption style="caption-side:bottom">Daten</caption><tr>');for I := 0 to jvuibDataset1.FieldCount-1do add('<th style="width:120px">'+jvuibDataset1.Fields[i].FieldName+'</th>');add('</tr>');while not JvUIBDataSet1.eof dobegininc(z);if z mod 20=0thenbeginadd('</table>');add('<tr><h2 style="page-break-before:always">');add('Seitenwechsel</h2></tr>');add('<table style="table-layout:fixed" border="1">');add('<caption style="caption-side:bottom">Daten</caption><tr>');for I := 0 to jvuibDataset1.FieldCount-1do add('<th style="width:120px">'+jvuibDataset1.Fields[i].FieldName+'</th>');add('</tr>');end;add('<tr>');for I := 0 to jvuibDataset1.FieldCount-1do add('<td>'+jvuibDataset1.Fields[i].AsString+'</td>');add('</tr>');JvUIBDataSet1.Next;end;add('</table>');add('</body></html>');savetofile('\x.html');free;end;end;
Die Ausgabe des Dateiinhalts im Formular als Vorschau kann nun ganz einfach mit der Routine aus Listing 2 erfolgen.
Listing 2
procedure TForm1.btnVorschauClick(Sender: TObject);beginerzeugeDruckdaten;WebBrowser1.Navigate('C:\x.html');repeatApplication.ProcessMessages;Sleep(100);until WebBrowser1.ReadyState = READYSTATE_COMPLETE;end;
Listing 3
procedure WBPrintNoDialog(WB: TWebBrowser) ;varvIn, vOut: OleVariant;beginWB.ControlInterface.ExecWB(OLECMDID_PRINT,OLECMDEXECOPT_DONTPROMPTUSER, vIn, vOut) ;end;procedure TForm1.btnDruckenClick(Sender: TObject);beginbtnVorschauClick(Sender);WBPrintNoDialog(WebBrowser1);end;



