FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
RxDBGrid y los CheckBox
Hola!
Mirándo el ejemplo del RxDBGrid que tiene en su página web el compi (gracias... cadetill), he creado según mis necesidades el mío propio, pero tengo el siguiente problemilla con los CheckBox. Trabajo con Delphi 7 y con IBX. Tengo el RxDBGrid enlazado a un TIBQuery, que yo le he añadido un campo calculado SEL de tipo boolean que lo voy a usar para marcar o desmarcar las líneas del grid. Esto es lo que he hecho: Código:
procedure RxDBGrid1CellClick(Column: TColumn); begin if RxDBGrid1.SelectedIndex = 3 then begin // Columna donde tengo el checkbox if IBQ.FieldByName('SEL').AsBoolean then begin IBQ.FieldByName('SEL').AsBoolean := False; end else begin IBQ.FieldByName('SEL').AsBoolean := True; end end; end; Qué podría hacer para que no me aparecieran las palabras True/False? Es mejor hacerlo de otra manera? Muchas gracias.... Un Saludillo de esta humilde 'Piltrafilla'. |
#2
|
||||
|
||||
Sólo añadir una cosilla más a lo dicho anteriormente, por si tuviera algo que ver. Este es el código que tengo en el evento OnDrawColumnCell del RxDBGrid.
Código:
procedure TfFacturas.RxDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); const CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); var CheckBoxRectangle : TRect; begin // Pintamos toda la fila de la celda booleana // Para hacerlo tenemos que hacer referencia al campo booleano if IBQ.AsBoolean then begin RxDBGrid1.Canvas.Brush.Color := clInfobk; RxDBGrid1.Canvas.Font.Style := [fsBold]; RxDBGrid1.Canvas.Font.Color := ClBlack; RxDBGrid1.DefaultDrawColumnCell(Rect,Datacol,Column,State); end; // campo Check if Column.Field.DataType = ftBoolean then begin // Pintamos solo la celda booleana if Column.Field.AsBoolean then begin RxDBGrid1.Canvas.Brush.Color := clInfobk; RxDBGrid1.Canvas.Font.Style := [fsBold]; RxDBGrid1.Canvas.Font.Color := ClBlack; RxDBGrid1.DefaultDrawColumnCell(Rect,Datacol,Column,State); end; RxDBGrid1.Canvas.FillRect(Rect); CheckBoxRectangle.Left := Rect.Left + 2; CheckBoxRectangle.Right := Rect.Right - 2; CheckBoxRectangle.Top := Rect.Top + 2; CheckBoxRectangle.Bottom := Rect.Bottom - 2; DrawFrameControl(RxDBGrid1.Canvas.Handle, CheckBoxRectangle, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]); end; end; Saludillos! |
#3
|
|||
|
|||
Hola piltrafilla
A ver, algunos comentarios En tu código veo.... Código:
if IBQ.AsBoolean then Otra cosilla Si la celda booleana con valor true la pintas de la misma manera que toda la fila de la cual el campo booleano está en true... te sobra un DefaultDrawColumnCell. Te tendría que quedar así: Código:
procedure TfFacturas.RxDBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer; Column: TColumn; State: TGridDrawState); const CtrlState : array[Boolean] of Integer = (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED); var CheckBoxRectangle : TRect; begin // Pintamos toda la fila de la celda booleana // Para hacerlo tenemos que hacer referencia al campo booleano if IBQCampoBooleano.AsBoolean then begin RxDBGrid1.Canvas.Brush.Color := clInfobk; RxDBGrid1.Canvas.Font.Style := [fsBold]; RxDBGrid1.Canvas.Font.Color := ClBlack; RxDBGrid1.DefaultDrawColumnCell(Rect,Datacol,Column,State); end; // campo Check if Column.Field.DataType = ftBoolean then begin RxDBGrid1.Canvas.FillRect(Rect); CheckBoxRectangle.Left := Rect.Left + 2; CheckBoxRectangle.Right := Rect.Right - 2; CheckBoxRectangle.Top := Rect.Top + 2; CheckBoxRectangle.Bottom := Rect.Bottom - 2; DrawFrameControl(RxDBGrid1.Canvas.Handle, CheckBoxRectangle, DFC_BUTTON, CtrlState[Column.Field.AsBoolean]); end; end; He probado tu código (sólo que atacando a Paradox ya que he usado la demo de la web) y, a mi no me hace el efecto que indicas Los cambios que he hecho son.... Código:
procedure TDbGrid.RxDBGrid1CellClick(Column: TColumn); begin RxDBGrid1.DataSource.DataSet.Edit; if RxDBGrid1.SelectedIndex = 0 then // Columna donde tengo el checkbox RxDBGrid1.DataSource.DataSet.FieldByName('Preferred').AsBoolean := not RxDBGrid1.DataSource.DataSet.FieldByName('Preferred').AsBoolean; RxDBGrid1.DataSource.DataSet.Post; end; Última edición por __cadetill fecha: 31-03-2004 a las 16:24:06. Razón: Hacer una ampliación |
#4
|
||||
|
||||
Hola xiquitín!
Cita:
He probado lo que me has dicho en la demo y funciona a la perfección. He intentado hacerlo así: Código:
RxDBGrid1.DataSource.DataSet.Edit; if RxDBGrid1.SelectedIndex = 0 then // Columna donde tengo el checkbox RxDBGrid1.DataSource.DataSet.FieldByName('SEL').AsBoolean := not RxDBGrid1.DataSource.DataSet.FieldByName('SEL).AsBoolean; RxDBGrid1.DataSource.DataSet.Post; Código:
...DatabaseError.... 'IBQ: Cannot modify a read-only dataset' Voy a seguir investigando y probando, cuando lo solucione que lo solucionaré te cuento. Muchas gracias 'apañero'. |
#5
|
|||
|
|||
Cita:
Te lo dejo a tu elección |
#6
|
||||
|
||||
Cita:
No creo que pueda hacer lo de los Check con la modificación que me dijiste antes porque el campo Boolean NO es un campo de la tabla propiamente dicho, sino un campo calculado que me he creado yo. Ya veré como lo hago finalmente. Un saludillo! |
#7
|
||||
|
||||
Una posible solución...
He encontrado una solución, no me gusta mucho pero de esta manera ya no me desaparece el check cuando marco dos veces sobre la casilla.
Código:
procedure RxDBGrid1CellClick(Column: TColumn); begin if RxDBGrid1.SelectedIndex = 3 then begin // Donde tengo el check RxDBGrid1.DataSource.DataSet.FieldByName('SEL').AsBoolean := not RxDBGrid1.DataSource.DataSet.FieldByName('SEL').AsBoolean; RxDBGrid1.SelectedIndex := 1; // Paso el foco a otra celda. end; end; Saludos! |
#8
|
||||
|
||||
Pues va ser que no...
Hola !
Cita:
Lo que me esta dejando loca es lo de la barra del scroll, marco algunos checks y cuando pincho sobre las flechitas del scroll, van desplazándose las líneas y cuando alguna de esas líneas ya no la veo por pantalla y vuelvo a mostrarla me la muestra desmarca. Y si pincho directamente dentro del scroll me las desmarca todas... . Sigo peleandome con el RxGrid.... Mil gracias! |
|
|
|