Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Problema con mostrar campo MEMO en DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=96627)

michal 04-03-2024 21:19:00

Problema con mostrar campo MEMO en DBGrid
 
Hola otra vez
Ahora estoy presentando otro problema
Tengo una base de datos en access y uso componentes ADO en C++Builder6, en algunas tablas tengo campos de tipo MEMO, y el DBGrid no me muestra su contenido, solo pone la palabra MEMO.
Cómo se puede solucionar ese problema??

Desde ya, muchas gracias.

chenech 05-03-2024 00:22:00

Hasta donde yo se, no se puede mostrar con el DBGrid estándar que viene, si alguien con mas experiencia en Grid sabe yo me aprovecharia también :-).
Tendrías que usar otro, tipo TMS, DevExpress, etc.
Yo lo que hago es que si se que es una imagen o un PDF o lo que sea que guardo, pongo un cbsEllipsis o como se llame, que pone un button en el grid para que al pulsarlo abra el blob en una ventana mostrando la imagen, jpg, memo, etc. según lo que tenga guardado en el blob.

michal 05-03-2024 03:36:14

No, no es nada raro, solo el contenido un un campo tipo texto(MEMO) en una bd access

Neftali [Germán.Estévez] 05-03-2024 08:41:10

Cita:

Empezado por michal (Mensaje 554740)
Tengo una base de datos en access y uso componentes ADO en C++Builder6, en algunas tablas tengo campos de tipo MEMO, y el DBGrid no me muestra su contenido, solo pone la palabra MEMO.
Cómo se puede solucionar ese problema??


No es necesario ningún componente externo.
Hay varias formas de hacerlo, pero una sencilla es utilizar los eventos del propio campo (TField) de tipo memo.

1) Pulsa click derecho sobre la Query o Tabla que estés usando para acceder a los Datos
2) Escoge "Fields Editor" y añádelos todos
3) Selecciona el campo de Tipo memo y en el evento OnGetText escribe lo siguiente:

Código Delphi [-]
Text := TField(Sender).AsString;

Con eso aparecerá en la celda el contenido del Memo.
Si tienes varias líneas y quieres que aparezcan correctamente, basta con sustituir los "saltos de línea" por espacios; Para ello utiliza esta:
Código Delphi [-]
Text := AnsiReplaceText(TField(Sender).AsString, #13#10, ' ');

Es código Delphi, pero creo que es sencillo de trasladar a C++Builder

michal 05-03-2024 14:08:52

Cita:

Empezado por Neftali [Germán.Estévez] (Mensaje 554746)
No es necesario ningún componente externo.
Hay varias formas de hacerlo, pero una sencilla es utilizar los eventos del propio campo (TField) de tipo memo.

1) Pulsa click derecho sobre la Query o Tabla que estés usando para acceder a los Datos
2) Escoge "Fields Editor" y añádelos todos
3) Selecciona el campo de Tipo memo y en el evento OnGetText escribe lo siguiente:

Código Delphi [-]Text := TField(Sender).AsString;


Con eso aparecerá en la celda el contenido del Memo.
Si tienes varias líneas y quieres que aparezcan correctamente, basta con sustituir los "saltos de línea" por espacios; Para ello utiliza esta:
Código Delphi [-]Text := AnsiReplaceText(TField(Sender).AsString, #13#10, ' ');


Es código Delphi, pero creo que es sencillo de trasladar a C++Builder

/////
Gracias por la solución.


El tema es que no puedo buscar los campos en el Field Editor porque mi consulta es creada mediante código, o sea, no está en la propiedad SQL del TADOQuery, y por supuesto, al intentar extraer los campos, me da error pq todavia no existe la consulta, me explico?


Entonces supongo que deberé hacer algo aprecido a cuando en un post anterior para el uso de DisplayFormat, tuve que usar castings porque igual tenia que acceder a un campo de una consulta, en tiempo de diseño, y no podia usar Field Editor porque en ese momento no existían esos campos aún, porque la consulta no habia sido ejecutada.


Pero gracias por la idea, lo haré y luego traduciré a C++Builder la idea que propones

Neftali [Germán.Estévez] 05-03-2024 16:29:48

Cita:

Empezado por michal (Mensaje 554751)
El tema es que no puedo buscar los campos en el Field Editor porque mi consulta es creada mediante código, o sea, no está en la propiedad SQL del TADOQuery, y por supuesto, al intentar extraer los campos, me da error pq todavia no existe la consulta, me explico?


Correcto.
Pues si la consulta la montas en ejecución, esto también lo montas en ejecución. Si funciona lo uno, también funciona lo otro. ;)

Mantienes el procedimiento anterior para el evento y lo defines en la parte privada del form:

Código Delphi [-]
...
  private
    procedure ChangeMemoGetText(Sender: TField; var Text: string; DisplayText: Boolean);
...


Y luego después de asignar la SQL, creas las definiciones de campos y "enganchas" el evento.
A partir de ahí el funcionamiento es el mismo que si lo hubieras hecho en diseño.

Código Delphi [-]
...
var
  fd:TFieldDef;
  f:TField;
begin
  // ...  suponiendo que el campo se llame MEMO...
  if not ADOQuery1.Active then begin
    // Asigno la SQL en tiempo de ejecución
    ADOQuery1.SQL.Text := 'Select * from Tabla1';
    // Fuerzo el Update de las definiciones
    ADOQuery1.FieldDefs.Update;
    // Me aseguro de que la definición está
    fd := ADOQuery1.FieldDefs.Find('memo');
    if Assigned(fd) then begin
      // me "engancho" el evento igual que si lo asignara en visual
      ADOQuery1.FindField('memo').OnGetText := ChangeMemoGetText;
    end;

    ...
    Activo la query...
  end;


La franja horaria es GMT +2. Ahora son las 09:18:20.

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