Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-02-2012
Avatar de TiammatMX
TiammatMX TiammatMX is offline
Miembro
 
Registrado: jun 2006
Ubicación: Universo Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Puebla\Heróica Puebla de Zaragoza\Jardines de San Manuel\Home
Posts: 746
Poder: 18
TiammatMX Va camino a la fama
Post TDbGrid con un campo RTF. ¿Se puede visualizar como texto plano?

Pues éso, chic@s, tengo varios campos que contienen texto RTF, con formatos bonitos, etcétera..., pero que a la hora de desplegarse en un TDbGrid se ven como un batiburrillo de letras, códigos y hasta groserías aparecen...

¿Hay alguna manera (que no sea utilizando componentes de terceros, tengo la imposición que de no usarlos) de mostrar los campos con contenido RTF en texto plano, solamente en el TDbGrid?

Acepto todas las ideas, por alocadas que parezcan.
__________________
Felipe Eduardo Ortiz López. Delphi programmers does it recursively...

"Un programador, es un creador de universos en donde sólo él es responsable. Universos de complejidad prácticamente ilimitada que se puede crear en forma de programas de ordenador." - Joseph Weizenbaum.

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco
Responder Con Cita
  #2  
Antiguo 28-02-2012
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.737
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Esto es algo que utilizo que puedes modificar a tu gusto...
Recibe un campo blob, donde hay notas en formato RTF.
Las mete dentro de un TRichEdit.
Devuelve la propiedad Text del TRichEdit, que no tiene formato.
Nota: TRichEdit es parte de Delphi.
Código Delphi [-]
function TFMain.DameTexto(Campo: TBlobField): string;
var
  MS : TMemoryStream;
  RichEdit : TRichEdit;
begin
  RichEdit := TRichEdit.Create(Self);
  MS := TMemoryStream.Create;
  try
     RichEdit.Parent := Self;
     RichEdit.Visible := False;
     Campo.SaveToStream(MS);
     MS.Position := 0;
     RichEdit.Lines.LoadFromStream(MS);
     Result := RichEdit.Lines.Text;
  finally
     MS.Free;
     RichEdit.Free;
  end;
end;
Responder Con Cita
  #3  
Antiguo 28-02-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Felipe.

Como ilustra duilioisola, es la propiedad Lines.Text del cuadro de texto rico (o enriquecido) la que devuelve su contenido sin formato.

Dado que el texto se encuentra en un campo, puedes asociar a éste un objeto TDBRichEdit (visible o invisible), y añadir a la tabla un campo calculado de tipo String para mostrar en la rejilla. Así, en el evento OnCalcFields del conjunto de datos, asignas ese Lines.Text al campo calculado:

Código Delphi [-]
DataSet ['CampoCalc'] := DBRichEdit1.Lines.Text;

Saludos.

Al González.

Última edición por Al González fecha: 28-02-2012 a las 19:16:20.
Responder Con Cita
  #4  
Antiguo 28-02-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por Al González Ver Mensaje
Dado que el texto se encuentra en un campo, puedes asociar a éste un objeto TDBRichEdit (visible o invisible), y añadir a la tabla un campo calculado de tipo String para mostrar en la rejilla. Así, en el evento OnCalcFields del conjunto de datos, asignas ese Lines.Text al campo calculado:
Apreciado amigo Al, sino me estoy equivocando, creo que lo que sugieres no funcionaría en este caso. Para dibujar un TDBGrid Delphi no necesariamente notifica a los controles que el cursor se ha movido. Esto ocacionará que dibujes sobre el TDBGrid el texto almacenado en el último registro que fue seleccionado. Otro de los sintomas sería que dibujes texto en blanco al abrir el formulario ya que la clase TDatasource notifica a los controles luego de dibujar el TDBGrid.

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #5  
Antiguo 28-02-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Puedes revisar esta entrada en StackOverflow. En ella se da un ejemplo de como dibujar el contenido de un Richedit utilizando la interfaz Windowless Rich Edit.

Nuevamente repito, el código de ejemplo en la entrada de StackOverflow documenta como dibujar el texto rico sobre el un objeto TCanvas. Sin embargo si lo que deseas es dibujar un extracto en texto plano, en lugar de hacer la llamada a TxDraw, hazla a TxGetText.

Talvez te hallas quedado con una gran incógnita con lo que te he dicho. Pero si lees el código que te cité verás que realmente está fácil.

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #6  
Antiguo 28-02-2012
Avatar de TiammatMX
TiammatMX TiammatMX is offline
Miembro
 
Registrado: jun 2006
Ubicación: Universo Curvo\Vía Láctea\Sistema Solar\Planeta Tierra\América\México\Puebla\Heróica Puebla de Zaragoza\Jardines de San Manuel\Home
Posts: 746
Poder: 18
TiammatMX Va camino a la fama
Cita:
Empezado por Chris Ver Mensaje
...Talvez te hallas quedado con una gran incógnita con lo que te he dicho. Pero si lees el código que te cité verás que realmente está fácil...
Pues sí, me quedé con una ENORME incógnita, sobre todo por el hecho de que necesito mostrar el texto de varios campos tipo VarChar (de MS SQL Server 2008 R2) que contienen sendos textos formateados vía TRichEdit, pero que el usuario quiere que en un TDbGrid se muestre únicamente el texto, sin el formato; si en algún momento desea editarlos, le proveo de una ventana donde puede hacerlo.

El punto es que ya tengo CASI todo controlado, excepto el mostrar el texto en el TDbGrid en su correspondiente columna.
__________________
Felipe Eduardo Ortiz López. Delphi programmers does it recursively...

"Un programador, es un creador de universos en donde sólo él es responsable. Universos de complejidad prácticamente ilimitada que se puede crear en forma de programas de ordenador." - Joseph Weizenbaum.

Témele a los profetas... y a aquellos que están listos para morir por "la verdad", ya que como regla general hacen morir a muchos otros con ellos, frecuentemente antes que ellos, y a veces en lugar de ellos. — Umberto Eco
Responder Con Cita
  #7  
Antiguo 28-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Chris Ver Mensaje
Apreciado amigo Al, sino me estoy equivocando, creo que lo que sugieres no funcionaría en este caso. Para dibujar un TDBGrid Delphi no necesariamente notifica a los controles que el cursor se ha movido. Esto ocacionará que dibujes sobre el TDBGrid el texto almacenado en el último registro que fue seleccionado. Otro de los sintomas sería que dibujes texto en blanco al abrir el formulario ya que la clase TDatasource notifica a los controles luego de dibujar el TDBGrid.

Saludos!
¡Ah caray! Pero esto significaría que ningún campo calculado podría mostrarse en un DBGrid, pero lo cierto es que sí se puede.

// Saludos
Responder Con Cita
  #8  
Antiguo 28-02-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por roman Ver Mensaje
¡Ah caray! Pero esto significaría que ningún campo calculado podría mostrarse en un DBGrid, pero lo cierto es que sí se puede.

// Saludos
Creo que no en este caso. El campo depende de la propiedad de un control (DBRichEdit1) que necesariamente no estará actualizado cuando sea leída la propiedad.

En lo personal preperiría utilizar el evento OnGetText para este caso. Por ejemplo:

Código Delphi [-]
procedure Form1.OnShow(sender: tobject);
begin
    DataSet1.FieldByName('texto_rico').OnGetText := FormatRTF2Text;
end;

function FormatRTF2Text(Sender: TField;
                        var Text: String;
                        DisplayText: Boolean);
begin
    if DisplayText then
    begin
        // utilizar el código de duilioisola
        // para convertir el texto rico a plano
        
        Text := texto_plano;
    end;
end;

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #9  
Antiguo 29-02-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Cita:
Empezado por Chris Ver Mensaje
[...] sino me estoy equivocando, creo que lo que sugieres no funcionaría en este caso [...]
Cita:
Empezado por roman Ver Mensaje
¡Ah caray! Pero esto significaría que ningún campo calculado podría mostrarse en un DBGrid, pero lo cierto es que sí se puede.
Hola Chris, muchas gracias por la aclaración, tienes razón en lo que dices.

Aunque ciertamente depende de cómo sea implementado cada derivado de TDataSet, lo cierto es que la mayoría (TClientDataSet, ADO, IBX, etc.) hacen el cálculo del buffer de registro mucho antes de informar a los enlaces de datos visuales de cualquier movimiento.

Román, esto es similar a aquel asunto del OnValidate que tuvimos el gusto de compartir.

En conclusión, un evento OnCalcFields puede asumir que el valor de cualquiera de los campos es del mismo registro cuyos campos calculados se van a actualizar, pero no necesariamente serán los mismos valores mostrados en los controles de datos.

Siendo así, creo que yo también usaría un evento OnGetText o aún un campo calculado (dependiendo de si el campo original va a estar visible o no al mismo tiempo como texto rico), pero eso sí, con un TRichEdit en lugar de TDBRichEdit, al estilo de las sugerencias anteriores. Y claro, con un poco más de tiempo, optar por llamadas directas a la API de Windows no sería mala idea tampoco.

Un abrazo corregido.

Al González.
Responder Con Cita
  #10  
Antiguo 29-02-2012
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Poder: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Hola Felipe.

Viendo ahora la solución que obtuviste, si te resultó satisfactoria me permito sugerirte que uses el mismo manejador de evento OnGetText para todos esos campos (no tiene que ser un OnGetText por cada campo). También, con tu debido permiso, me tomo la libertad de mejorarlo un poco:

Código Delphi [-]
procedure TfrmPrncpl.QueryCampoRTFGetText(Sender: TField; var Text: String; DisplayText: Boolean);
Var
  AText :String Absolute Text;  // Trampilla para meter el parámetro "Text" al With
begin
  With TRichEdit.Create (Nil) Do  // Construimos el objeto "al vuelo" (sin usar una variable)
    Try
      Visible := False;  // Evitamos efecto de "parpadeo"
      Parent := frmPrncpl;  // Para que no marque error al leer su texto
      Text := Sender.AsString;  // Asignamos el valor de cualquiera que sea el campo RTF en turno (Sender)
      AText := Lines.Text;  // Esto devuelve texto plano aunque PlainText sea False
    Finally  // Try-Finally asegura que siempre se llamará a lo que esté en Finally (aunque haya error)
      Free;  // Convencionalmente es preferible llamar a Free que a Destroy 
    End;
end;

Sin olvidar que debe estar ComCtrls en el Uses.

Saludos.
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
Cargar exe como texto plano _cero_ C++ Builder 4 14-12-2010 08:39:14
Como enviar los valores de un TDBGRID a cuadros de texto Luis Castro Varios 3 11-01-2007 17:31:15
Se puede editar un TDbgrid externo con su Handle? rivers Varios 0 08-01-2007 22:24:49
Obtener Texto plano de un campo blob Manuel Firebird e Interbase 12 06-10-2006 00:01:53
como visualizar campo memo en grid? Alfredo Conexión con bases de datos 3 17-01-2005 13:38:21


La franja horaria es GMT +2. Ahora son las 19:17:57.


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