Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 20-02-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Desproteger DBGrid en ejecución

Hola amigos, estoy trasteando un poco con las bases de datos y me encuentro con el siguiente problema. Tengo un DBGrid el cual de inicio se selecciona toda la fila, no tiene habilitada la opcion de seleccionar varias filas, no se puede editar el valor de las celdas y tiene la propiedad de ReadOnly a true. Quiero revertir todo eso para poder hacerlo al ingresar una contraseña y de momento estoy con esta prueba:
Código PHP:
void __fastcall TForm2::ButtonDesbloquearClick(TObject *Sender)
{
    
AnsiString pass "1234567890";
    
AnsiString cadena InputBox("Desbloqueo de lista","Introduce la contraseña:","");
    if(
pass == cadena)
    {
        
DBGrid1->Options TDBGridOptions(DBGrid1->Options) >> dgRowSelect >> dgEditing;
        
DBGrid1->ReadOnly false;
        
DBNavigator1->Enabled true;
    }else{
        
ShowMessage("Contraseña incorrecta. No se ha desbloqueado la lista.");
    }

Me encuentro con que se deshabilita la opcion dgRowSelect pero parece que la opcion dgEditing no porque no me deja editar nada. ¿Pueden ayudarme?
Responder Con Cita
  #2  
Antiguo 20-02-2017
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.

Código PHP:
...
{
  
DBGrid1->ReadOnly false;
  
DBGrid1->Options  DBGrid1->Options +
    
TDBGridOptions() >> dgRowSelect << dgEditing << dgMultiSelect ;
  
// O también:
  // DBGrid1->Options  = TDBGridOptions(DBGrid1->Options) >> dgRowSelect
  //  << dgEditing << dgMultiSelect ;
 

Saludos
__________________
Daniel Didriksen

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

Última edición por ecfisa fecha: 20-02-2017 a las 16:32:27. Razón: agregar opción
Responder Con Cita
  #3  
Antiguo 20-02-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Gracias lo pruebo cuando llegue y te digo que tal. Por cierto no quiero que se pueda hacer multiseleccion nunca así que lo que haces al final supongo que puedo quitarlo.
Otro problema que tenia es que uso en el evento onclick del dbgrid:
Código PHP:
EditNombre->Text=DBGrid1->DataSource->DataSet->FieldValue["Nombre"]; 
Una vez que podía editar si creo un nuevo registro con el botón + del DBNavigator aparecía la línea y si la selecciono me sale un error donde dice que no se puede convertir una variable de tipo null a string. Lo he "solucionado" usando un try catch pero me gustaría hacerlo correctamente y no se como seria. ¿podrías ayudarme con eso también?
Responder Con Cita
  #4  
Antiguo 20-02-2017
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
Cita:
Empezado por aguml Ver Mensaje
Por cierto no quiero que se pueda hacer multiseleccion nunca así que lo que haces al final supongo que puedo quitarlo.
Si, así es.

Cita:
Empezado por aguml Ver Mensaje
... si creo un nuevo registro con el botón + del DBNavigator aparecía la línea y si la selecciono me sale un error donde dice que no se puede convertir una variable de tipo null a string. Lo he "solucionado" usando un try catch pero me gustaría hacerlo correctamente y no se como seria. ¿podrías ayudarme con eso también?
Agrega el mismo código al evento BeforeAction:
Código PHP:
void __fastcall TForm1::DBNavigator1BeforeAction(TObject *Sender,
      
TNavigateBtn Button)
{
  if ( 
Button == nbInsert )  // ¿ inserta ?
 
{  
    
DBGrid1->ReadOnly false;
    
DBGrid1->Options  TDBGridOptions(DBGrid1->Options) >> dgRowSelect
                        
<< dgEditing;
  }

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 20-02-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Creo que no me he explicado bien, el DBNavigator por defecto esta deshabilitado y al desbloquear todo también habilito a este. Si le doy al + pero no escribo nada y cambio de columna en la misma fila y luego vuelvo a la celda de columna Nombre de esa fila, en ese momento es cuando me tira la excepción.
Responder Con Cita
  #6  
Antiguo 20-02-2017
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.
Cita:
Empezado por aguml Ver Mensaje
Creo que no me he explicado bien, el DBNavigator por defecto esta deshabilitado y al desbloquear todo también habilito a este. Si le doy al + pero no escribo nada y cambio de columna en la misma fila y luego vuelvo a la celda de columna Nombre de esa fila, en ese momento es cuando me tira la excepción.
Reproduje la situación que comentas arriba y no obtengo error.

Tal vez descubriríamos algo si nos publicas los eventos y código donde desactivas y donde activas las acciones.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 20-02-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Te pongo el enlace para poder descargar el proyecto: https://mega.nz/#!Uo0y2ZbT!WT7qUG6OQ...OoLYEFu6bTkt4E
Es solo una prueba para experimentar con sqlite y zeosdb ya que no se casi nada de ellos y queria ver su uso un poco haciendo una especie de base de datos de clientes donde se van insertando las consumisiones.
Responder Con Cita
  #8  
Antiguo 21-02-2017
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.

No pude compilar y/o ejecutar tu código por que me faltan componentes, pero cuando usas la propiedad vectorial FieldValues en el evento OnCellClick deberías revisar que el valor del campo actual no sea nulo:
Código PHP:

void __fastcall TForm2
::DBGrid1CellClickTColumn *Column )
{
  
TDBGrid  *GR static_cast<TDBGrid*>( DBGrid1 );
  
TDataSet *DS static_cast<TDataSet*> ( DBGrid1->DataSource->DataSet );

  
EditNombre->Text VarToStrDef(DS->FieldValues["Name"], "");  // <-
  
EditPrecio->Text VarToStrDef(DS->FieldValues["Area"], "0"); // <-  

  
if ( EditUnidades->Text != "" && EditPrecio->Text != "" )
    
EditTotal->Text EditUnidades->Text.ToDouble() *
                      
EditPrecio->Text.ToDouble();

Por mi parte prefiero no usar la propiedad FieldValues ya que, debido a que usa Variants, es la opción mas lenta.

Mas rápido es:
Código PHP:
...
void __fastcall TForm2::DBGrid1CellClickTColumn *Column )
{
  
TDBGrid  *GR static_cast<TDBGrid*>( DBGrid1 );
  
TDataSet *DS static_cast<TDataSet*>( DBGrid1->DataSource->DataSet );

  
EditNombre->Text DS->FieldByName("Nombre")->AsString;
  
EditPrecio->Text DS->FieldByName("Precio")->AsString;

  if ( 
EditUnidades->Text != "" && EditPrecio->Text != "" )
    
EditTotal->Text EditUnidades->Text.ToDouble() *
                      
EditPrecio->Text.ToDouble();
}
... 
Por último la opción mas eficiente es crear los campos persistentes del TDatSet y citarlos por su nombre.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #9  
Antiguo 21-02-2017
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
Que es eso de los campos persistentes?
Responder Con Cita
  #10  
Antiguo 21-02-2017
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.
Cita:
Empezado por aguml Ver Mensaje
Que es eso de los campos persistentes?
Para crearlos en tiempo de diseño básicamente los pasos son:
  1. Doble click sobre el componente DataSet (se abre ventana)
  2. Click botón derecho sobre la nueva ventana
  3. Click botón izquierdo sobre el ítem: Add all fields
Vas a encontrar una explicación detallada sobre el tema en el capítulo "Acceso a campos" de La cara oculta de Delphi 4.

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
Proteger y desproteger hoja en excel karla Servers 4 06-08-2010 13:20:14
Tiempo de ejecución. Columnas en DBGrid. manueljgc OOP 0 07-03-2009 22:30:36
DBGrid en tiempo de ejecución iga Gráficos 6 14-12-2007 01:52:10
Modificar campos en un DBGrid en tiempo de ejecuciòn maravert Conexión con bases de datos 3 14-05-2006 08:37:41
Columnas de DBGrid en tiempo de ejecución dape Varios 1 17-03-2005 03:57:31


La franja horaria es GMT +2. Ahora son las 01:11:51.


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