Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-05-2015
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 14
pacopenin Va por buen camino
Componente que se oculte al hacer click fuera de él.

Buenas tardes.

Llevo buscando desde hace algún tiempo un componente o código, que permita que un TPanel (o similar) se oculte al hacer click fuera de él. Cuando digo fuera me refiero a que puedo hacer click en cualquier parte de la aplicación, así que no se sobre que componente lo haré. No he encontrado nada que me resulte efectivo 100%.

Espero vuestros consejos y gracias de antemano.
__________________
http://www.gestionportable.com
Responder Con Cita
  #2  
Antiguo 14-05-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pero eso te corresponde a ti decidirlo, puedes crear un procedimiento al que asignes como evento onlick a todos los componentes, incluido el formulario, menos al panel.
Responder Con Cita
  #3  
Antiguo 14-05-2015
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 14
pacopenin Va por buen camino
Gracias por la idea Casimiro, pero necesito una solución global. No se lo que puede haber fuera del panel. Ese panel puede aparecer en cualquier momento y necesito que se oculte al hacer click en cualquier punto de la pantalla fuera de él. Debería funcionar como un popup menú.
__________________
http://www.gestionportable.com
Responder Con Cita
  #4  
Antiguo 14-05-2015
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.057
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Ah, vale, entonces ese panel lo abres sobre otro transparente que ocupe por completo la pantalla, así, pulses donde pulses, estarás haciéndolo sobre ese otro panel transparente.
Responder Con Cita
  #5  
Antiguo 14-05-2015
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.293
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Sólo se me ocurre que utilices un Edit (por ejemplo) dentro del panel y aproveches el evento OnExit del Edit para ocultar el panel.
Das pocos detalles más, de la aplicación, de lo que habrá en el TPanel, de cuando y cómo lo vas a visualizar,... así que no se si esto cuadra con lo que necesitas...

Este ejemplo ilustra lo que quiero decir

Es la solución que se me ocurre para que no tengas que tocar nada el resto de componentes del form ni de la aplicación.
Lo único es que al visualizar el panel, debes pasar el foco al Edit.
Revisa el código del ejemplo.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #6  
Antiguo 14-05-2015
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 pacopenin.

Otra opción es :

Formulario en que se encuentra el Panel,
Código Delphi [-]
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TPanel = class(ExtCtrls.TPanel)
  private
    FInPanel: Boolean;
    procedure MouseEnter(var Msg: TMessage); message CM_MOUSEENTER;
    procedure MouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  public
    property InPanel: Boolean read FInPanel write FInPanel;
  end;

  TForm2 = class(TForm)
    Panel1: TPanel;
    procedure FormDestroy(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    procedure MouseLeave(var Msg: TMessage); message CM_MOUSELEAVE;
  public
  end;

var
  Form2: TForm2;

implementation {$R *.dfm}

procedure TPanel.MouseEnter(var Msg: TMessage);
begin
  FInPanel := True;
end;

procedure TPanel.MouseLeave(var Msg: TMessage);
begin
  FInPanel := False;
end;

procedure TForm2.MouseLeave(var Msg: TMessage);
begin
  Panel1.InPanel := False;
end;

procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
  Form2 := nil;
end;

end.

Formulario principal,
Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    procedure MouseEvent(var Msg: tagMsg; var Handled: Boolean);
  public
  end;

var
  Form1: TForm1;

implementation  {$R *.dfm}

uses ExtCtrls, Unit2, Unit3;

procedure TForm1.MouseEvent(var Msg: tagMsg; var Handled: Boolean);
begin
  if (Msg.message = WM_LBUTTONDOWN) then
    if Assigned(Form2) then
      Form2.Panel1.Visible := Form2.Panel1.InPanel;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := MouseEvent;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form3.Show; {otro formulario para la prueba }
  if not Assigned(Form2) then
    Form2:= TForm2.Create(Self);
  Form2.Show;
end;

end.
Me apego a lo que solicitas en tu mensaje "hacer click en cualquier parte de la aplicación". En el ejemplo, el panel será visible nuevamente cuando se destruya y cree el formulario que lo contiene.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #7  
Antiguo 14-05-2015
Avatar de pacopenin
pacopenin pacopenin is offline
Miembro
 
Registrado: sep 2010
Ubicación: Asturias
Posts: 382
Poder: 14
pacopenin Va por buen camino
Gracias a los dos por las ideas aportadas.
La verdad es que en Lazarus hay unos componentes llamados Luicontrols (LuiPack) que tienen uno llamado dropdownmanager que hace exactamente eso con cualquier elemento visual y funciona muy bien. Desgraciadamente mis conocimientos no dan para adaptarlo a Delphi, a pesar de ser poco código. https://code.google.com/p/luipack/so...ownmanager.pas
Imagino que tiene que haber forma de interceptar de algún modo el evento click a nivel global y saber si está (por coordenadas) dentro o fuera del panel.
A ver si me explico. La aplicación genera unos mensajes (alertas) que aparecen en pantalla dentro de un panel. Dicho panel tiene un botón de cerrar, pero me han pedido que funcione como el previsualizador de imagenes de las webs, que al dar click fuera de ellas se cierran.
El concepto es bastante sencillo, pero no acierto a dar con algo que funcione como deseo.
Probaré lo que comentais.
__________________
http://www.gestionportable.com
Responder Con Cita
Respuesta



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
llamar formulario al hacer click en un tabSheet del componente PageControl novato_erick OOP 9 06-09-2012 21:55:09
Como hacer que mi aplicacion oculte otra mefixxto API de Windows 1 27-10-2010 17:39:10
Como hacer conexion con sql server fuera de la ciudad. uper MS SQL Server 1 06-12-2007 21:19:40
Hacer una pausa fuera del evento OnTimer y sin usar Sleep DarkByte Varios 9 28-06-2007 04:08:00
Hacer invisible un grid al pulsar fuera apicito OOP 2 27-06-2003 13:38:53


La franja horaria es GMT +2. Ahora son las 02:21:18.


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