PDA

Ver la Versión Completa : Habilitar/Deshabilitar botones permanentemente


melanthea
15-06-2004, 20:03:19
Bueno ya me vais a echar del foro por pesada... Pero ya que he descubierto un lugar donde gente que sabe de Builder puede echarme un cable, tendré que aprovecharlo verdad?

En mi aplicacion tengo que deshabilitar unos botones A y B cuando el usuario pulsa uno del mismo formulario (C), y volver a habilitarlos cuando pulsa otro botón pero de un formulario distinto (D). Hasta ahí lo sé hacer, bastaría con preceder el nombre del formulario antes del nombre del botón y cambiar la propiedad enabled verdad?

El hecho es que quiero que este cambio se me mantenga una vez cerrada la aplicación. Es decir, que si los botones A y B tienen el enabled a false, que se mantenga para las sucesivas veces que se ejecuta la aplicación, y no vuelvan a tener el enabled a true hasta que pulse C, y que entonces se me mantengan así hasta que se vuelva a pulsar D. No sé si me explico con claridad...

No tengo ni idea de cómo se maneja el registro de Windows (que me comentaron que se podía hacer así), así que estaba pensando si se podría hacer con otra cosa que no fuese eso. Pensé en variables globales, pero en cuanto cierre la aplicación pierden su valor...

Si alguien puede orientarme en este tema, desde ya muchas gracias


No puedo poner

delphi.com.ar
15-06-2004, 21:08:00
De antemano te comento que no conozco C++ en profundidad, pero esto lo hice funcionar:

//---------------------------------------------------------------------------
#include <vcl.h>
#include <registry.hpp>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
const String Regkey = "\\software\\Mi Marca\\Mi Soft\\";

TRegistry *MyRegistry = new TRegistry();
try {
MyRegistry->RootKey = HKEY_LOCAL_MACHINE;
MyRegistry->OpenKey(Regkey, True);
Button1->Enabled = MyRegistry->ReadBool(Button1->Name);
}
catch(ERegistryException &E) {
ShowMessage(E.Message);
delete MyRegistry;
return;
}
delete MyRegistry;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
const String Regkey = "\\software\\Mi Marca\\Mi Soft\\";

TRegistry *MyRegistry = new TRegistry();
try {
MyRegistry->RootKey = HKEY_LOCAL_MACHINE;
MyRegistry->OpenKey(Regkey, True);
MyRegistry->WriteBool(Button1->Name, Button1->Enabled);
}
catch(ERegistryException &E) {
ShowMessage(E.Message);
delete MyRegistry;
return;
}
delete MyRegistry;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Button1->Enabled = !Button1->Enabled;
}
//---------------------------------------------------------------------------

melanthea
17-06-2004, 13:24:43
Hola:
He copiado y pegado el código que me pones, pero me lanza una excepción diciendo que no puede leer datos del botón 1 (exactamente no me acuerdo del mensaje, es que no estoy en casa ahora mismo...)
Lo intentaré de nuevo, pero bueno, si alguien sabe por qué me puede ocurrir esta excepción, que me lo comente por favor.
Un saludo

delphi.com.ar
17-06-2004, 15:25:21
Lo va a lanzar la primera ejecución, yo te recomendaría que preguntes si existe la clave o el valor a buscar, y si existe leer el valor.

PD: ¿Buscaste algún componente tipo el TFormStorage de las RxLibs para automatizar esto y no escribir código para cada form.?

melanthea
17-06-2004, 20:48:49
Yo es que soy una novata en esto del Builder, así que ese componente que me comentas pues ni idea... Pero bueno, sólo tego qe hacerlo para una Form, así que supongo que en cuanto logre que me funcione, ya tendré el problema resuelto...
De todas maneras, si no lo consigo, probablemente acuda a vosotros otra vez ;)
Muchísimas gracias por tu tiempo.
Un saludo

melanthea
17-06-2004, 23:22:30
Hola!

He intentado hacerlo con un archivo ini de la siguiente manera:

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");
corresponda
Conf->ReadBool("Botones", "Boton C",true);
delete Conf;

El caso es que el archivo ini me lo crea bien, con los valores correctos, pero a la hora de ejecutar la aplicación, el botón siempre me aparece habilitado, independientemente de lo que indique el archivo ini...

Yo lo que hago es compilar, y una vez que tengo la aplicación, le doy a un botón para que se me deshabilite el botón 1. Luego cierro, y vuelvo a ejecutar la aplicación, (sin compilar de nuevo), y me sale el botón 1 habilitado siempre...

Qué estoy haciendo mal???
Un saludo

delphi.com.ar
17-06-2004, 23:29:54
¿En qué eventos estas poniendo este código?

jachguate
18-06-2004, 03:54:54
Y no haria falta asignar el valor leido a la propiedad:


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


También te recomiendo aprender a utilizar la etiqueta [ code ] para publicar trozos de código.

Hasta luego.

;)

melanthea
18-06-2004, 12:25:39
Claro!
Ahí estaba el fallo... Qué tonta!
Ya me funciona perfectamente, poniendo el código anterior en los eventos OnCreate y OnClose de la form... Pero si tengo que hacerlo dentro de un marco (frame), me serviría ponerlo en los eventos OnEnter y OnExit?
Muchas gracias por vuestra ayuda y perdón por no poner en el otro mensaje el código entre las etiquetas.
Un saludo

delphi.com.ar
18-06-2004, 15:36:31
...me serviría ponerlo en los eventos OnEnter y OnExit?
Todo depende de lo que quieras hacer, no creo que sea lo correcto para lo que has enunciado anteriormente. Los frames no tienen evento OnCreate y OnDestroy, pero si puedes sobreescribir los constructores y destructores para agregar esta funcionalidad.
PD: Te recomiendo leer la ayuda para ver la funcionalidad de cada evento.

Saludos!