Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Cambiar Color a Panel (https://www.clubdelphi.com/foros/showthread.php?t=82121)

rotsen26 30-01-2013 01:50:21

Cambiar Color a Panel
 
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.

Código Delphi [-]
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

Cita:

Empezado por rotsen26 (Mensaje 454212)
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.



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

Cita:

Empezado por rotsen26 (Mensaje 454278)
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í:

Código Delphi [-]
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

Cita:

Empezado por egostar (Mensaje 454297)
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í:

Código Delphi [-]
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...

Código Delphi [-]
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

Cita:

Empezado por egostar (Mensaje 454333)
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:
Código Delphi [-]
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

Cita:

Empezado por Neftali (Mensaje 454233)
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

Cita:

Empezado por jpgonzalez (Mensaje 454874)
...
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 hacerlo???
 
Cita:

Empezado por jpgonzalez (Mensaje 454874)
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:
Código Delphi [-]
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:
Código Delphi [-]
procedure TForm1.FormShow(Sender: TObject);
begin
  // (Tu DataSet debería estar abierto en este punto) tu_DataSet.Open;
  ActualizarPaneles(DBGrid1);
end;
Otro:
Código Delphi [-]
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

Solucionado
 
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!!!


La franja horaria es GMT +2. Ahora son las 23:47:15.

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