Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Campo MEMO en un DBGrid (https://www.clubdelphi.com/foros/showthread.php?t=18265)

Tecnic2 07-02-2005 19:04:45

Campo MEMO en un DBGrid
 
Hola a todos, quisiera saber cómo lo puedo hacer para que en un DBGrid me aparezca el contenido de un campo de tipo memo, ya que en éstos momentos en lugar de salirme el contenido me sale la palabra "(MEMO)".

Muchas gracias por adelantado.

Neftali [Germán.Estévez] 08-02-2005 10:55:52

Cita:

Empezado por Tecnic2
Hola a todos, quisiera saber cómo lo puedo hacer para que en un DBGrid me aparezca el contenido de un campo de tipo memo, ya que en éstos momentos en lugar de salirme el contenido me sale la palabra "(MEMO)"

Puedes hacerlo de forma manual, o utilizando componentes que ya te lo solventen. Por ejemplo el Grid de las RxLib te lo hace de forma automática. Si deseas programarlo tú (porque no quieres instalar otros componetes, por ejemplo) debes hacerlo en el evento OnDrawColumnCell del DBGrid; Se trata de en ese evento repintar el texto de la celda y en lugar de lo que había utilizar el FieldMemo. Algo así:

Código Delphi [-]
   // Cadena del campo
   Str := TBlobField(Column.Field).AsString;
 ...
   ACanvas.TextRect(Rect, Left, Rect.Top + DY, Str);

Si te interesa ésta opción dilo y si tienes problemas intentaré exponerlo más detalladamente; Otra opción es buscar en los foros, porque seguro que algo se ha comentado ya.

Tecnic2 08-02-2005 11:09:42

Me interesa
 
Pues la verda es que si, que me interesa ésta opción de hacer-lo en tiempo de ejecución.

Neftali [Germán.Estévez] 08-02-2005 11:59:42

Cita:

Empezado por Tecnic2
Pues la verda es que si, que me interesa ésta opción de hacer-lo en tiempo de ejecución.

Bueno, pues sería algo parecido a lo que sigue; En el evento OnDrawColumnCell programa lo siguiente:

Código Delphi [-]
 const
   DX = 5;
   DY = 2;
 var
   Str:String;
 begin
   // Es un Blob?
   if(Column.Field is TMemoField) then begin
     Str := TMemoField(Column.Field).AsString;
     DBGrid1.Canvas.TextRect(Rect, Left + 8, Rect.Top + DY, Str);
   end;

Si hay varias columnas de memo en el Grid y no quieres hacerlo con todas, también puedes utilizar un parámetro llamado DataCol del evento que te deuelve el índice de la columna que se está pintando.

Pruébalo y haz variantes.

bustio 08-02-2005 17:34:24

Pues si....
 
Cita:

Empezado por Neftali
Si te interesa ésta opción dilo y si tienes problemas intentaré exponerlo más detalladamente; Otra opción es buscar en los foros, porque seguro que algo se ha comentado ya.

Yo tengo el mismo problema... Busque en el Foro y me sugieren usar el DBMEMO, soloque para mi fin no me sirve. El RxLIB tampoco me es solucion.. asi que me gusta mas tu exposicion de como hacerlo manualmente.. podrias explicarmelo y exponermelo mas detallado??

GRACIAS!!!

Lazaro Bustio Martinez..

bustio 08-02-2005 17:59:32

Respondiendo....
 
Cita:

Empezado por Neftali
Pruébalo y haz variantes.

Exactamente eso fue lo que hice. Tome el parametro DataCol para solo hacerle el pintado a la primera columna y funciono.. tu ejemplo esta muy bien y muy bueno. Pero tiene un defecto.. al menos a mi me lo hace. El texto cuando lo lee y lo muestra no se ve completo... solo a partir del 2 caracter y cuando trato de marcarlo con el Mouse para darle "<-" con el cursor vuelve a mostrar el valor: (MEMO).

Como puedo solucionar esto????

GRACIAS!!

Lazaro Bustio Martinez..

Neftali [Germán.Estévez] 08-02-2005 18:11:43

Cita:

Empezado por bustio
Exactamente eso fue lo que hice. Tome el parametro DataCol para solo hacerle el pintado a la primera columna y funciono.. tu ejemplo esta muy bien y muy bueno. Pero tiene un defecto.. al menos a mi me lo hace. El texto cuando lo lee y lo muestra no se ve completo... solo a partir del 2 caracter y cuando trato de marcarlo con el Mouse para darle "<-" con el cursor vuelve a mostrar el valor: (MEMO).

Lo de que se vea el 2º caracter lo controla la constante(DX):

Código Delphi [-]
 DBGrid1.Canvas.TextRect(Rect, Left + DX, Rect.Top + DY, Str);

Revisa que la hayas colocado Bien. Al entrar te vuelve a mostrar (MEMO) porque ésta soilución sólo sirve para Visualizar, no para editar.

Otra opción (que tb permite editar) es la siguiente; Añadir al TTable/TQuery/... los Fields y programar los atributos OnGetText y OnSetText del TField(en éste caso un TMemoField) con el siguiente código:

Código Delphi [-]
 procedure TForm1.Table1NotesGetText(Sender: TField; var Text: String; DisplayText: Boolean);
 begin
   Text:= Trim (Sender.asString);  
 end;
 
 procedure TForm1.Table1NotesSetText(Sender: TField; const Text: String);
 begin
   Sender.AsString := Text;
 end;

Es mejorable, ya que al editar aparecen los saltos de línea pero puede servir.

Tecnic2 09-02-2005 12:23:11

Gracias, lo probaré. [Pregunta]
 
Otra pregunta:

Tengo un par de campos en mi DBGrid que me deben mostrar una información en formato de hh:mm:ss.
El campo de la base de datos Access es Fecha/Hora, y el formato es Hora Larga, pero en mi DBGrid me aparece 30/12/1899 12:34:12, y yo solo quiero que me aparezca la hora.

Muchas gracias por adelantado.

Neftali [Germán.Estévez] 09-02-2005 13:10:59

Si defines los TField como se ha comentado antes, y accedes a las propiedades del TField correspondiente a tu campo hay una propiedad que te permite definir el formato (Display...., Masked..., no recuerdo el nombre, pero seguro que cuando las tengas en pantalla la identificas enseguida).

yo_coco_py 17-01-2009 21:39:52

solucion en una linea de codigo
 
aca esta la solucion y en una sola linea de codigo.. http://delphi.about.com/library/weekly/aa030105a.htm
Funciona super bien.. :)
Si tienen alguna duda y les puedo ayudar, con mucho gusto lo hare..
Saludos..


La franja horaria es GMT +2. Ahora son las 15:13:40.

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