Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Habilitar/deshabilitar botones permanentemente

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Habilitar/deshabilitar botones permanentemente Responder citando

Hola
Tengo un problema y es que no sé de qué manera se pueden dejar habilitados o deshabilitados botones al cerrar la aplicación, y que se mantengan así para las sucesivas veces que se ejecuta el programa.
Es decir, si el usuario me pulsa un botón A, se me deshabilitan dos botones B y C, hasta que no me pulse un botón D que se vuelven a habilitar. Lo que trato de hacer es que si pulsa A y cierra el programa, los botones B y C mantengan su propiedad enabled a false hasta que el usuario pulse D, y en cuanto lo haga, que su propiedad enabled sea true de nuevo hasta que se vuelva a pulsar C, independientemente de que se cierre la aplicación o no.
Algo me comentaron del registro de Windows pero la verdad es que no tengo ni idea de cómo manejarlo, asi que si alguien me pudiese indicar una manera de hacerlo, me sería de gran ayuda.
Gracias de antemano y saludos para todos
Volver arriba
Mensaje    Asunto: Responder citando

Yo usaría un archivo con extensión .INI donde guardaría los valores de configuración. Con un puntero a la Clase TIniFile puedes escribir y leer valores que a la hora de arrancar el programa se pueden leer y en función de los datos leidos ajustas las propiedades que quieras de tus objetos. Si utilizas la opción de buscar verás que se ha hablado bastante de esto en el foro.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Prueba algo como:

Guardar configuración
Código:
TIniFile *Conf=new TIniFile("c:\\archivo.ini");
Conf->WriteBool("Botones", "Boton C",Button1->Enabled);
delete Conf;


Leer configuración
Código:
TIniFile *Conf=new TIniFile("c:\\archivo.ini");
//El tercer parámetro de ReadBool es el valor por defecto
//Si no existe la entrada "Boton C" el Button1 aparecerá activo
//Si existe la entrada "Boton C" a Button1 le asignará el valor que le corresponda
Conf->ReadBool("Botones", "Boton C",true);
delete Conf;


¿Te vale esto?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Esto viene de la ayuda del builder 5

Cita:

The INI file format is still popular, many of the C++Builder configuration files (such as the DSK Desktop settings file) are in this format. Because this file format was and is prevalent, VCL provides a class to make reading and writing these files very easy. When you instantiate the INIFile object, you pass as a parameter to the constructor the name of the INI file. If the file does not exist, it is automatically created. You are then free to read values using ReadString, ReadInteger, or ReadBool. Alternatively, if you want to read an entire section of the INI file, you can use the ReadSection method. Similarly, you can write values using WriteBool, WriteInteger, or WriteString.

Following is an example of reading configuration information from an INI file in a form's constructor and writing values in the OnClose event handler.

void __fastcall TForm1::TForm1(TObject *Sender)

{
TIniFile *ini;
ini = new TIniFile(
ChangeFileExt( Application->ExeName, ".INI" ) );
Top = ini->ReadInteger( "Form", "Top", 100 );
Left = ini->ReadInteger( "Form", "Left", 100 );
Caption = ini->ReadString( "Form", "Caption",
"Default Caption" );
ini->ReadBool( "Form", "InitMax", false ) ?
WindowState = wsMaximized :
WindowState = wsNormal;
delete ini;

}
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
TIniFile *ini;
ini = new TIniFile(ChangeFileExt( Application->ExeName, ".INI" ) );
ini->WriteInteger( "Form", "Top", Top );
ini->WriteInteger( "Form", "Left", Left );
ini->WriteString ( "Form", "Caption", Caption );
ini->WriteBool ( "Form", "InitMax",
WindowState == wsMaximized );
delete ini;
}

Each of the Read routines takes three parameters. The first parameter identifies the section of the INI file. The second parameter identifies the value you want to read, and the third is a default value in case the section or value doesn't exist in the INI file. Similarly, the Write routines will create the section and/or value if they do not exist. The example code creates an INI file the first time it is run that looks like this:
[Form]
Top=185
Left=280
Caption=Default Caption

InitMax=0
On subsequent execution of this application, the INI values are read in during creation of the form and written back out in the OnClose event.


Un saludo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Bueno, ya he probado ha hacer lo que me comentais del archivo ini, y literalmente corté y pegué el ejemplo de los botones, pero nada, no me funciona.
En el evento on close guardo la configuración, y en el on create intento leerla. El caso es que el archivo ini me lo crea bien, con el valor 0 si el botón está deshabilitado y 1 si está habilitado. Sin embargo, a la hora de lanzar la aplicación, me aparece siempre el botón habilitado...
Igual es que estoy probándolo mal, pero sencillamente puse dos botones en una form, e hice que se me habitase/deshabitase uno de ellos cuando pulso el otro. Luego cierro la aplicación con la X, y ya está.
Al volver a ejecutar, me sale siempre el botón habilitado, independientemente de lo que haya hecho anteriormente... Estoy haciendo algo mal?
Volver arriba
Mensaje    Asunto: Responder citando

He estado probando y también he tenido una serie de problemas extraños, los he solucionado utilizando los valores en variables globales al formulario:
//boton2 y boton4 son las variables globales al formulario de tipo int
//----En el OnClose:
if (Button2->Enabled==true){
boton2 = 1;
}
else boton2 = 0;
if (Button4->Enabled==true){
boton4 = 1;
}
else boton4 = 0;
TIniFile *archivo = new TIniFile(ExtractFilePath(Application->ExeName)+"\\botones.ini");
archivo->WriteInteger("botones","boton2",boton2);
archivo->WriteInteger("botones","boton4",boton4);
delete archivo;

//-------y en el OnCreate:
TIniFile *archivo = new TIniFile(ExtractFilePath(Application->ExeName)+"\\botones.ini");
boton2 = archivo->ReadInteger("botones","boton2",1);
boton4 = archivo->ReadInteger("botones","boton4",1);
if (boton4==0){
Button4->Enabled = false;
}
else {
Button4->Enabled = true;
}
if (boton2==0){
Button2->Enabled = false;
}
else {
Button2->Enabled = true;
}
delete archivo;
//----de esta forma a mi si me funciona con BCB6, si quieres y me dejas tu e-mail te mando el proyecto en un Zip. Saludos.
_________________
¡ADELANTE CON ESTE SUPER FORO!
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Puse mal una línea de código:

Leer configuración
Código:

TIniFile *Conf=new TIniFile("c:\\archivo.ini");
Button1->Enabled=Conf->ReadBool("Botones", "Boton C",true); <--- ESTA ERA LA LÍNEA INCORRECTA
delete Conf;


Ahora ya si que está bien,
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ya me funciona el código de Marky, muchísimas gracias Very Happy
Si en lugar de hacerlo en un formulario, lo hiciese en un frame (que es en realidad donde lo tengo que hacer), me funcionaría poniendo el código en los eventos OnEnter y OnExit del marco? Como los frames no tienen el OnCreate y OnClose....
Muchas gracias a todos y un saludo.
Volver arriba
Mensaje    Asunto: Responder citando

Pues yo supongo que en principio debería funcionar sin problemas. Pruébalo y ya nos comentas que tal ha ido todo.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Trabajo con builder 3 y lanza este error:
[C++Error] Unit1.cpp(95): Undefined symbol 'TIniFile'.
Volver arriba
Mensaje    Asunto: Responder citando

Bueno, a mi me funciona si hago un include de inifiles.hpp
(Primera pregunta que resuelvo en el foro!!!!. Todo sea que ahora esté mal...)
Todavia no he probado lo de evento onenter y onexit de los marcos. Ya os comentaré.
Saludos
Volver arriba
Mensaje    Asunto: Responder citando

Hola a tod@s
Solo era para comentaros que sí, que en el evento OnEnter y OnExit de los marcos funciona también el código que me pasasteis (al menos eso me comentó la persona que lo probó...)
Muchisimas gracias por vuestra ayuda de nuevo.
Un saludo
Volver arriba
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.