Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-03-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 21
Nuria Va por buen camino
Question 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;
Cuando hago click en la casilla del CheckBox me la marca o me la desmarca según corresponda, hasta ahí bien. Pero vuelvo a hacer un click en la misma casilla y me desaparece el check y me aparece la palabra True/False. Si voy 'clickeando' en casillas distintas funciona a la perfección pero si es en la misma no.
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'.
Responder Con Cita
  #2  
Antiguo 31-03-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 21
Nuria Va por buen camino
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;
mmmm.... , de donde he podido sacar este código...

Saludillos!
Responder Con Cita
  #3  
Antiguo 31-03-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Hola piltrafilla

A ver, algunos comentarios

En tu código veo....
Código:
  if IBQ.AsBoolean then
Esto te compila?? IBQ no es el TIBQuery?? Te falta el campo!!!

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;
Mas cosillas

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;
Si puedes, hazlos tambien en la demo, a ver si te pasa (ah, por cierto, si lo haces, recuerda en poner la pripiedad RequestLive en true del TQuery )

Última edición por __cadetill fecha: 31-03-2004 a las 17:24:06. Razón: Hacer una ampliación
Responder Con Cita
  #4  
Antiguo 31-03-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 21
Nuria Va por buen camino
Hola xiquitín!

Cita:
Empezado por Cadetill
Esto te compila?? IBQ no es el TIBQuery?? Te falta el campo!!!
Cierto, es IBQSEL, me equivoqué al escribir... hoy estoy un poco 'empana'.

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;
Pero me da un error porque uso un TIBQuery:
Código:
...DatabaseError.... 'IBQ: Cannot modify a read-only dataset'
Los TIBQuery no tienen la propiedad RequestLive y que yo sepa nada parecido. Por lo tanto me sigue sin funcionar... .

Voy a seguir investigando y probando, cuando lo solucione que lo solucionaré te cuento. Muchas gracias 'apañero'.
Responder Con Cita
  #5  
Antiguo 31-03-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Cita:
Empezado por Nuria
Los TIBQuery no tienen la propiedad RequestLive y que yo sepa nada parecido. Por lo tanto me sigue sin funcionar... .
En este caso tienes 2 opciones, o bien usas un TIBDataset o bien la unión TIBQuery + TIBUpdateSQL

Te lo dejo a tu elección
Responder Con Cita
  #6  
Antiguo 31-03-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 21
Nuria Va por buen camino
Cita:
Empezado por Cadetill
En este caso tienes 2 opciones, o bien usas un TIBDataset o bien la unión TIBQuery + TIBUpdateSQL
Pues fíjate tú, que nunca he usado el TIBUpdateSQL, acabo de meterme hace muy poco con los IBX, he estado investigando y creo que lo voy a usar en bastantes ocasiones...Gracias.

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!
Responder Con Cita
  #7  
Antiguo 31-03-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 21
Nuria Va por buen camino
Wink 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;
Sigo buscando otra solución mejor.

Saludos!
Responder Con Cita
  #8  
Antiguo 31-03-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Cita:
Empezado por Nuria
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.
Bueno, supongo que será un entero con valores 1 o 0, no?
Si es así, prueba a poner....

Código:
     if Column.Field.DataType = ftInteger then
      begin
           // Pintamos solo la celda booleana
           if Column.Field.AsBoolean and (Pintar.ItemIndex = 1) 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.AsInteger = 1]);
      end;
En negrita las lineas que cambian. De esta manera te evitas el campo calculado. Luego, en el OnClick, sólo has de actualizar susodicho campo.

Atención: esta manera tiene un problema, y es que afectará a todos los campos de tipo Integer.
Solución: en lugar de mirar el tipo de campo, mirar por el nombre de campo
ej: if Column.Field.FieldName = 'MiCampoInteger' then

Espero te sirva
Responder Con Cita
  #9  
Antiguo 01-04-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 21
Nuria Va por buen camino
Muchas gracias de nuevo....

He probado lo que tú me comentabas y me hace lo mismo pero en vez de ponerme true/false pone 0/1... .

Como te dije antes medianamente lo conseguí arreglar, pasando el foco a otra celda. Pero ahora además, me hace otra cosa ... cuando el grid tiene un montón de líneas pues me aparece el scroll vertical como es lógico, marco varios check, pincho en el scroll y voy bajando líneas, cuando vuelvo arriba me ha desmarcado todos los checks . En tú demo lo he probado y funciona correctamente.

Así que sigo dandole vueltas al asunto...

Un saludito!
Responder Con Cita
  #10  
Antiguo 01-04-2004
__cadetill __cadetill is offline
Miembro
 
Registrado: may 2003
Posts: 3.387
Poder: 24
__cadetill Va por buen camino
Hola niña

Bueno, he hecho una prueba y ya he visto lo que te pasa
En la prueba me pasaba lo mismo que a ti y decidí mirar qué diferencias había entre la configuración de un Grid y el otro

Pues bien, el de la demo está en Option.dgEditing = false, es decir, no editable

Esto puedes controlarlo, si quieres, en el evento OnColEnter, mirar si es la columna del campo Check y si lo es, poner dgEditing a false, sino, ponerlo a true

¿qué te parece la idea?
Responder Con Cita
  #11  
Antiguo 01-04-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 21
Nuria Va por buen camino
Pues va ser que no...

Hola !

Cita:
Empezado por cadetill
Option.dgEditing = false,....Esto puedes controlarlo en el evento OnColEnter
Lo he probado y sigue haciéndome las mismas cosas raras ... se me resiste.

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!
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 21:19:14.


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