[Lazarus-es] CheckBox en TDBGrid

Ismael L. Donis Garcia ismael en citricos.co.cu
Vie Jun 3 22:43:53 CEST 2011


El 03/06/11 13:37, Jesus Reyes escribió:
>
>
> --- El vie 3-jun-11, Paola Bruccoleri<pbruccoleri en adinet.com.uy>  escribió:
>
>> De: Paola Bruccoleri<pbruccoleri en adinet.com.uy>
>> Asunto: Re: [Lazarus-es] CheckBox en TDBGrid
>> A: "Spanish version of Lazarus List"<lazarus-es en lists.lazarus.freepascal.org>
>> Fecha: viernes, 3 de junio de 2011, 11:29
>> El 03/06/2011 12:52 p.m., Ismael L.
>> Donis Garcia escribió:
>>> No entendiste bien, en los datos que traigo de la
>> consulta no hay problema, el problema es cuando trato de
>> insertar un registro nuevo (dentro del tdbgrid, trabajo
>> dentro del grid, tecleo directo en el grid)
>>>
>>> Cuando intento insertar un registro nuevo el campo del
>> tdbgrid que tiene la propiedad
>> .ButtonStyle:=cbsCheckboxColumn; me aparece en gris y
>> marcado por defecto y yo quiero que me aparezca desmarcado y
>> habilitado.
>>>
>>> en gris = deshabilitado
>>> si no está en gris = habilitado
>>>
>>> Repito quiero que cuando me mueva para abajo para
>> insertar una nueva fila en el TBDGrid la columna me aparezca
>> habilitada y desmarcado el checkbox. Esto lo he tratado de
>> hacer buscando alguna propiedad y no lo he encontrado,
>> tampoco he encontrado como hacerlo en tiempo de ejecución.
>>>
>> Hola Ismael..
>> pero como el dbgrid está asociado a un table/query,
>> porqué no te fijás en el valor por defecto de ese campo de
>> la bd? porque cuando insertás un registro deade ahí
>> mismo,  internamente se hace un insert..
>> ojo, capaz que el control siempre muestra checked sin darle
>> bolilla al valor x defecto...
>> byeeeeeeeeeee
>>
>
> "Normalmente" un checkbox se utiliza para indicar dos estados, marcado o desmarcado, lo cual esta determinado por los valores de ValueChecked y ValueUnchecked, si para un nuevo registro el valor del campo es NULL el checkbox se mostrara en un tercer estado que es como ya dijiste un checkbox marcado pero deshabilitado.
>
> Se me ocurren 3 soluciones:
>
> 1. Crear un evento OnNewRecord en el Dataset asociado al dbgrid, ahí puedes inicializar los valores de los campos que desees, en este caso podrías poner por defecto el valor correspondiente a ValueUnchecked.
>
> 2. Crear un evento OnUserCheckboxBitmap en el dbgrid, de tal manera que cuando tal evento se active teniendo en el parametro CheckedState=cbGrayed regresemos un bitmap identico al utilizado para CheckedState=cbUnChecked
>
> 3. Podría agregarle a TColumn una propiedad que nos indique que un valor NULL sea siempre considerado como UnChecked, creo que esta solución seria la mas fácil para los usuarios pues se haría en tiempo de diseño, también no requeriría cambiar los datos de NULL a algún valor como en el caso 1). Lo único es que necesitaría algún tiempo para implementar esta opción pues de momento aun me encuentro algo ocupado en otras cosas.
>
> Saludos a todos.
>
> Jesús Reyes A.
>
> _______________________________________________
> Lazarus-es mailing list
> Lazarus-es en lists.lazarus.freepascal.org
> http://lists.lazarus.freepascal.org/mailman/listinfo/lazarus-es
>
>

No supe como agregar la nueva propiedad, porque no supe como asignar un 
valor por defecto a la propiedad (aspecto este que debo estudiar más), 
por lo que opte por modificar el procedimiento dentro del TDBGrid y 
dejar solo 2 valores hasta que Jesús agregué la nueva propiedad.

Por tal motivo la implementación de la propiedad la dejé de la forma que 
sigue:

procedure TCustomDBGrid.DrawCheckboxBitmaps(aCol: Integer; aRect: TRect;
   F: TField);
var
   AState: TCheckboxState;
begin
   if (aCol=Col) and FDrawingActiveRecord then begin
     // show checkbox only if overriden editor is hidden
     if EditorMode then
       exit;
   end;

   // by SSY
   if (F<>nil) then
     if F.DataType=ftBoolean then
       if F.IsNull then
	AState := cbUnChecked
       else
       if F.AsBoolean then
         AState := cbChecked
       else
         AState := cbUnChecked
     else
       if F.AsString=ColumnFromGridColumn(aCol).ValueChecked then
         AState := cbChecked
       else
         AState := cbUnChecked
   else
     AState := cbUnChecked;

   DrawGridCheckboxBitmaps(aCol, Row{dummy}, ARect, AState);
end;

De esa forma me funciona como deseo como bien dije antes, en espera de 
que Jesús agregué la nueva propiedad. De todos modos ya antes le había 
agregado dos propiedades para evitar que te eliminaran filas del grid de 
forma directa y la otra para que no entrara en modo edición cuando 
presionabas enter, las cuales denominé en aquel entonces:

dgDelete y dgKeyEdit

Y de las cuales comenté en una ocasión a Jesús por privado, pero que no 
se si las tuvo en cuenta o no. De todos modos si lo desea le mando las 
modificaciones que he realizado cuando el pueda echarle un vistazo.

1 Millón de Gracias Reiteradas
==========
* ISMAEL *
==========





More information about the Lazarus-es mailing list