Ver Mensaje Individual
  #2  
Antiguo 19-06-2006
Avatar de Elenita
Elenita Elenita is offline
Miembro
 
Registrado: jun 2005
Ubicación: Madrid
Posts: 56
Reputación: 19
Elenita Va por buen camino
Solución al problema

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); //Guarda la impresora predeterminada
  a := OleContainer.OleObject.Application.ActiveDocument.FullName;
  if PrintDialog1.Execute then
    begin
      Printer.GetPrinter(Device, Driver, Port, hDeviceMode);//Guarda la impresora elegida en el dialog
      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;
Responder Con Cita