Lazarus

Other Languages => Spanish => Topic started by: esdonis on September 12, 2018, 09:22:52 pm

Title: Conversion de caracteres al crear documento de word
Post by: esdonis on September 12, 2018, 09:22:52 pm
Estoy tratando de crear un documento de Word, pero este no visualiza de forma carecta si pongo caracteres acentuados o si le paso algún valor desde un campo de texto al documento.

Como podría solventar este error de conversión de tipos?

el código que utilizo es el siguiente:

procedure Tflconv.cmdlistClick(Sender: TObject);

var
  libro: OLEVariant;

begin
  try
      libro := CreateOleObject('Word.Application');
  except
    on e:exception do begin
        Application.MessageBox('Error al crear el documento. Primeramente debe instalar el Office.', pchar(Self.Caption), MB_ICONINFORMATION);
      exit;
    end;
  end;
  libro.WordBasic.FileNew;
  libro.Selection.TypeText('ACTA DE CONCILIACIÓN DE PAGO');
  libro.Selection.TypeParagraph;
  libro.Selection.MoveUp(5, 1);
  libro.ActiveWindow.ActivePane.LargeScroll(-1);
  libro.Selection.EndKey(5, 1);
  libro.Selection.ParagraphFormat.Alignment := 1;
  libro.Selection.Font.Bold := 9999998;
  libro.Selection.Font.Italic := 9999998;
  libro.Selection.Font.Size := 16;
  libro.Selection.MoveDown(5, 3);
  libro.Selection.TypeParagraph;
  libro.Selection.TypeText(Text:='DE UNA PARTE: ' +  txtnombre.Text + ' con domicilio legal en ' + txtdir.Text + '. Registrada con el código No ' + txtent.Text);
  libro.Selection.TypeParagraph;
  libro.Visible:=true;
end;
Title: Re: Conversion de caracteres al crear documento de word
Post by: lucamar on September 12, 2018, 09:34:55 pm
Prueba usando:
    libro.Selection.TypeText(UTF8Decode('cadena'));

Posiblemente Word (¿qué versión?) esté esperando una WideString o una AnsiString(CP_ACP) pero Lazarus le envíe una cadena en UTF-8.
Title: Re: Conversion de caracteres al crear documento de word
Post by: esdonis on September 12, 2018, 09:59:18 pm
Me produce una excepcion del tipo SIGSEGV la función UTF8Decode

Title: [Solved] Conversion de caracteres al crear documento de word
Post by: esdonis on September 12, 2018, 10:31:19 pm
Si esperaba un WideString

Pero aun no me funciona en el caso de la O acentuada. Lo demás SI funciona

libro.Selection.TypeText(WideString('ACTA DE CONCILIACIÓN DE PAGO'));

La O acentuada no la convierte corectamente
Title: Re: Conversion de caracteres al crear documento de word
Post by: lucamar on September 12, 2018, 10:42:19 pm
Sólo por probar, declara una variable WS: WideString y haz:
Code: Pascal  [Select][+][-]
  1. [... more code ...]
  2.     WS := UTF8Decode('ACTA DE CONCILIACIÓN ...');
  3.     libro.Selection.TypeText(WS);

¿Puedes compartir la unidad donde está declarado el interface con Word? Estoy asumiendo muchas cosas que igual no son ciertas ...  :)
Title: Re: Conversion de caracteres al crear documento de word
Post by: esdonis on September 13, 2018, 01:47:40 pm
Funciona Perfecto.

1 Millón de Gracias

Yo había probado:
libro.Selection.TypeText(WideString('ACTA DE CONCILIACIÓN DE PAGO'));
y
libro.Selection.TypeText(UTF8Decode('ACTA DE CONCILIACIÓN DE PAGO'));

Y ninguno de estos 2 casos funcionaba.
Title: Re: Conversion de caracteres al crear documento de word
Post by: Ñuño_Martínez on September 13, 2018, 02:06:03 pm
¿Estás usando OLE? Creía que estaba superado y ahora se usaba CORBA (o me estoy haciendo un lío con otra cosa, que yo jamás he usado OLE ni CORBA ni nada de eso) ActiveX.  ¿De veras no hay otra forma de hacerlo?

Es sólo un comentario.  Es que ver ese OLEVariant me ha chocado muchísismo.
Title: Re: Conversion de caracteres al crear documento de word
Post by: lucamar on September 13, 2018, 02:26:08 pm
Yo había probado:
libro.Selection.TypeText(WideString('ACTA DE CONCILIACIÓN DE PAGO'));
y
libro.Selection.TypeText(UTF8Decode('ACTA DE CONCILIACIÓN DE PAGO'));

Y ninguno de estos 2 casos funcionaba.

En el primer caso es probable que sea porque estás usando un typecast; el compilador debería reconocerlo y cambiar la cadena directamente pero quizá no lo esté haciendo bien (?). En el segundo, debería funcionar sin más, pero ya se sabe :) Teniendo ambos casos en cuenta y tratando de adivinar ... ¿es posible que Selection.TypeText() no se esté portando bien cuando le pasas una constante? Lástima que no pueda probarlo a fondo.

¿Estás usando OLE? Creía que estaba superado y ahora se usaba ActiveX. [...] Es que ver ese OLEVariant me ha chocado muchísismo.

Por lo que yo sé, son dos tecnologías con diferente propósito---aunque se solapan en algunos aspectos. Y oye, si funciona bien y uno está acostumbrado ... :D
Title: Re: Conversion de caracteres al crear documento de word
Post by: JuhaManninen on September 13, 2018, 02:58:29 pm
UTF8Decode() es prácticamente nunca necesario ya.
Asigna constantes a "String" siempre y usa UnicodeString explícito cuando un API lo manda.
Mira:
 http://wiki.freepascal.org/Unicode_Support_in_Lazarus#Calling_API_functions_that_use_WideString_or_UnicodeString
Conversiónes entre String y UnicodeString son automaticos y facil para leer. No hay feo "typecast".
TinyPortal © 2005-2018