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 DBGrid y MEMO (https://www.clubdelphi.com/foros/showthread.php?t=76719)

mizzard 21-11-2011 22:54:12

Problema DBGrid y MEMO
 
Hola a todos, se me plantea el siguiente problema:
Tengo un DBGrid y en uno de los campos es un tipo MEMO. Como sabreis este campo muestra (WIDEMEMO) en lugar de mostrar la informacion.
Pues bien, googleando un poco he encontrado lo siguiente:

void __fastcall TfrmPrincipal::DBGrid3DrawColumnCell(TObject *Sender, const TRect &Rect,
int DataCol, TColumn *Column, TGridDrawState State)
{
// Con esto mostramos la descripción del MEMO en el dbgrid
if (Column->Field->FieldName == "Descripción") {
DBGrid3->Canvas->FillRect(Rect);
DBGrid3->Canvas->TextRect(Rect, Rect.Left, Rect.Top, Column->Field->Value);
}
}

el cual muestra perfectamente el contenido del campo MEMO. El problema viene cuando se hace clic q se sobreescribe encima de la informacion (WIDEMEMO). TAmbien desactivo la opcion de editar.

Se os ocurre alguna forma de evitar esto?? Muchas gracias y un saludo!

mizzard 21-11-2011 22:57:04

Cita:

Empezado por ecfisa (Mensaje 419026)
:confused::confused::confused::confused:

Saludos.

tengo problemas con el explorer 9 y me ha tocado coger el portatil para continuar en el explorer 8 :S

ecfisa 21-11-2011 22:58:42

Hola.

Borré mi mensaje anteriór por que ví que agregaste el problema, pero fuiste más rápido... :)

Saludos.

ecfisa 21-11-2011 23:16:49

Hola mizzard.

Si utilizas el DBGrid sólo para mostrar datos, desde el Object Inspector pone en la propiedad Options , dgEditing = False

Saludos.

mizzard 21-11-2011 23:46:20

Cita:

Empezado por ecfisa (Mensaje 419031)
Hola mizzard.

Si utilizas el DBGrid sólo para mostrar datos, desde el Object Inspector pone en la propiedad Options , dgEditing = False

Saludos.

Como comente tengo esa opcion ya puesta, pero aun asi cuando hago clic aparece lo q comento

PD: En Explorer 9 no puedo escribir nada :(

ecfisa 22-11-2011 00:23:20

Hola.

Que extraño... Lo único que se me ocurre es que actives la opción dgRowSelect de ese modo dgEditing es ignorada.

Saludos.

mizzard 22-11-2011 00:27:04

Cita:

Empezado por ecfisa (Mensaje 419040)
Hola.

Que extraño... Lo único que se me ocurre es que actives la opción dgRowSelect de ese modo dgEditing es ignorada.

Saludos.


Tambien lo he probado :S.... y alguna opcion para que cuando haga clic con el raton q no haga nada?? como detectar el evento y q no haga nada...

No se me ocurre nada...

ecfisa 22-11-2011 21:08:29

Hola mizzard.

Lamentablemente para el TDBGrid no funciona ReleaseCapture, pero todavía hay algo que podés hacer para que no aparezca [WIDEMEMO] y es aprovechar el evento OnGetText del campo Descripcion.

Primero que nada, ya no necesitaras del evento OnDrawColumnCell, así que desactivalo.

Si tenés creado el campo persistente sólo tenés que hacer doble click sobre el evento OnGetText del mismo y agregar dos líneas si no, lo podés asignar manualmente por ejemplo en el evento OnCreate del form como en el código siguiente:
Código:

void __fastcall TForm1::DescripcionGetText(TField *Sender,
      AnsiString &Text, bool DisplayText)
{
  TStringField *Fd = static_cast<TStringField*>(Sender);
  Text = Fd->AsString;
}

/* (No es necesario si está asignado desde el campo persistente) */
void __fastcall TForm1::FormCreate(TObject *Sender)
{
 DataSet->FieldByName("Descripcion")->OnGetText = DescripcionGetText;
}

Lo que no comprendo es que no te funcione dgEditing, me parece extrañísimo ya que tanto en Delphi como en Builder me funciona correctamente.

Un saludo.

ecfisa 22-11-2011 21:22:05

Hola.

Me olvidaba... para no dejar cabos sueltos:
Código:

void __fastcall TForm1::FormDestroy(TObject *Sender)
{
  DataSet->FieldByName("Descripcion")->OnGetText = NULL;
}

Saludos.

mizzard 25-11-2011 02:00:17

Hola, perdona por la tardanza, que he estado liado en otras cosas :S.

Comentar que aunque este desactivada la opcion de editar en el grid, sí que se puede hacer clic por lo que con lo q te comento q hago aparece el (WIDEMEMO).

Intente llevar a cabo tu solucion, pero la verdad es q me perdia, intuyo que tenia que utilizar otro componente (TADODataset?), lo que pasa es q nunca lo he usado y no paraba de salirme errores de compilacion :S. Yo utilizo ADOQuerys con DataSources a partir de un TADOConnection.

Al final se me ocurrio una "chapuza" que medio lo subsana (aunq no del todo) que es deshabilitar el grid con el evento onMouseEnter y habilitar la con el evento onMouseLeave :P

Sé que no es una buena solucion, pero como se trata de algo puramente estetico no quiero darle demasiada importancia.

No obstante quiero mostrarte mi gratitud y agradecerte si me pudieras explicar un poco con mas detalle o con ejemplos la propuesta de solucion que me has dixo

Muchas gracias y un saludo!

ecfisa 25-11-2011 03:32:17

Hola mizzard.


Voy a tratar de explicarte la forma más simple, mediante los campos persistentes.

Sobre el componente ADOQuery haces click con el botón derecho del mouse y de la ventana emergente elegís Fields Editor.
Te abre una ventana donde nuevamente haces click con botón derecho y elegis Add All Fields. Acabas de crear todos los campos persistentes.
En esa misma ventana, seleccionas tu campo MEMO (creo que es Descripcion), luego te vas al Object Inspector y haces click sobre la pestaña Events y doble click sobre el evento OnGetText, Builder te creará de forma automática algo similar a:
Código:

void __fastcall TForm1::ADOQuery1DescripcionGetText(TField *Sender,
  AnsiString &Text, bool DisplayText)
{

}

Dentro de la función agregas las siguientes líneas:
Código:

  TStringField *Fd = static_cast<TStringField*>(Sender);
  Text = Fd->AsString;

Y eso es todo.

Si hay algo en lo que no me haya explicado bién, no dudes en volver a preguntar.

Un saludo.

mizzard 25-11-2011 11:03:13

:D :D :D Claro como el agua y perfectamente funcional.

Otro problema que tengo relacionado con el campo MEMO lo he iniciado en este post:
http://www.clubdelphi.com/foros/showthread.php?t=76753

En donde tengo que mostrar el campo memo en un informe usando Rave Reports. Tenia la esperanza que al hacer lo que me has indicado, se viera bien en Rave... pero va a ser q no :(

Si le puedes echar un ojo a ver q se te ocurre estare muy agradecido. Muchas gracias por toda la ayuda recibida tanto en este post como en los anteriores.

Un abrazo!


La franja horaria es GMT +2. Ahora son las 13:43:01.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi