 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
invitado Invitado
|
Publicado: Mar 15 Jun, 2004 7:14 pm Asunto: Habilitar/deshabilitar botones permanentemente |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Mar 15 Jun, 2004 10:00 pm Asunto: |
|
|
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 |
|
 |
Marky Master

Registrado: 28 Dic 2002Mensajes: 251Ubicación: Las Rozas - Madrid (España)
|
Publicado: Mar 15 Jun, 2004 10:14 pm Asunto: |
|
|
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 |
|
 |
rayder Master

Registrado: 03 Mar 2004Mensajes: 207
|
Publicado: Mie 16 Jun, 2004 8:26 am Asunto: |
|
|
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 |
|
 |
Invitado Invitado
|
Publicado: Jue 17 Jun, 2004 10:14 pm Asunto: |
|
|
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 |
|
 |
Tugui Master


Registrado: 09 Nov 2002Mensajes: 663
|
Publicado: Vie 18 Jun, 2004 8:25 am Asunto: |
|
|
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 |
|
 |
Marky Master

Registrado: 28 Dic 2002Mensajes: 251Ubicación: Las Rozas - Madrid (España)
|
Publicado: Vie 18 Jun, 2004 8:58 am Asunto: |
|
|
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 |
|
 |
invitado Invitado
|
Publicado: Vie 18 Jun, 2004 11:29 am Asunto: |
|
|
Ya me funciona el código de Marky, muchísimas gracias
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 |
|
 |
Marky Master

Registrado: 28 Dic 2002Mensajes: 251Ubicación: Las Rozas - Madrid (España)
|
Publicado: Vie 18 Jun, 2004 12:50 pm Asunto: |
|
|
| Pues yo supongo que en principio debería funcionar sin problemas. Pruébalo y ya nos comentas que tal ha ido todo. |
|
| Volver arriba |
|
 |
invitado Invitado
|
Publicado: Vie 18 Jun, 2004 1:29 pm Asunto: |
|
|
Trabajo con builder 3 y lanza este error:
[C++Error] Unit1.cpp(95): Undefined symbol 'TIniFile'. |
|
| Volver arriba |
|
 |
Invitado Invitado
|
Publicado: Vie 18 Jun, 2004 5:11 pm Asunto: |
|
|
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 |
|
 |
Invitado Invitado
|
Publicado: Dom 20 Jun, 2004 11:36 am Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|