Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 27-09-2018
Tecnofacil Tecnofacil is offline
Miembro
 
Registrado: jun 2015
Posts: 50
Poder: 9
Tecnofacil Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 27-09-2018
Tecnofacil Tecnofacil is offline
Miembro
 
Registrado: jun 2015
Posts: 50
Poder: 9
Tecnofacil Va por buen camino
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
Responder Con Cita
  #3  
Antiguo 27-09-2018
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 14
Caminante Va camino a la fama
Hola


Cita:
Empezado por Tecnofacil Ver Mensaje
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
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #4  
Antiguo 27-09-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 27-09-2018
Tecnofacil Tecnofacil is offline
Miembro
 
Registrado: jun 2015
Posts: 50
Poder: 9
Tecnofacil Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 28-09-2018
Tecnofacil Tecnofacil is offline
Miembro
 
Registrado: jun 2015
Posts: 50
Poder: 9
Tecnofacil Va por buen camino
Aqui les dejo un video que explica mejor lo que sucede
Responder Con Cita
  #7  
Antiguo 28-09-2018
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
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
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 01-10-2018
Tecnofacil Tecnofacil is offline
Miembro
 
Registrado: jun 2015
Posts: 50
Poder: 9
Tecnofacil Va por buen camino
Gracias a todos. El error de colorear paneles se resolvió borrando el panel en cuestión y creándolo de nuevo, ahora si funciona.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Funcion o procedure para apagar sub carpetas Paulao Varios 4 20-07-2011 18:15:26
Funcion cambiar propiedades componente(variable) Dclase Varios 7 17-06-2011 14:37:48
Como crear varios panels Lupita Varios 2 17-07-2008 10:27:02
Funcion generica para crear varios forms Carlos Arevalo Varios 9 06-05-2008 19:04:08
Como hacer para que una funcion regrese varios valores jangel_ramirezm Varios 11 07-03-2008 23:14:49


La franja horaria es GMT +2. Ahora son las 17:07:41.


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
Copyright 1996-2007 Club Delphi