Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Imprimir en Word (https://www.clubdelphi.com/foros/showthread.php?t=36404)

Carliviris 11-10-2006 00:01:07

Imprimir en Word
 
Saludos a todos:

Estoy haciendo replace en un documento de word y todo esta muy bien. Lo unico que me falta es encontrar la manera de mandarlo a imprimir, opcion que se me ha hecho muy dificil de encontrar. Aca les dejo un ejemplo del codigo que estoy utilizando para hacer los replaces a ver si algunos de ustedes ha trabajado con este o tiene alguna idea de como hacer el mandato de imprimir. Todas las formas que creo que son me han resultado erroneas. Aqui esta:

Código Delphi [-] usesComObj;// Replace FlagstypeTWordReplaceFlags = set of (wrfReplaceAll, wrfMatchCase, wrfMatchWildcards);function Word_StringReplace(ADocument: TFileName; SearchString, ReplaceString: string; Flags: TWordReplaceFlags): Boolean;constwdFindContinue = 1; wdReplaceOne = 1; wdReplaceAll = 2; wdDoNotSaveChanges = 0; varWordApp: OLEVariant;beginResult := False;{ Check if file exists }if not FileExists(ADocument) then begin ShowMessage('Specified Document not found.'); Exit; end;{ Create the OLE Object }tryWordApp := CreateOLEObject('Word.Application');except on E: Exception do begin E.Message := 'Word is not available.'; raise;end;end;try{ Hide Word }WordApp.Visible := False;{ Open the document }WordApp.Documents.Open(ADocument);{ Initialize parameters}WordApp.Selection.Find.ClearFormatting; WordApp.Selection.Find.Text := SearchString; WordApp.Selection.Find.Replacement.Text := ReplaceString; WordApp.Selection.Find.Forward := True; WordApp.Selection.Find.Wrap := wdFindContinue; WordApp.Selection.Find.Format := False; WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags; WordApp.Selection.Find.MatchWholeWord := False; WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags; WordApp.Selection.Find.MatchSoundsLike := False; WordApp.Selection.Find.MatchAllWordForms := False; { Perform the search}if wrfReplaceAll in Flags thenWordApp.Selection.Find.Execute(Replace := wdReplaceAll)elseWordApp.Selection.Find.Execute(Replace := wdReplaceOne);{ Save word }WordApp.ActiveDocument.SaveAs(ADocument);{ Assume that successful }Result := True;{ Close the document }WordApp.ActiveDocument.Close(wdDoNotSaveChanges);finally{ Quit Word }WordApp.Quit; WordApp := Unassigned; end;end;

jachguate 11-10-2006 01:02:37

Hola.

Por favor, el código que has puesto es ilegible!.

¿Podrías encerrarlo en la etiqueta [delphi]?

¿no sabes como se usa? mirá en mi firma el enlace a la etiqueta [code], el uso de la etiqueta delphi es exactamente el mismo.

Hasta luego.

;)

Ñuño Martínez 11-10-2006 10:11:05

Cita:

Empezado por jachguate
Hola.

Por favor, el código que has puesto es ilegible!.

¿Podrías encerrarlo en la etiqueta [delphi]?

¿no sabes como se usa? mirá en mi firma el enlace a la etiqueta [code], el uso de la etiqueta delphi es exactamente el mismo.

Hasta luego.

;)

Pues resulta que sí ha usado la etiqueta [delphi]. Lo que ocurre es que hay un bug en este foro que hace que, al pulsar el botón "Vista Previa de Mensaje" el bloque se va al traste...

Aun así, si se edita el mensaje y se colocan de nuevo las etiquetas, se verá bien.

Carliviris 11-10-2006 14:35:08

Código Delphi [-]usesComObj;// Replace FlagstypeTWordReplaceFlags = set of (wrfReplaceAll, wrfMatchCase, wrfMatchWildcards);function Word_StringReplace(ADocument: TFileName; SearchString, ReplaceString: string; Flags: TWordReplaceFlags): Boolean;constwdFindContinue = 1; wdReplaceOne = 1; wdReplaceAll = 2; wdDoNotSaveChanges = 0; varWordApp: OLEVariant;beginResult := False;{ Check if file exists }if not FileExists(ADocument) then begin ShowMessage('Specified Document not found.'); Exit; end;{ Create the OLE Object }tryWordApp := CreateOLEObject('Word.Application');except on E: Exception do begin E.Message := 'Word is not available.';raise;end;end;try{ Hide Word }WordApp.Visible := False;{ Open the document }WordApp.Documents.Open(ADocument);{ Initialize parameters}WordApp.Selection.Find.ClearFormatting; WordApp.Selection.Find.Text := SearchString; WordApp.Selection.Find.Replacement.Text := ReplaceString; WordApp.Selection.Find.Forward := True; WordApp.Selection.Find.Wrap := wdFindContinue; WordApp.Selection.Find.Format := False; WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags; WordApp.Selection.Find.MatchWholeWord := False; WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags; WordApp.Selection.Find.MatchSoundsLike := False; WordApp.Selection.Find.MatchAllWordForms := False; { Perform the search}if wrfReplaceAll in Flags thenWordApp.Selection.Find.Execute(Replace := wdReplaceAll)elseWordApp.Selection.Find.Execute(Replace := wdReplaceOne);{ Save word }WordApp.ActiveDocument.SaveAs(ADocument);{ Assume that successful }Result := True;{ Close the document }WordApp.ActiveDocument.Close(wdDoNotSaveChanges);finally{ Quit Word }WordApp.Quit; WordApp := Unassigned; end;end;


Ahi esta, pero no se pk no salio bien, pk puse el codigo dentro de las etiquetas y no es la primera vez que envio mensajes para consultar algo. En la vista previa de mensaje me salio bien en la ocasion anterior y despues miren como salio. Vamos a ver en esta.

Carliviris 11-10-2006 14:58:05

lo siento, salio mal nuevamente, el problema no es mio, sino de las etiquetas. Parece que no soporta texto muy largo, vamos a ver si cortado por partes me lo acepta:

Primera parte:
Código Delphi [-]
uses
  ComObj;

// Replace Flags
type
  TWordReplaceFlags = set of (wrfReplaceAll, wrfMatchCase, wrfMatchWildcards);

function Word_StringReplace(ADocument: TFileName; SearchString, ReplaceString: string; Flags: TWordReplaceFlags): Boolean;
const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
  wdDoNotSaveChanges = 0;
var
  WordApp: OLEVariant;
begin
  Result := False;

  { Check if file exists }
  if not FileExists(ADocument) then
  begin
    ShowMessage('Specified Document not found.');
    Exit;
  end;

  { Create the OLE Object }
  try
    WordApp := CreateOLEObject('Word.Application');
  except
    on E: Exception do
    begin
      E.Message := 'Word is not available.';
      raise;
    end;
  end;
 

Segunda parte:

Código Delphi [-]
try
    { Hide Word }
    WordApp.Visible := False;
    { Open the document }
    WordApp.Documents.Open(ADocument);
    { Initialize parameters}
    WordApp.Selection.Find.ClearFormatting;
    WordApp.Selection.Find.Text := SearchString;
    WordApp.Selection.Find.Replacement.Text := ReplaceString;
    WordApp.Selection.Find.Forward := True;
    WordApp.Selection.Find.Wrap := wdFindContinue;
    WordApp.Selection.Find.Format := False;
    WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags;
    WordApp.Selection.Find.MatchWholeWord := False;
    WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags;
    WordApp.Selection.Find.MatchSoundsLike := False;
    WordApp.Selection.Find.MatchAllWordForms := False;
    { Perform the search}
    if wrfReplaceAll in Flags then
      WordApp.Selection.Find.Execute(Replace := wdReplaceAll)
    else
      WordApp.Selection.Find.Execute(Replace := wdReplaceOne);
    { Save word }
    WordApp.ActiveDocument.SaveAs(ADocument);
    { Assume that successful }
    Result := True;
    { Close the document }
    WordApp.ActiveDocument.Close(wdDoNotSaveChanges);
  finally
    { Quit Word }
    WordApp.Quit;
    WordApp := Unassigned;
  end;
end;
 

Veamos ahora

Carliviris 11-10-2006 15:32:54

Quiero hacer un recuento de todo, para los que estan viendo este tema por primera vez. Tengo una funcion de replace en word que me funciona perfectamente, lo que no encuentro es la manera de mandar a imprimir. Publique el codigo en el mensaje anterior a este, para que si alguien a trabajado con un codigo parecido o tiene alguna idea de como mandar a imprimir, por favor me pueda explicar.

Disculpen lo estrambotico de los mensajes del tema, pero es que parece que las etiquetas no aceptan demasiado texto y me salio de esa manera. Tuve que dividirlo en dos partes para que saliera legible.

jachguate 11-10-2006 16:31:46

Hola.

Por favor, explicame cómo es que haces fallar a la etiqueta delphi, pues he realizado pruebas, incluso con unidades completas de código y ha funcionado de maravilla, tanto al hacer una "vista previa de Mensaje" como al publicar el post.

En concreto, he probado metiendole las unidades:
  • SHFolder.pas, 3,762 caracteres, 94 líneas.
  • ObjComAuto.pas, 13,828 caracteres, 417 líneas
  • OpenGL.pas, 149,688 caracteres, 3,548 líneas: obtuve un mensaje de error indicando que el mayor texto que puede enviarse es de 20,000 caracteres, así que lo reduje a mas o menos esa cantidad y todo funcionó ok.

En todos los casos, como ya dije, ha funcionado perfecto.

Carliviris 11-10-2006 16:40:31

el mensaje que envie dividido las etiquetas en dos, ese mensaje completo sin dividir fue que me dio el fallo.

aunque antes de publicarlo entraba a vista previa
no se si enviandolo sin entrar a vista previa deja de fallar o si el fallo esta ahi

Ñuño Martínez 11-10-2006 16:49:42

Cita:

Empezado por Carliviris
el mensaje que envie dividido las etiquetas en dos, ese mensaje completo sin dividir fue que me dio el fallo.

aunque antes de publicarlo entraba a vista previa
no se si enviandolo sin entrar a vista previa deja de fallar o si el fallo esta ahi

A mi me falla siempre que uso primero "Vista Previa".

[nota] Creo que algún moderador debería dividir este hilo en dos (si se puede): uno para el problema con Word y el otro sobre el supuesto bug en las etiquetas.

FGarcia 11-10-2006 17:13:00

Coincido con Ñuño! A mi tambien me pasa que en la vista previa se ven bien las etiquetas de codigo delphi pero al colocar el mensaje "desaparecen".

Saludos

Carliviris 11-10-2006 17:14:13

si, lo que pasa es que parece que no estan familiarizados con ese codigo, porque hay muchas formas de hacer replace en word
yo sigo intentando por otro lado y buscando soluciones
si encuentran alguna que podria ser, por favor publiquenla

roman 11-10-2006 17:28:25

Yo no entiendo qué es lo que preguntas. Por un lado parece que tienes dudas de como imprimir. Pues bien, usa Document.PrintOut. Pero por otro lado parece que tú problema está con los reemplazos ya que enfatizas mucho en ello.

// Saludos

Carliviris 11-10-2006 17:32:43

No roman, mi problema no esta con los reemplazos. Los menciono mucho para que vean de que tipo de impresion es que estoy hablando. Pero probare eso que me has dado y te doy la respuesta enseguida.

Carliviris 11-10-2006 17:54:29

me da este error cuando intento usar el document.printout:


Código Delphi [-]
---------------------------
Debugger Exception Notification
---------------------------
Project contratos.exe raised exception class EOleError with message 'Method 'PrintOut' not supported by automation object'. Process stopped. Use Step or Run to continue.
---------------------------
OK   Help   
---------------------------

Aqui les presento la parte del codigo donde utilizo el printout:

Código Delphi [-]
function TwinMain.CONTRATO_StringReplace(ADocument: TFileName; Sender: TObject): Boolean;
const
  wdFindContinue = 1;
  wdReplaceOne = 1;
  wdReplaceAll = 2;
  wdDoNotSaveChanges = 0;
var
 i           : integer;
 Flags       : TWordReplaceFlags;
begin

  Result := False;
  Flags  := [wrfReplaceAll];

  { Chequea si el archivo existe }
  if not FileExists(ADocument) then
   begin
    ShowMessage('El documento especificado no existe');
    Exit;
  end;

  { Creando el Objeto Ole }
  try
    WordApp := CreateOLEObject('Word.Application');
  except
    on E: Exception do
    begin
      E.Message := 'Microsoft Word no esta habilitado';
      raise;
    end;
  end;

  Contrato_SearchString;

  try
  { Ocultar Microsoft Word }
   WordApp.Visible := true;
    { Abrir el documento }
   WordApp.Documents.Open(ADocument);

   { Inicializacion de los parametros}
    for i:= 1 to 28 do
     begin
       //Para desplegar el desglose_inicial//
       if i = 27 then
        Desg_Inicial_Cont;

       if ((i <> 28) and (i <> 27)) then
        begin
         WordApp.Selection.Find.ClearFormatting;
         WordApp.Selection.Find.Text := SearchStr[i];
         WordApp.Selection.Find.Replacement.Text := ReplaceStr[i];
         WordApp.Selection.Find.Forward := True;
         WordApp.Selection.Find.Wrap := wdFindContinue;
         WordApp.Selection.Find.Format := False;
         WordApp.Selection.Find.MatchCase := wrfMatchCase in Flags;
         WordApp.Selection.Find.MatchWholeWord := False;
         WordApp.Selection.Find.MatchWildcards := wrfMatchWildcards in Flags;
         WordApp.Selection.Find.MatchSoundsLike := False;
         WordApp.Selection.Find.MatchAllWordForms := False;

         { Perform the search}
         if wrfReplaceAll in Flags then
           WordApp.Selection.Find.Execute(Replace := wdReplaceAll)
         else
           WordApp.Selection.Find.Execute(Replace := wdReplaceOne);
       end
       else
        begin
            //Para desglose_cuotas//
           DesgloseCuotas;
        end;
     end;
     finally
      WordApp.Documents.PrintOut;

roman 11-10-2006 18:01:00

Debe aplicarse al objeto Document, no sé si funcione también para el objeto Application.

Como yo lo he usado es así:

Código Delphi [-]
var
  WordApp, Document: OleVariant;

...

Document := WordApp.Documents.Open(ADocument);

...

Document.PrintOut(false);

Document.Close;
WordApp.Quit;

Si no le pasas el parámtro false a PrintOut o le pasas true, te puede causar problemas porque la sentencia PrintOut termina antes de terminar la impresión, se manera que se cierra el documento antes de terminar. El false indica que PrintOut no regrese sino hasta que termine la impresión.

// Saludos

Carliviris 11-10-2006 20:30:47

Ey, hice unos ajustes con las lineas de codigo que me paso roman y todo salio excelente.

Lo que cambie fue lo siguiente:
Yo tenia:
Código Delphi [-]
WordApp.Documents.Open(ADocument);

Y cambie por:

Código Delphi [-]
Document := WordApp.Documents.Open(ADocument);

mandando a imprimir:
Código Delphi [-]
...

Document.PrintOut(false);

Carliviris 11-10-2006 20:32:15

:) ahh, gracias a todos por ayudar

Casimiro Notevi 05-10-2012 10:12:58

Hola Waldo, debes crear un nuevo hilo con tu pregunta porque es algo distinto a lo que se inició el hilo, o sea, que no estás aportando nada a la resolución de este tema, sino que estás haciendo una pregunta nueva. Recuerda nuestra guía de estilo, gracias.


La franja horaria es GMT +2. Ahora son las 12:26:49.

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