PDA

Ver la Versión Completa : Imprimir en Word


Carliviris
11-10-2006, 00:01:07
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 [-] (http://www.clubdelphi.com/foros/#) 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; 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;

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
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 [-] (http://www.clubdelphi.com/foros/#)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; 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;


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:

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:


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
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:



---------------------------
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:


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í:


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:

WordApp.Documents.Open(ADocument);


Y cambie por:


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



mandando a imprimir:

...

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 (http://www.clubdelphi.com/foros/guiaestilo.php), gracias.