PDA

Ver la Versión Completa : Cambiar Color a Panel


rotsen26
30-01-2013, 01:50:21
Buenas tardes amigos, soy nuevo en este foro y en Delphi 2007, mi problema es el siguiente:

Me encargaron hacer un pequeño sistema para un hotel, tengo todo los cuartos visualizados en paneles y toda su programacion pare hacer la reservacion y todo lo que ocupa. Cuando se hace la reservacion cambia el color del panel para visualizar directamente que ya tiene reservacion ese cuarto, el problema es cuando se sale del sistema y entra de nuevo el cuarto que tenia hecha la reservacion aparece nuevamente como si no tiene ninguna reservacion... De antemano les agradesco a quien me pueda ayudar!!!

Caral
30-01-2013, 02:31:25
Hola
Hay muchas formas de hacer lo que necesitas.
1- me imagino que usas una base de datos para guardar la reservacion, si es asi, simplemente crea un campo para ese fin y dependiendo de su estado cambie el color o no.
2- puedes usar un archivo INI y guardar ese dato.
saludos

Neftali [Germán.Estévez]
30-01-2013, 14:04:25
Se trata de que los componentes, cuando vuelves a abrir el programa están como los diseñaste, no como los dejaste la última ejecución.
Lo que debes hacer, al abrir el programa, es volver a refrescar todos los paneles (al estado correcto) según los datos que tengas de las reservas.
Como dice Caral, lo normal es que esos datos los tengas en la Base de Datos.

ElDioni
30-01-2013, 17:02:28
Hola, sin tener que usar bases de datos, una forma sencilla sería guardarlo en un txt, podrías poner un objeto memo con visible=false y utilizarlo para cargar y guardar el archivo txt de la siguiente forma.


procedure.TForm1.FormCreate(Sender: TObject);
begin
Memo1.Lines.LoadFromFile('c:\Reservas.txt');
end;
Procedure.TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Memo1.Lines.SaveToFile('c:\Reservas.txt');
end;


Faltaría, claro está, un paso intermedio antes de guardar el archivo con los datos contenidos en el memo, que sería introducir en el memo el estado de cada panel, "ocupado/libre" para luego poder rescatar ese estado al abrir el programa.

Saludos.

egostar
30-01-2013, 19:04:29
Buenas tardes amigos, soy nuevo en este foro y en Delphi 2007, mi problema es el siguiente:

Me encargaron hacer un pequeño sistema para un hotel, tengo todo los cuartos visualizados en paneles y toda su programacion pare hacer la reservacion y todo lo que ocupa. Cuando se hace la reservacion cambia el color del panel para visualizar directamente que ya tiene reservacion ese cuarto, el problema es cuando se sale del sistema y entra de nuevo el cuarto que tenia hecha la reservacion aparece nuevamente como si no tiene ninguna reservacion... De antemano les agradesco a quien me pueda ayudar!!!

Pues yo hago lo que Caral comenta, tengo una tabla de estado de habitaciones y con eso defino que es lo que tiene la habitación, no sólo si está en reserva.

Te muestro una imagen (que data de 2007) pero que muestra exactamente lo que quieres aunque yo lo hago con un TStringGrid y con imagenes incrustadas dependiendo de los servicios que tiene asignados.

http://img116.imageshack.us/img116/9769/recepcionpt7.png

Saludos

rotsen26
31-01-2013, 02:05:03
egostar tienes algo parecido a lo que necesito... la cuestiones que yo los agarro con panel, segun el estado de la habitacion es el color que debe de tener el panel... si la habitacion esta ocupada debe tener color rojo y desocupada color verde... solo que no se como poner ese estado al abrir la ventana donde se encuentra los paneles...

egostar
31-01-2013, 05:22:57
egostar tienes algo parecido a lo que necesito... la cuestiones que yo los agarro con panel, segun el estado de la habitacion es el color que debe de tener el panel... si la habitacion esta ocupada debe tener color rojo y desocupada color verde... solo que no se como poner ese estado al abrir la ventana donde se encuentra los paneles...

Pues yo lo que haría es tener una tabla donde almaceno el estado de la habitación y en base al estado "pintar" el panel.

Por ejemplo algo así:


TQuery.SQL.Text := 'SELECT HABITACION, ESTADO FROM EDO_HABITACIONES';
TQuery.Open;
while not TQuery.EoF do
begin
case TQuery.FieldsByName('ESTADO').AsInteger of
0: begin //LIBRE
PanelX.Color := clGreen;
end;
1: begin //OCUPADA
PanelX.Color := clRed;
end;
end;
TQuery.Next;
end;
TQuery.Close;


Aquí lo único es asignar el panel correspondiente dependiendo de la habitación.

Saludos

rotsen26
31-01-2013, 17:36:59
Pues yo lo que haría es tener una tabla donde almaceno el estado de la habitación y en base al estado "pintar" el panel.

Por ejemplo algo así:


TQuery.SQL.Text := 'SELECT HABITACION, ESTADO FROM EDO_HABITACIONES';
TQuery.Open;
while not TQuery.EoF do
begin
case TQuery.FieldsByName('ESTADO').AsInteger of
0: begin //LIBRE
PanelX.Color := clGreen;
end;
1: begin //OCUPADA
PanelX.Color := clRed;
end;
end;
TQuery.Next;
end;
TQuery.Close;


Aquí lo único es asignar el panel correspondiente dependiendo de la habitación.

Saludos


Aqui te muestro el codigo que estoy poniendo para mandar llamar los datos de la base de datos...


procedure Tfrm_capt_mapa.DataSource1DataChange(Sender: TObject; Field: TField);
begin
//Habitacion 1
if (DataSource1.DataSet.FieldByName('estatus').AsString) = 'RES' then
Panel1.Color :=clRed
else
Panel1.Color :=clGreen;
end;


Pero no me está funcionando!!!

egostar
31-01-2013, 18:04:44
Bueno, me parece que el problema es mas de concepto que de otra cosa, estás intentando que cambie el color del panel cuando haya un cambio en el registro, pero yo lo haría en el evento OnShow de la forma para que se "actualice" cuando se muestra la pantalla, y claro, dejaría el proceso que tienes para que se ejecute cuando se registre otra reservación.

Saludos

rotsen26
31-01-2013, 20:21:26
Bueno, me parece que el problema es mas de concepto que de otra cosa, estás intentando que cambie el color del panel cuando haya un cambio en el registro, pero yo lo haría en el evento OnShow de la forma para que se "actualice" cuando se muestra la pantalla, y claro, dejaría el proceso que tienes para que se ejecute cuando se registre otra reservación.

Saludos

Ya lo he puesto en el evento OnShow pero sigue sin mostrar el resultado...

ecfisa
04-02-2013, 06:02:04
Hola rotsen26.

Otra opción puede ser usar el evento OnDataChange del TDataSource:

procedure TForm1.FormCreate(Sender: TObject);
begin
DBGrid1.DataSource.OnDataChange:= DataChange;
DBGrid1.DataSource.DataSet.Open;
end;

procedure TForm1.DataChange(Sender: TObject; Field: TField);
begin
if DBGrid1.DataSource.DataSet.FieldByName('estatus').AsString = 'RES' then
Panel1.Color:= clRed
else
Panel1.Color:= clGreen;
end;


//...

procedure TForm1.FormDestroy(Sender: TObject);
begin
DBGrid1.DataSource.OnDataChange:= nil;
end;

Asigno el evento por código para darle mayor claridad al ejemplo. Pero lo podés hacer desde el Object Inspector, en tiempo de diseño, diréctamente desde la pestaña Events del componente TDataSource relacionado al DBGrid.

Saludos.

jpgonzalez
12-02-2013, 01:30:47
Se trata de que los componentes, cuando vuelves a abrir el programa están como los diseñaste, no como los dejaste la última ejecución.
Lo que debes hacer, al abrir el programa, es volver a refrescar todos los paneles (al estado correcto) según los datos que tengas de las reservas.
Como dice Caral, lo normal es que esos datos los tengas en la Base de Datos.

Como dice Neftali, lo ideal es que al abrir la pantalla que muestra las habitaciones hagas un refresh de las mismas...

Parecido a esto, tengo un sistema de combis que llevan pasajeros entre 2 ciudades, y los asientos pueden estar libres, reservados o vendidos.
En la pantalla que muestro los asientos tengo un procedimiento que "revisa" los asientos en la base de datos para pintarlos del color correspondiente.
Cuando abro la ventana llamo a este procedimiento para mostrarlos... y cuando reservo o vendo un pasaje, primero inserto la operacion correspondiente en la base de datos y luego vuelvo a llamar a ese procedimiento para que me vuelva a actualizar la pantalla.
Espero te sirva, abrazo!

Neftali [Germán.Estévez]
12-02-2013, 09:30:34
...
En la pantalla que muestro los asientos tengo un procedimiento que "revisa" los asientos en la base de datos para pintarlos del color correspondiente.
Cuando abro la ventana llamo a este procedimiento para mostrarlos... y cuando reservo o vendo un pasaje, primero inserto la operacion correspondiente en la base de datos y luego vuelvo a llamar a ese procedimiento para que me vuelva a actualizar la pantalla.


Exactamente a eso me refería. ;)

rotsen26
13-02-2013, 17:43:19
Como dice Neftali, lo ideal es que al abrir la pantalla que muestra las habitaciones hagas un refresh de las mismas...

Parecido a esto, tengo un sistema de combis que llevan pasajeros entre 2 ciudades, y los asientos pueden estar libres, reservados o vendidos.
En la pantalla que muestro los asientos tengo un procedimiento que "revisa" los asientos en la base de datos para pintarlos del color correspondiente.
Cuando abro la ventana llamo a este procedimiento para mostrarlos... y cuando reservo o vendo un pasaje, primero inserto la operacion correspondiente en la base de datos y luego vuelvo a llamar a ese procedimiento para que me vuelva a actualizar la pantalla.
Espero te sirva, abrazo!


Bueno, perdón por preguntar tanto... Pero como puedo hacerlo, tengo una tabla llamada Checin, en donde tengo el campo llamado estatus, y en se guardan los estados Reservado=RES, Check=OCU y Desocupado=DES, pero no se como llamarlos para que cuando esten según el estado se pongan los páneles en el color correspondiente, RES=Amarillo, OCU=Rojo y Des=Verde... Se le agradece la ayuda!!!

Neftali [Germán.Estévez]
13-02-2013, 18:10:29
Es de suponer que cada panel que tienes en pantalla corresponderá con uno de los registros que tienes en la tabla. El panel se llamará de alguna forma concreta y en la propiedad TAG habrás puesto algo (entero) que permita "identificarlo" y hacerlo "cuadrar" con uno de los registros de la tabla.

¿Es así? ¿Me explico? ¿Puedes explicar cómo lo has hecho?

Si es así, basta con que hagas un recorrido por la tabla y para cada registro, identifiques el panel que le corresponde y según el valor le asignes el color.

Para ser más concreto debes:
1) Poner las estructura de la tabla (para que veamos los campos)
2) Decirnos cómo llamas o identificas los paneles para que "cuadren" con los registros de la tabla.


P.D: Si la respuesta a la pregunta es que NO (es decir, que no tienes forma de identificar los paneles con los registros de la tabla), esto es lo primero que hay que hacer.

ecfisa
13-02-2013, 18:40:32
Hola rotsen26.

A diferencia de los compañeros, yo había interpretado mal lo que estabas buscando, pensé que mostrabas una habitacion por vez.

Si son mostradas todas, podrías usar un procedimiento para actualizar los estados y llamarlo cuando sea necesario:

procedure TForm1.ActualizarPaneles(Grid: TDBGrid);
var
i: Integer;
tc: TColor;
BM: Pointer;
begin
i:= 1;
BM := DBGrid1.DataSource.DataSet.GetBookmark;
Grid.DataSource.DataSet.DisableControls;
Grid.DataSource.DataSet.First;
try
while not Grid.DataSource.DataSet.Eof do
begin
case Grid.DataSource.DataSet.FieldByName('ESTADO').AsString[1] of
'D': tc:= clGreen; // (D)esocupado
'O': tc:= clRed; // (O)cupado
'R': tc:= clYellow; // (R)eservado
end;
TPanel(FindComponent('Panel'+IntToStr(i))).Color := tc;
Grid.DataSource.DataSet.Next;
Inc(i)
end;
finally
Grid.DataSource.DataSet.GotoBookmark(BM);
Grid.DataSource.DataSet.FreeBookmark(BM);
Grid.DataSource.DataSet.EnableControls
end
end;


Un ejemplo de llamada:

procedure TForm1.FormShow(Sender: TObject);
begin
// (Tu DataSet debería estar abierto en este punto) tu_DataSet.Open;
ActualizarPaneles(DBGrid1);
end;

Otro:

procedure TForm1.Button1Click(Sender: TObject);
begin
ActualizarPaneles(DBGrid1);
end;

Para simplificar, en el procedimiento ActualizarPaneles, asumo que los paneles se llaman: Panel1, Panel2, Panel3, ... (*)

Saludos.

(*) Edito, me falto agregar: y el órden de los Paneles se corresponde al órden de las habitaciones en la tabla

rotsen26
14-02-2013, 20:18:57
Buenas tardes amigos, les comento que ya solucioné el problema del cambio de colores en los paneles... Gracias a todos los que se dieron tiempo para poder ayudar!!!