Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Funcion/Procedure para cambiar propiedades de varios Panels (https://www.clubdelphi.com/foros/showthread.php?t=93438)

Tecnofacil 27-09-2018 20:30:20

Funcion/Procedure para cambiar propiedades de varios Panels
 
Buenas colegas. Anduve indagando y no logre dar con lo que pretendo. Tengo varios Paneles en un form que van cambiando de color al medida que pasa el mouse, (como si fueran botones). El problema es que debo programar los cambios de color para cada panel, asumo que debe haber una manera de crear una función que haga eso pasandole como parámetro el nombre del panel pero no encontré la manera.

Tecnofacil 27-09-2018 20:38:10

En realidad lo que hago es una barra de botón mas elegantes que los clásicos de Delhpi. Si conocen alguna VCL para Community que tenga botones mas elegantes

Caminante 27-09-2018 21:36:29

Hola


Cita:

Empezado por Tecnofacil (Mensaje 528651)
El problema es que debo programar los cambios de color para cada panel, asumo que debe haber una manera de crear una función que haga eso pasandole como parámetro el nombre del panel pero no encontré la manera.


Puedes asignar el mismo contolador de evento a todos los paneler del form. Luego para identificar el panel que desencadeno el evento tenes el parametro sender.
Podrias hacer:
Código Delphi [-]

procedure TFrmArticulos.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
   if sender is panel1 then
     tpanel(sender).Color:=clSkyBlue;
end;


Espero sea util


Saludos

ecfisa 27-09-2018 22:00:47

Hola.

Una opción sería controlar el nombre del panel en el evento asignado a los paneles cuando el cursor ingresa al control y cuando lo abandona.

En este momento sólo tengo a mano Delphi 7 por lo que debo interponer la clase y resulta algo similar a:
Código Delphi [-]
...
type
  TPanel = class(ExtCtrls.TPanel)
  private
    FMouseEnter: TNotifyEvent;
    FMouseLeave: TNotifyEvent;
    procedure CMMouseEnter(var M: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var M: TMessage); message CM_MOUSELEAVE;
  public
    property OnMouseEnter: TNotifyEvent read FMouseEnter write FMouseEnter;
    property OnMouseLeave: TNotifyEvent read FMouseLeave write FMouseLeave;
  end;

  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

...
implementation

procedure TPanel.CMMouseEnter(var M: TMessage);
begin
  if Self.Name = 'Panel1' then
    Color := clLime
  else if Self.Name = 'Panel2' then
    Color := clYellow
  else if Self.Name = 'Panel3' then
    Color := clRed
  else if Self.Name = 'Panel4' then
    Color := clPurple
  else if Self.Name = 'Panel5' then
    Color := clBlue
  else
    Color := clAqua;
end;

procedure TPanel.CMMouseLeave(var M: TMessage);
begin
  Color := clBtnFace;
end;

Resultando:


Pero, dado que estas usando la última versión de Delphi, ya dispones de los eventos OnMouseEnter y OnMouseLeave. En ellos podes acceder al control actual vía el parámetro Sender de tipo TObject:
Código Delphi [-]
...
var
  pnl: TPanel;
begin
  pnl := TPanel(Sender);
  
  if pnl.Name = 'Panel1' then
    ....

Saludos :)

Tecnofacil 27-09-2018 22:57:57

Gracias a todos.
Efectivamente estuve haciéndolo en el evento onmouseMove/Leave respectivamente, pero uno por uno,
Código Delphi [-]
procedure TF_principal.btn_abmAMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  btn_abmA.Color := clgray; //Oscurece un poco el botón
end;
procedure TF_principal.btn_abmAMouseLeave(Sender: TObject);
begin
  btn_abmA.Color:= clBtnFace; //Vuelve al color original
end;

De hecho me ocurrió algo extraño, una vez que se hace clic sobre ese panel no vuelve mas a su color original, se queda gris oscuro hasta que se cierra la aplicación pero el evento MouseLeave si se dispara.

Tecnofacil 27-09-2018 23:39:52

Aqui les dejo un video que explica mejor lo que sucede

ecfisa 28-09-2018 02:04:43

Hola.

Hice nuevamente una prueba ya sobre Delphi Tokyo y no me sucede la persistencia del color luego del click (es decir que vuelve a su color original):
Código Delphi [-]
...
type
  TForm1 = class(TForm)
    Panel1: TPanel;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Panel5: TPanel;
    Panel6: TPanel;
    procedure FormCreate(Sender: TObject);
    procedure MouseEnter(Sender: TObject);
    procedure MouseLeave(Sender: TObject);
    procedure PanelClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation   {$R *.dfm}

(* Todas las asignaciones realizadas en OnCreate,
   se pueden hacer en tiempo de diseño desde el Object Inspector *)
procedure TForm1.FormCreate(Sender: TObject);
var
  i : Integer;
  C : TComponent;
begin
  for i := 0 to ComponentCount-1 do
  begin
    C := Self.Components[i];
    if C is TPanel then
    begin
      Tpanel(C).ParentBackground := False;
      TPanel(C).ParentColor  := False;
      TPanel(C).OnMouseEnter := MouseEnter;
      TPanel(C).OnMouseLeave := MouseLeave;
      TPanel(C).OnClick      := PanelClick;
    end;
  end;
end;

// Asignado al evento OnMouseEnter de todos los TPanels
procedure TForm1.MouseEnter(Sender: TObject);
var
  pnl: TPanel;
begin
  pnl := TPanel(Sender);
  Caption := pnl.Name;
  if pnl.Name = 'Panel1' then
    pnl.Color := clLime
  else if pnl.Name = 'Panel2' then
    pnl.Color := clYellow
  else if pnl.Name = 'Panel3' then
    pnl.Color := clRed
  else if pnl.Name = 'Panel4' then
    pnl.Color := clPurple
  else if  pnl.Name = 'Panel5' then
    pnl.Color := clBlue
  else       
    pnl.Color := clAqua;
end;

// Asignado al evento OnMouseLeave de todos los TPanels
procedure TForm1.MouseLeave(Sender: TObject);
var
  pnl: TPanel;
begin
  pnl := TPanel(Sender);
  pnl.Color := clBtnFace;
  pnl.Caption := pnl.Name;
end;

procedure TForm1.PanelClick(Sender: TObject);
var
  pnl: TPanel;
begin
  pnl := TPanel(Sender);
  pnl.Caption := 'Se hizo click sobre ' + pnl.Name;
end;

end.

Resultado:


Saludos :)

Tecnofacil 01-10-2018 14:03:47

Gracias a todos. El error de colorear paneles se resolvió borrando el panel en cuestión y creándolo de nuevo, ahora si funciona.


La franja horaria es GMT +2. Ahora son las 16:19:42.

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