[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