Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Secuencia de colores con Labels (https://www.clubdelphi.com/foros/showthread.php?t=92516)

Milworm99 17-11-2017 04:11:02

Secuencia de colores con Labels
 
Hola gente de la comunidad clubdelphi, tengo problemas con los label

Lo que estoy haciendo es una secuencia de colores:

- En el form tengo 3 label con estos colores por defecto:

Label1 // Color Verde
Label2 // Color Amarillo
Label3 // Color Amarillo

- Lo que quiero es que al presionar la tecla flecha abajo (VK_DOWN) el color Verde del Label1 se pase al Label2 y el Label1 cambie al color a Amarillo.

Label1 // Color Amarillo
Label2 // Color Verde
Label3 // Color Amarillo

- Preciono nuevamente la misma tecla flecha abajo (VK_DOWN) por segunda ves, se pase el color Verde que esta en el Label2 al Label3 y el label2 se cambie a Amarillo.

Label1 // Color Amarillo
Label2 // Color Amarillo
Label3 // Color Verde

Lo que estoy haciendo es asi en un Timer con Intervalo 1
Código:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if (GetKeyState(VK_DOWN)<0) then
begin
if Label1.Font.Color = clLime then
begin
Label1.font.color := clYellow;
Label2.font.color := clLime;
end;
end;
begin
if (GetKeyState(VK_DOWN)<0) then
begin
if Label2.font.Color = clLime then
begin
Label2.font.color := clYellow;
Label3.font.color := clLime;
end;
end;
end;
end;
end.

Mi problema es que al presionar la tecla flecha abajo (VK_DOWN) el Label3 automaticamente se pasa a color Verde y el Label1 y Label2 a amarillo, al presionar la tecla queda asi

Label1 // Color Amarillo
Label2 // Color Amarillo
Label3 // Color Verde

El problema es que no sigue la secuencia deseada

Espero que me ayuden porfavor, gracias por adelantado :)

ElKurgan 17-11-2017 07:26:11

No entiendo porque usas un Timer... ¿Es una exigencia de la prueba?

Yo haría la captura justo en el evento de presionar la tecla de flecha abajo en el formulario (onKeyDown) y le pasaría este código:

Código Delphi [-]
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  // Cambios de color
  if (GetKeyState(VK_DOWN)<0) then
  begin
    if Label1.Font.Color = clLime then
    begin
      Label1.font.color := clYellow;
      Label2.font.color := clLime;
      Label3.font.color := clYellow;
    end
    else
    if Label2.font.Color = clLime then
    begin
      Label1.font.color := clYellow;
      Label2.font.color := clYellow;
      Label3.font.color := clLime;
    end
    else
    if Label3.font.Color = clLime then
    begin
      Label1.font.color := clLime;
      Label2.font.color := clYellow;
      Label3.font.color := clYellow;
    end
  end;
end;
Espero que te sirva

Saludos

duilioisola 17-11-2017 09:14:17

Yo lo haría de forma ligeramente diferente, para que fuera mas sencillo agregar un label nuevo.

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
// Tecla abajo
if (GetKeyState(VK_DOWN)<0) then
begin
// Si el ultimo laber no es verde muevo el color.
if Label3.Font.Color <> clLime then
begin
Label3.font.color := Label2.font.color;
Label2.font.color := Label1.font.color;
Label1.font.color := clYellow;
end
end;
end;

Casimiro Notevi 17-11-2017 10:19:42

Cita:

Empezado por duilioisola (Mensaje 522605)
..

Estos novatos, que olvidan siempre poner las etiquetas al código :p

Milworm99 17-11-2017 15:28:47

Cita:

Empezado por duilioisola (Mensaje 522605)
Yo lo haría de forma ligeramente diferente, para que fuera mas sencillo agregar un label nuevo.

Código:

procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  // Tecla abajo
  if (GetKeyState(VK_DOWN)<0) then
  begin
    // Si el ultimo laber no es verde muevo el color.
    if Label3.Font.Color <> clLime then
    begin
      Label3.font.color := Label2.font.color;
      Label2.font.color := Label1.font.color;
      Label1.font.color := clYellow;
    end
  end;
end;


Muchas Gracias duilioisola

Pero quisiera saber si se puede regresar el color en forma desendente al precionar el boton flecha arriba (VK_UP)
Ejemplo los colores de los Labels quedan asi:

Label1//Color Amarillo
Label2 //Color Amarillo
Label3 // Color Verde

Presiono boton flecha arriba

Label1//Color Amarillo
Label2 //Color Verde
Label3 // Color Amarillo

Presiono otra ves flecha arriba
Label1//Color Verde
Label2 // Color Amarillo
Label3 // Color Amarillo

Y por cada cambio de color verde en el label, me salga un mensaje Ejemplo: Label2 Color verde, tecla arriba: Color Label1 verde

Y regrese como estaba

ecfisa 17-11-2017 18:07:01

Hola.

Este ejemplo cambia la leyenda y color del Label actualmente seleccionado como pides:
Código Delphi [-]
...
implementation {$R *.dfm}

var
  vLbs: array of TLabel;
  inx : Integer = 0;

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  // buscar labels y agregarlos al arreglo
  for i := 0 to Self.ComponentCount-1 do
    if Self.Components[i] is TLabel then
    begin
      SetLength(vLbs, Length(vLbs)+1);
      vLbs[High(vLbs)] := TLabel(Components[i]);
    end;
  // leyenda y color del primer item
  TLabel(vLbs[Low(vLbs)]).Font.Color := clLime;
  TLabel(vLbs[Low(vLbs)]).Caption := TLabel(vLbs[Low(vLbs)]).Caption + ' Color verde';
  // leyenda y color de los items siguientes
  for i := Low(vLbs)+1 to High(vLbs) do
  begin
    TLabel(vLbs[i]).Font.Color := clYellow;
    TLabel(vLbs[i]).Caption := TLabel(vLbs[i]).Caption + ' Color amarillo';
  end;
  // el form recibe los eventos de teclado primero
  Self.KeyPreview := True;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  // cambiar leyenda y color del item previamente seleccionado
  TLabel(vLbs[inx]).Caption := Copy( TLabel(vLbs[inx]).Caption,1,
    Pos(' Color', TLabel(vLbs[inx]).Caption) ) + 'Color amarillo';
  TLabel(vLbs[inx]).Font.Color := clYellow;

  case Key of
    VK_DOWN: if inx < High(vLbs) then
               Inc(inx)
             else
               Inx := Low(vLbs);
    VK_UP  : if inx > Low(vLbs) then
               Dec(inx)
             else
               Inx := High(vLbs);
  end;

  // cambiar leyenda y color del item actualmente seleccionado
  TLabel(vLbs[inx]).Caption := Copy( TLabel(vLbs[inx]).Caption,1,
    Pos(' Color', TLabel(vLbs[inx]).Caption) ) + 'Color verde';
  TLabel(vLbs[inx]).Font.Color := clLime;
end;
El comportamiento es cíclico, es decir que si estas en el Label inferior y continuas presionando la tecla Down regresa al superior y viceversa con la tecla Up.

Muestra:



Saludos :)

Milworm99 17-11-2017 20:41:44

Muchas Gracias, me sirvió :D

Milworm99 18-11-2017 00:43:16

1 Archivos Adjunto(s)
Bueno gracias a todos, pero lo que quería era algo así, perdón por no especificar bien con lo que deseaba hacer, yo ya lo hise todo, pero quisiera que me ayuden a resumir el código por favor para que no quede tan largo.

Cambio de colores de los Labels con las Teclas Arriba,Abajo, Derecha y Izquierda.




La franja horaria es GMT +2. Ahora son las 21:15:04.

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