PDA

Ver la Versión Completa : DBGrid+checkbox


vicrati
24-07-2006, 17:51:37
hola,
a ver os cuento.
Resulta que tengo implementado un DBgrid con un checkbox que funciona correctamente, el checkbox asociado a un campo logico.
Va bien, es decir, cuando marca la 'celda' del checkbox me modifica en la tabla el estado logico del campo.
Mi problema es que solo quiero que se modifique cuando pincho en el checkbox no en la celda completa.
¿Me explico?
Muchisimas gracias.

vtdeleon
24-07-2006, 19:55:13
Saludos
¿Me explico?No:confused:

Neftali [Germán.Estévez]
25-07-2006, 10:52:23
Dependerá de cómo lo hayas implementado.
Seguro que en algun sitio has programado el cambio del campo segun el checkbox,
¿Puedes poner ese código (como mínimo)?

Si no comprenderás que es casi imposible responderte.

vicrati
25-07-2006, 11:37:46
Este es el metodo que lo dibuja el check
procedure TWVentana.DBGrid1DrawColumnCell(Sender: TObject;
const Rect: TRect; DataCol: Integer; Column: TColumn;
State: TGridDrawState);
var
Check: Integer;
R: TRect;
XVentana:TRecVentana;
begin
if Column.FieldName = 'L_SEL_REM' then //indico la columna donde lo quiero poner
begin
DBGrid1.Canvas.FillRect(Rect);//Rellenas en el drid un rectangulo
Check := 0;
if FTBVentana.FindField('L_SEL_REM').AsBoolean = true then Check := DFCS_CHECKED;
R:=Rect;
// InflateRect(R,-2,-2); //Disminuye el tamaño del CheckBox
DrawFrameControl(DBGrid1.Canvas.Handle,R,DFC_BUTTON, DFCS_BUTTONCHECK or Check);
end;
end;

y este es el metodo de cambio de estado del check

procedure TWventana.DBGrid1CellClick(Column: TColumn);
var
Xventana:TRecventana;
begin
FTBVentana.DisableControls;
try
if Column.FieldName = 'L_SEL_REM' then begin
FTBVentana.edit;
try
if FTBVentana.FieldByName('L_SEL_REM').AsBoolean = true then
FTBVentana.FieldByName('L_SEL_REM').AsBoolean := false
else
FTBVentana.FieldByName('L_SEL_REM').AsBoolean := true
finally
FTBVentana.Commit;
end;
Dbgrid1.Refresh; // quizás más bien un Repaint.... pero en fin.
end;
finally
FTBVentana.EnableControls;
end;
end;

entonces si yo pincho con el raton en cualquier parte de la celda donde esta el checkbox me cambia el estado, y solo quiero que me cambie el estado cuando pincho justamente en el checkbox.
Gracias

Neftali [Germán.Estévez]
25-07-2006, 12:03:30
Antes de nada te recomiendo que utilices TAG's en los mensajes (http://neftali.clubdelphi.com/images/ResaltarSintaxisDelphi.png). Puedes empezar por editar el de arriba y añadirlas.
En cuando al problema, está claro que para detectar si haces un click dentro del recuadro, debes tener las coordenadas X e Y; Para eso tal vez deberás utilizar algun otro evento combinado con el que ya utilizas. Prueba con el OnMouseDown; Y a ver si a a partir de ese eres capaz de obtener las coordenadas relativas a la celda.

Revisa, haz alguna pruba y ya dirás...

vicrati
14-08-2006, 11:08:23
hola ya consegui hayar las coordenadas y todo va casi perfecto.
Resulta que cuando tengo la celda con el check marcado y ademas la celda seleccionada y quiero desmarcar ese check no me deja, se deja de visualizar el check y sale a la izquierda de la celda la palabra true o false segun este marcado o desmarcado.
La unica manera de marcar o desmarcar es quitando la seleccion de la celda.
No tengo ni idea porque me pasa esto.
¿Alguien sabe? Gracias