Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-09-2016
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Checkbox en un DBGrid

Buenas a todos. A ver si me podéis ayudar que no sé por dónde salir. La aplicaicón está hecah con Builder 6 y tengo este DBGrid cargado a partir de una tabla en FB, por lo tanto no tiene campos tipo BOOL y uso uno SMALLINT, en el que he conseguido meter un Checkbox cogiendo trozos de código.

Y tengo este código:
Código:
void __fastcall TfAboRec::DBGrid1DrawColumnCell(TObject *Sender,
      const TRect &Rect, int DataCol, TColumn *Column,
      TGridDrawState State)
{
     TCanvas *c = DBGrid1->Canvas;
     if (Column->FieldName == "SELECCION")
          DibujarCheckBox(c, Rect, Column->Field->AsInteger);
     else
          DBGrid1->DefaultDrawColumnCell(Rect, DataCol, Column, State);
}
//---------------------------------------------------------------------------

void __fastcall TfAboRec::DibujarCheckBox(TCanvas *c, const TRect &Rect, int Valor)
{
     TRect r = Rect;
     UINT Checked = (!Valor ? DFCS_BUTTONCHECK : DFCS_BUTTONCHECK | DFCS_CHECKED);
     c->FillRect(Rect);
     r.Top += 2;
     r.Bottom -= 1;
     r.Left += 1;
     r.Right -= 1;
     DrawFrameControl(c->Handle, (RECT*)&r, DFC_BUTTON, DFCS_BUTTONCHECK | Checked);
}
//---------------------------------------------------------------------------

void __fastcall TfAboRec::DBGrid1CellClick(TColumn *Column)
{
     int nValor;

     if (Column->FieldName == "SELECCION")
     {
          nValor = Column->Field->AsInteger;

          fPersona->tTemp->Edit();
          fPersona->tTemp->FieldValues[Column->FieldName] = !nValor;
          fPersona->tTemp->Post();
     }
}
//---------------------------------------------------------------------------
Se compila y ejecuta sin ningún problema y el checkbox se marca y desmarca bien, pero a la hora de actualizar el valor de la tabla en función de si está o no marcado el Checkbox no me modificac nada y no sé como arreglarlo.
Responder Con Cita
  #2  
Antiguo 02-09-2016
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Por cierto, que se me olvidó: La tabla que alimenta al DBGrid está definida así:
Código SQL [-]
CREATE TABLE Tabla (Identidad VARCHAR(60), Referencia VARCHAR(13), Codigo INTEGER, 
Importe DECIMAL(9,2), Seleccion SMALLINT DEFAULT 0, PRIMARY KEY (Identidad, Referencia, Codigo))
Responder Con Cita
  #3  
Antiguo 02-09-2016
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Angel.Matilla Ver Mensaje
... a la hora de actualizar el valor de la tabla en función de si está o no marcado el Checkbox no me modificac nada y no sé como arreglarlo.
¿Dónde está el update?
Responder Con Cita
  #4  
Antiguo 02-09-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola.

De este modo tiene que funcionarte:
Código PHP:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  
TDBCheckBox *CB static_cast<TDBCheckBox*>(DBCheckBox1);
  
CB->Caption    "";
  
CB->ValueChecked 1;
  
CB->ValueUnchecked 0;
  
CB->DataSource DataSource1;
  
CB->DataField  "SELECCION";
  
CB->Visible    false;
}


void __fastcall TForm1::DBGrid1DrawColumnCell(TObject *Sender,
      const 
TRect &Rectint DataColTColumn *ColumnTGridDrawState State)
{
  const 
int IsChecked[2] = {DFCS_BUTTONCHECKDFCS_BUTTONCHECK DFCS_CHECKED};

  
TDBGrid *GR static_cast<TDBGrid*>(Sender);
  
TDBCheckBox *CB static_cast<TDBCheckBox*>(DBCheckBox1);
  
TRect DrawRect;

  if (
Column->Field->FieldName == CB->DataField) {
    if (
State.Contains(gdFocused) ) {
      
CB->Left    GR->Left Rect.left 2;
      
CB->Top     GR->Top  Rect.top 2;
      
CB->Width   Rect.Right Rect.Left;
      
CB->Height  Rect.Bottom Rect.Top;
      
CB->Visible true;
    }  else {
      
DrawRect Rect;
      
InflateRect(&DrawRect, -1, -1);
      
GR->Canvas->FillRect(Rect);
      
DrawFrameControl(GR->Canvas->Handle, &DrawRectDFC_BUTTON,
        
IsChecked[Column->Field->AsInteger]);
    }
  }
}

void __fastcall TForm1::DBGrid1ColExit(TObject *Sender)
{
  
TDBGrid *GR static_cast<TDBGrid*>(Sender);
  
DBCheckBox1->Visible GR->SelectedField->FieldName == DBCheckBox1->DataField;

(fijate que usé un TDBCheckBox en lugar de un TCheckBox)

Y en la definición de la tabla agregaría:
Código SQL [-]
CREATE TABLE TABLA (
  ...,
  SELECCION   SMALLINT DEFAULT 0 CHECK(SELECCION IN (0,1)),
  ...
);

Y, como lógicamente te indica Casimiro, tu DataSet tiene que tener la capacidad de actualizar la tabla.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....

Última edición por ecfisa fecha: 02-09-2016 a las 20:39:51. Razón: cambiar nombre de tabla
Responder Con Cita
  #5  
Antiguo 05-09-2016
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Notevi Ver Mensaje
¿Dónde está el update?
En el código, al final:
Código:
void __fastcall TfAboRec::DBGrid1CellClick(TColumn *Column)
{
     int nValor;

     if (Column->FieldName == "SELECCION")
     {
          nValor = Column->Field->AsInteger;

          fPersona->tTemp->Edit();
          fPersona->tTemp->FieldValues[Column->FieldName] = !nValor;
          fPersona->tTemp->Post();
     }
}
//---------------------------------------------------------------------------
Después de haber subido el mensaje hice otra prueba distinta con este otro código:
Código:
void __fastcall TfAboRec::DBGrid1CellClick(TColumn *Column)
{
     int nCodigo, nValor;

     if (Column->FieldName == "SELECCION")
     {
          nValor = Column->Field->AsInteger;
          nCodigo = DBGrid1->Columns->Items[4]->Field->Value;

          Query->Close();
          Query->SQL->Text = "UPDATE " + cTabTemp + " SET Seleccion = :Seleccion WHERE Codigo = :Codigo";
          Query->ParamByName("Seleccion")->AsInteger = nValor == 0 ? 1 : 0;
          Query->ParamByName("Codigo")->AsInteger    = nCodigo;
          try
          {
               Query->ExecSQL();
               Query->Transaction->Commit();
          }
          catch(...)
          {
          }
     }
}
//---------------------------------------------------------------------------
Y sí, así me actualizó la tabla... pero ¡me dejó vacío el DBGrid!
Responder Con Cita
  #6  
Antiguo 05-09-2016
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Cita:
Empezado por ecfisa Ver Mensaje
Hola.

De este modo tiene que funcionarte:
Pues no, tampoco actualiza la tabla. Al final encontré uan forma un pelín "pedestre", pero fumciona y hasta que encuentre una mejor me vale:
Código:
void __fastcall TfAboRec::DBGrid1CellClick(TColumn *Column)
{
     int nCodigo, nValor;

     if (Column->FieldName == "SELECCION")
     {
          nValor = Column->Field->AsInteger;
          nCodigo = DBGrid1->Columns->Items[4]->Field->Value;

          fPersona->tTemp->Close();     // Cierro al tabal ANTES de actualizar
          fPersona->Query->Close();
          fPersona->Query->SQL->Text = "UPDATE " + cTabTemp + " SET Seleccion = :Seleccion WHERE Codigo = :Codigo";
          fPersona->Query->ParamByName("Seleccion")->AsInteger = nValor == 0 ? 1 : 0;
          fPersona->Query->ParamByName("Codigo")->AsInteger    = nCodigo;
          try
          {
               fPersona->Query->ExecSQL();
               fPersona->Query->Transaction->Commit();
               fPersona->tTemp->Open();     // Vuelvo a abrir la tabla
          }
          catch(...)
          {
          }
     }
}

Última edición por Angel.Matilla fecha: 05-09-2016 a las 10:21:26.
Responder Con Cita
  #7  
Antiguo 05-09-2016
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Angel.Matilla.

Bueno, pero eso era debido al tipo de componente data aware que estabas usando o la forma en que lo usabas.

Varios juegos de componentes permiten asociarle a sus "queries" un componente updatesql que te evitaría escribir ese código, como por ejemplo la dupla TIBQuery/TIBUpdateSQL. Pero para ser mas específico habría que saber que componentes estas usando.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
Respuesta



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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
CheckBox en DBGrid DrkMgc Varios 9 18-05-2011 17:41:47
Checkbox en un DBGrid alfil123 Conexión con bases de datos 1 25-10-2006 19:02:57
Checkbox en un dbgrid el_barto OOP 7 25-08-2005 10:08:21
DBgrid y Checkbox santi Varios 2 24-01-2005 18:25:53
CheckBox en un DBGrid DJ VMan MySQL 4 26-06-2003 17:05:26


La franja horaria es GMT +2. Ahora son las 00:47:26.


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