Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Obtener Texto plano de un campo blob (https://www.clubdelphi.com/foros/showthread.php?t=13647)

Manuel 26-08-2004 00:17:00

Obtener Texto plano de un campo blob
 
Hola amigos del foro, tengo una pequeña consulta, como yo puedo traspasar el contenido de un campo blob, a una variable de memoria tipo string, traspasando solamente el texto plano no su formato como en el ejemplo de más abajo si lo traspaso así, el valor del la variable queda como el ejemlo:

texto := dm.tTablaCampoBlob.value:

el contenido de la variable texto:

{\rtf1\ansi\deff0\deftab720{\fonttbl{\f0\fswiss MS Sans Serif;}{\f1\froman\fcharset2 Symbol;}{\f2\fswiss\fcharset1 MS Sans Serif;}{\f3\fswiss\fcharset1 MS Sans Serif;}}
{\colortbl\red0\green0\blue0;}
\deflang2058\pard\plain\f3\fs16 Entrevista con apoderada para informar sobre rendimiento de su hija.
\par }

valor esperado para la variable texto: "Entrevista con apoderada para informar sobre rendimiento de su hija"

de antemano muchas gracias.

roman 26-08-2004 00:56:49

Parece que lo que tienes en el campo BLOB es un texto en formato RTF. De ser así quizá te sirva traspasar el BLOB a un control RichEdit. La propiedad Lines.Text del RichEdit dará entonces el texto plano.

No es una solución muy elegante pero funciona.

// Saludos

Manuel 26-08-2004 01:20:27

Cita:

Empezado por roman
Parece que lo que tienes en el campo BLOB es un texto en formato RTF. De ser así quizá te sirva traspasar el BLOB a un control RichEdit. La propiedad Lines.Text del RichEdit dará entonces el texto plano.

No es una solución muy elegante pero funciona.

// Saludos

Gracias Roman por responder mi consulta, realice lo que me dijiste:

RichEdit1.Lines.Text := TAnotacionesANOTACION.Value;
texto := RichEdit1.Lines.Text;

pero sigue cargandose la variable texto con esto:

','{\rtf1\ansi\deff0\deftab720{\fonttbl{\
f0\fswiss MS Sans
Serif;}{\f1\froman\fcharset2
Symbol;}{\f2\fswiss\fcharset1 MS
Sans Serif;}{\f3\fswiss\fcharset1 MS
Sans Serif;}}
{\colortbl\red0\green0\blue0;}
\deflang2058\pard\plain\f3\fs16
Entrevista con apoderada para
informar sobre rendimiento de su hija.
\par }

?????, no se que pasará

roman 26-08-2004 01:36:33

Hay dos cosas: en primer lugar el texto antes de la llave '{' de apertura sobra, aunque parece ser que se te pasó al pegar aquí el texto.

Por otro lado, parece que no puedes asignar directamente el texto a Lines.Text sino que debes hacerlo a través de un stream.

Yo lo hice así:

Código Delphi [-]
var
  Stream: TStringStream;

begin
  Stream := TStringStream.Create(Blob);
  try
    Stream.Seek(0, soFromBeginning);
    RichEdit1.Lines.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

donde Blob sería una variable string con el contenido del campo blob.

Con esto debe cargarse correctamente el texto (con todo y formato) en el RichEdit y ahora sí, RichEdit1.Lines.Text debe contener el texto plano.

Otra cosa, aunque no sé en específico el caso de Interbase, las componentes TBlobField tienen el método SaveToStream con lo que podrías pasar directamente del campo al StringStream.

// Saludos

JulioGO 26-08-2004 02:55:38

Existe una UDF que puedes instalarla en BD. La funcion se llama
F_BlobAsPchar(campo_memo). No recuerdo el link, pero buscalo en los foros.

salu2.

jachguate 26-08-2004 09:48:54

Creo que esta udf, al estar almacenado el texto en la BD como texto enriquecido, no te servirá de nada. No es que la conozca personalmente, pero el nombre F_BlobAsPchar no indica ningún tipo de interpretación del rtf.

Hasta luego.

;)

Manuel 26-08-2004 15:10:06

Cita:

Empezado por roman
Hay dos cosas: en primer lugar el texto antes de la llave '{' de apertura sobra, aunque parece ser que se te pasó al pegar aquí el texto.

Por otro lado, parece que no puedes asignar directamente el texto a Lines.Text sino que debes hacerlo a través de un stream.

Yo lo hice así:

Código Delphi [-]
var
  Stream: TStringStream;

begin
  Stream := TStringStream.Create(Blob);
  try
    Stream.Seek(0, soFromBeginning);
    RichEdit1.Lines.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
end;

donde Blob sería una variable string con el contenido del campo blob.

Con esto debe cargarse correctamente el texto (con todo y formato) en el RichEdit y ahora sí, RichEdit1.Lines.Text debe contener el texto plano.

Otra cosa, aunque no sé en específico el caso de Interbase, las componentes TBlobField tienen el método SaveToStream con lo que podrías pasar directamente del campo al StringStream.

// Saludos

Gracias una vez más roman: realice lo que me dijiste así:

Stream := TStringStream.Create(TAnotacionesANOTACION.Value);
try
Stream.Seek(0, soFromBeginning);
RichEdit1.Lines.LoadFromStream(Stream);
finally
Stream.Free;
end;
texto := RichEdit1.Lines.Text;

Donde TAnotacionesANOTACION.Value es el campo con el campo blob pero se sigue cargando como rtf, seguramente debería funcionar así, pero por algun motivo sigue así, gracias por la ayuda una vez más.

geovany 17-01-2005 16:35:50

Caso contrario
 
hola Manuel mira yo tengo el mismo problema que tu pero al reves yo no puedo obtener el texto enriquecido y me devuelvce texto plano asi que podriamos intercambiar trozos de codigo para que cadaquien tenga lo contrario no

EduardRC 18-01-2005 10:12:25

Mirar la propiedad 'PlainText' del RichEdit.

Saludos

srneo 05-10-2006 23:02:09

cheeee
 
Por favor cuando hagan referencia a componentes especifiquen en que paleta se encuentran los mismos, ya que si bien hay muchos que resultan muy conocidos, hay otros que no tanto grax:mad:

roman 05-10-2006 23:09:12

Ok, lo tendremos en cuenta.

// Saludos

jachguate 05-10-2006 23:51:59

Recordar también que si se cuenta con bds 4.0 o Turbo Delphi, en la nueva paleta de componentes basta dar un clic en el boton "Filter or unfilter the current items" y escribir unas cuantas letras del inicio del nombre del componente para que esta aplique un filtro mostrando solamente aquellos que coincidan con el criterio de búsqueda!.

¡Realmente muy cómodo!, pues resulta imposible recordar en que paleta se encuentra cada componente. Sobre todo después de instalarse las jedi, las indy y otro par de bibliotecas extensas... :D

Hasta luego.

;)

roman 06-10-2006 00:01:53

Y en versiones anteriores puede uno ir a las propiedades de la paleta (menú contextual de la paleta), en la lista de pestañas escoger [All] al final de la lista, dar click en la columna Name del listview de componentes para ordenarlas por nombre, recorrer las componentes hasta encontrar la deseada (ordenadas por nombre es fácil) y mirar la columna Page a ver qué dice.

// Saludos


La franja horaria es GMT +2. Ahora son las 02:19:03.

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