Hallo zusammen,
ich habe folgendes Problem:
Mit eigens dafür geschriebenen Komponenten erzeuge ich Berichte im
HTML-Format. Da ich diese Berichte auch atomatisiert auf den Drucker ausgeben muss habe ich mir damals folgendes Programm dafür gebaut:
Delphi-Quellcode:
{ drucken des Berichts (Internet Explorer) }
procedure TReport.NavigateComplete(Sender: TObject;
const pDisp: IDispatch;
var URL: OleVariant);
var
vaOut: OleVariant;
IECommand: IOleCommandTarget;
begin
try
IECommand := (Sender
as TWebBrowser).Document
as IOleCommandTarget;
IECommand.Exec(
nil, OLECMDID_PRINT, OLECMDEXECOPT_DONTPROMPTUSER, EmptyParam, vaOut);
finally
FPrinting := False;
end;
end;
{ Bericht drucken }
function TReport.Print: Boolean;
const
TempFile = '
temp.html';
var
WebBrowser: TWebBrowser;
Timeout: Integer;
begin
PrintSema.Enter;
try
DeleteFile(iniRepRoot + '
\' + TempFile);
if SaveToFile(iniRepRoot + '
\' + TempFile)
then
begin
try
WebBrowser := TWebBrowser.Create(
nil);
try
WebBrowser.OnNavigateComplete2 := NavigateComplete;
Sleep(200);
WebBrowser.Navigate(iniRepRoot + '
\' + TempFile, navNoReadFromCache);
FPrinting := True;
Timeout := 0;
while Timeout < 500
do
begin
Sleep(10);
Application.ProcessMessages;
if not FPrinting
then
Break;
Inc(Timeout);
end;
Result := Timeout < 500;
finally
WebBrowser.Free;
end;
except
on E:
Exception do
begin
ELog.LogDebug(E.
Message);
Result := False;
end;
end;
end
else
Result := False;
finally
PrintSema.Leave;
end;
end;
Das ganze funktioniert seit Jahren auf 2003er Servern und XP sehr gut. Unter Vista funktioniert es leider nicht mehr. Der Internet-Explorer unter Vista lädt immer ein temporäres Dokument aus dem Cache und nicht die angegeben Datei (Temp.html). Das Ergebis ist, dass ein leeres Dokument gedruckt wird.
Zuerst habe ich auf die Sicherheitseinstellungen des Internet-Explorers getippt. Aber auch wenn ich da alles deaktiviere erhalte ich das gleiche Ergebnis.
Hat jemand eine Idee, was da schief läuft? Oder hat jemand eine Idee wie man den Druck von
HTML-Dokumenten im Hintergrund (aus einer Thread) sonst gestalten könnte?
Die Lösung über HTMLs habe ich damals gewählt, da ich mit diesen recht einfach die Anforderung nach der
UNICODE-Fähigkeit erfüllen konnte.
Für eure Antworten schonmal vielen Dank.
Alex
Man sollte nie so viel zu tun haben, dass man zum Nachdenken keine Zeit mehr hat. (G.C. Lichtenberg)