Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Impresión
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 12-06-2006
Avatar de Elenita
Elenita Elenita is offline
Miembro
 
Registrado: jun 2005
Ubicación: Madrid
Posts: 56
Poder: 19
Elenita Va por buen camino
Access Violation al hacer SetPrinter

Hola a todos:
Haré un resumen (intentaré que sea breve) de lo que estoy haciendo a ver si podéis echarme una mano, porque estoy un poco perdida.
Al imprimir un documento Word dentro de un OleContainer, la impresora predeterminada se cambia por la elegida en el diálogo de impresión. Para evitar que se cambie la impresora por defecto, al hacer show del formulario, guardo en variables el valor de la impresora predeterminada:

Código Delphi [-]
Impresora, Driver1, Puerto: array[0..255] of Char;  
Modo: THandle;

Código Delphi [-]
procedure TFEditaWordReadOnly.FormShow(Sender: TObject);
begin
  Printer.GetPrinter(Impresora, Driver1, Puerto, Modo);
  ShowMessage('Predeterminada : ' + Impresora);
  Showmessage('Driver: ' + Driver1);
  Showmessage('Puerto: ' + Puerto);
end;

Del mismo modo, al salir del formulario, (es un formulario modal y se sale de él con un botón) asigno a la impresora estos valores para poder dejar todo como estaba:

Código Delphi [-]
procedure TFEditaWordReadOnly.ToolButtonSalirClick(Sender: TObject);
var
  Save_Cursor: TCursor;
begin
  Save_Cursor := Screen.Cursor;
  Screen.Cursor := crHourglass;
  try
    modalResult := mrOk;
  finally
    Printer.SetPrinter(Impresora, Driver1, Puerto, Modo);
    Screen.Cursor := Save_Cursor;
  end;
end;

Pues bien, el problema es el siguiente:
Si la impresora predeterminada es una impresora "real" todo funciona perfectamente, pero si la impresora predeterminada es una impresora "virtual", del tipo Acrobar Writer, FinePrint, etc al hacer SetPrinter da un "access violation". Supongo que el problema está en que Modo es null, porque si en lugar de modo pongo un 0 no sale el "access violation"

Código Delphi [-]
Printer.SetPrinter(Impresora, Driver1, Puerto, Modo);

(Esto lo vi en un hilo https://www.clubdelphi.com/foros/showthread.php?t=11875)

Pero si pongo un 0 entonces no vuelve a poner bien la impresora predeterminada.

Tampoco entiendo muy bien las variables del tipo THandle, por lo que no tengo ni idea de lo que estoy haciendo cuando pongo un 0.

¿Alguna idea de como eliminar el Access Violation?

Gracias a todos.

Última edición por dec fecha: 12-06-2006 a las 21:08:24.
Responder Con Cita
  #2  
Antiguo 19-06-2006
Avatar de Elenita
Elenita Elenita is offline
Miembro
 
Registrado: jun 2005
Ubicación: Madrid
Posts: 56
Poder: 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
  #3  
Antiguo 19-06-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Elenita
(...) he solucionado mi problemilla (...)
No dude nunca de que serías capaz de hacerlo.

Gracias además por compartir la solución, para quien, como dices, pudiera hacerle falta.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #4  
Antiguo 19-06-2006
Avatar de Elenita
Elenita Elenita is offline
Miembro
 
Registrado: jun 2005
Ubicación: Madrid
Posts: 56
Poder: 19
Elenita Va por buen camino
Pues confiabas más en mí que yo misma...
Responder Con Cita
  #5  
Antiguo 17-11-2006
lento manu lento manu is offline
Miembro
 
Registrado: oct 2004
Posts: 29
Poder: 0
lento manu Va por buen camino
OleContainer.OleObject... 'inteface not supported'

Elenita, desde luego ya has ido muy lejos.

Estoy intentando aplicar TOlecontainer, para abrir documentos guardados con SaveToFile.

El principal problema es com Word, que desde el menú contextual popup que se genera en Olecantainer, 'Modificar' y 'Abrir', el documento se abre, con ambas opciones, embebido en mi aplicación.
Todo el menú archivo está deshabilitado en ambos modos, sin embargo con Exel no me pasa esto, la opción 'Abrir' edita el documento en la propia aplicación Exel donde tengo disponible el menú Archivo y las opciones de impresión. En Word no dispongo de la opción de Menú 'Archivo', por lo que no puedo previsualizar la impresión ni guardar una copia a disco; asimismo, los iconos de preview están deshabilitados.

Con el código editado en este hilo, pensaba encontrar alguna solución, pero se me genera la excepción 'Interface not supported'. Las búsquedas por internet de estos conceptos no me han ayudado nada.

Lo he probado en D6 y D2005 con exactos resultados. El código se compila pero al llegar a OleContainer.OleObject.Application... se produce el error de ejecución. En mis delphis, tampoco el editor me ofrece ayuda a completar OleContainer.OleObject...
¿me falta enlazar alguna Unit (añadido 'Variants')? o es ¿necesario alguna opción de compilación?
¿Se puede añadir un menú 'Printpeview' al popup de Olecontainer?
¿Dónde puedo encontrar ayuda para la manipulación de OleObject? (perdón por tantas preguntas)
Mi office es la versión 2000.

Gracias a todos...

Última edición por lento manu fecha: 17-11-2006 a las 12:44:42.
Responder Con Cita
  #6  
Antiguo 20-11-2006
Avatar de Elenita
Elenita Elenita is offline
Miembro
 
Registrado: jun 2005
Ubicación: Madrid
Posts: 56
Poder: 19
Elenita Va por buen camino
Interface not supported

Perdona que te conteste de forma rápida, pero ando un poco liada. Prometo hacerlo de manera más detallada en un par de días.
No sé si tienes añadida la unidad word2000.pas, si no es así deberías hacerlo. Siempre que he tenido ese mensaje de error ha sido porque utilizaba una versión distinta de word. Dependiendo del proyecto a veces utilido word97 y otra word2000, y las propiedades varían de unas a otras.
Por ahora no se me ocurre nada más, pero lo miraré detenidamente.
Si pudieras mostrarme el código y decirme exactamente dónde te da el error te lo agradecería.
Un saludo.
(De todas formas creo que para el problema de tu tienes deberíamos abrir un nuevo hilo en la sección SERVERS.)

Última edición por Elenita fecha: 20-11-2006 a las 14:39:16.
Responder Con Cita
  #7  
Antiguo 20-11-2006
lento manu lento manu is offline
Miembro
 
Registrado: oct 2004
Posts: 29
Poder: 0
lento manu Va por buen camino
interface not supported

Gracias por la ayuda.
Ya he añadido el word2000.pas al uses del form. Pero todo sigue igual. El contenido de este pas tampoco lo interpreto de momento
Con la linea:

Código Delphi [-]a :=OleContainer.OleObject.Application.ActiveDocument.FullName;


ya da el error 'interface not supported'.
Y así con otras líneas de código q encuentro por Google o Yahoo, de la poquísima info que aparece.
Mañana con más tiempo, abro el nuevo hilo.
Muchas gracias.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Access Violation Carliviris Varios 5 12-05-2006 19:21:45
Access violation at .... Perio Varios 5 07-02-2006 15:50:36
access violation chilenauta Impresión 15 15-12-2004 19:45:51
Access Violation ..... MADV01 Varios 2 24-03-2004 16:01:33
Access violation Giasl Varios 6 07-05-2003 12:35:51


La franja horaria es GMT +2. Ahora son las 22:16:31.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi