Os cuento cómo he solucionado mi problemilla, por si puede ser de utilidad a alguien en el foro.
El problema surge al intantar imprimir un documento word dentro de un OLE Container y seleccionar la impresora. El contenedor está en un formulario modal del que se sale con un botón.
El código que utilizo para imprimir es el siguiente:
Código Delphi
[-]
procedure TFEditaWordReadOnly.tbImprimirClick(Sender: TObject);
var a: string;
Device, Driver, Port: array[0..255] of Char;
hDeviceMode: THandle;
begin
Printer.PrinterIndex := -1;
Device := '';
Printer.GetPrinter(Impresora, Driver1, Puerto, Modo); a := OleContainer.OleObject.Application.ActiveDocument.FullName;
if PrintDialog1.Execute then
begin
Printer.GetPrinter(Device, Driver, Port, hDeviceMode); if Device <> Impresora then CambiaImpresora := true;
OleContainer.OleObject.Application.Documents.Item(a).Activate;
a := Device;
OleContainer.OleObject.Application.ActivePrinter := a;
OleContainer.OleObject.Application.ActiveDocument.PrintOut;
end;
end;
(Impresora, Driver1, Puerto, Modo son variables globales)
Al salir del formulario, volvemos a dejar la impresora como estaba. Al intentar hacerlo con SetPrinter aparecía el Access Violation así que si asignamos la impresora al objeto Word del contenedor solucionaremos el problema.
Código Delphi
[-]
procedure TFEditaWordReadOnly.ToolButtonSalirClick(Sender: TObject);
var
Save_Cursor:TCursor;
a: string;
begin
Save_Cursor := Screen.Cursor;
Screen.Cursor := crHourglass;
try
modalResult := mrOk;
if CambiaImpresora then
try
a := Impresora;
OleContainer.OleObject.Application.ActivePrinter := a;
except
on E: Exception do ShowMessage('Revise la impresora predeterminada.');
end;
finally
Screen.Cursor := Save_Cursor;
end;
end;