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 21-09-2006
Novás Novás is offline
Miembro
 
Registrado: oct 2003
Ubicación: Galicia
Posts: 146
Poder: 21
Novás Va por buen camino
Click en statusbar

Hola a todos de nuevo:

Se que la pregunta que voy a hacer es un poco "chorra" pero no encuentro solución... Quisiera saber como puedo saber en que panel del statusbar se hace click en un momento determinado para que, al hacer click en un panel determinado, salte un procedimiento.

Muchas gracias de antemano
__________________
Hay dos cosas infinitas: el Universo y la estupidez humana. http://www.cybertarjetas.net
Responder Con Cita
  #2  
Antiguo 21-09-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Puede que exista un método mas sencillo, pero ahora mismo lo que se me ocurre es lo siguiente. En le evento OnMouseUp colocar esto:

Código Delphi [-]
uses CommCtrl; // Añade esto a las uses

procedure TForm1.StatusBar1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
  R: TRect;
begin
  // Buscamos panel a panel hasta encontrar cual se ha pulsado
  with (Sender as TStatusBar) do
    for i:= 0 to Panels.Count - 1 do
    begin
      // Obtenemos las dimensiones del panel
      SendMessage(Handle,SB_GETRECT,i,Integer(@R));
      // Y comprobamos si se ha hecho click dentro de el
      if PtInRect(R,Point(x,y)) then
      begin
        // El numero del panel esta en i, usalo para lo que quieras
        ShowMessage('Has pulsado el panel: ' + IntToStr(i));
        Exit;
      end;
    end;
end;
Responder Con Cita
  #3  
Antiguo 21-09-2006
Avatar de Bicho
[Bicho] Bicho is offline
Miembro Premium
 
Registrado: jul 2003
Ubicación: Inca - Mallorca
Posts: 1.776
Poder: 22
Bicho Va por buen camino
Hola, quizá no sea tan chorra la pregunta. Yo al menos no lo he conseguido.

Yo lo que uso es lo siguiente:
- Los panels tienen una anchura definida y fija.
- El evento OnMouseDown te da la posición X e Y relativa al StatusBar donde se ha hecho en click.

Yo normalmente gestiono el primer panel para ejecutar eventos, así que aquí te dejo un ejemplo como el que uso.

Código Delphi [-]
procedure TForm1.StatusBar1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if x <= StatusBar1.panels[0].Width then begin
    .... hacemos lo que queramos
  end;
end;

Si la X es mayor que la anchura del Panel 0 pues pertenece a otro panel y habría que hacer la comprobación, y no sería mucho más complicado.

Espero te sirva.

Saludos
Responder Con Cita
  #4  
Antiguo 21-09-2006
Novás Novás is offline
Miembro
 
Registrado: oct 2003
Ubicación: Galicia
Posts: 146
Poder: 21
Novás Va por buen camino
Muchas gracias a los dos, he tenido que optar por la solución de Bicho ya que la de Seone me da un error en
Código Delphi [-]
  if PtInRect(R,Point(x,y)) then

algo con la coma dentro del Point.
__________________
Hay dos cosas infinitas: el Universo y la estupidez humana. http://www.cybertarjetas.net
Responder Con Cita
  #5  
Antiguo 21-09-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por Novás
Muchas gracias a los dos, he tenido que optar por la solución de Bicho ya que la de Seone me da un error en

if PtInRect(R,Point(x,y)) then

algo con la coma dentro del Point.
¿Exactamente que error te da?. Según la definición de la función Point no debería de haber ningún problema siempre que X e Y fueran integer.

Código Delphi [-]
  function Point(AX, AY: Integer): TPoint;
Responder Con Cita
  #6  
Antiguo 28-05-2008
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
Me das una mano?

Yo tambien tengo la misma duda.... y vi el codigo de seoane, me pareció muy chevere, traté de hacer una función

Código Delphi [-]
function TFrmMain.GetStatusBarPanelClicked(StatusBar : TStatusBar; X, Y: Integer) : Integer;
var
  i: Integer;
  R: TRect;
begin
  // Buscamos panel a panel hasta encontrar cual se ha pulsado
  with StatusBar do
    for i:= 0 to Panels.Count - 1 do
    begin
      // Obtenemos las dimensiones del panel
      SendMessage(Handle,SB_GETRECT,i,Integer(@R));
      if PtInRect(R,Point(x,y)) then
      begin
        Result := i;
        Exit;
      end else Result := -1;
    end;
end;

pero al compilar me lanza este error:

[Error] FrmMainSrc.pas(281): Undeclared identifier: 'SB_GETRECT'


He añadido ComCtrls a los uses y buscando en la ayuda Windows SDK entiendo que este mensaje me devuelve el rectangulo del panel... pero hasta ahi... no se que corregir, añadir o lo que sea para compilar satisfactoriamente...

saludos...

el otro codigo (el de bicho) funciona tambien pero me da cosa cuando algo que a alguien le sale bien a mi me sale mal.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #7  
Antiguo 29-05-2008
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Prueba cambiando SB_GETRECT por WM_USER + 10

Código Delphi [-]
procedure TForm1.StatusBar1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var
  i: Integer;
  R: TRect;
begin
  // Buscamos panel a panel hasta encontrar cual se ha pulsado
  with (Sender as TStatusBar) do
    for i:= 0 to Panels.Count - 1 do
    begin
      // Obtenemos las dimensiones del panel
      SendMessage(Handle,WM_USER + 10,i,Integer(@R));
      // Y comprobamos si se ha hecho click dentro de el
      if PtInRect(R,Point(x,y)) then
      begin
        // El numero del panel esta en i, usalo para lo que quieras
        ShowMessage('Has pulsado el panel: ' + IntToStr(i));
        Exit;
      end;
    end;
end;
Responder Con Cita
  #8  
Antiguo 29-05-2008
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
O.k.... así siiii

Gracias de verdad, tu dato es muy útil...

la función entonces quedó así

Código Delphi [-]
function TForm.GetStatusBarPanelClicked(StatusBar : TStatusBar; X, Y: Integer) : Integer;
var
  i: Integer;
  R: TRect;
begin
  // Buscamos panel a panel hasta encontrar cual se ha pulsado
  with StatusBar do
    for i:= 0 to Panels.Count - 1 do
    begin
      // Obtenemos las dimensiones del panel
      SendMessage(Handle,WM_USER + 10,i,Integer(@R));
      if PtInRect(R,Point(x,y)) then
      begin
        Result := i;
        Exit;
      end else Result := -1;
    end;
end;

Y para llamarla, dentro del procedimiento así:

Código Delphi [-]
procedure TForm.StatusBarMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  case GetStatusBarPanelClicked(TSTatusBar(Sender), X, Y) of
    2 : //aquí ejecutamos algo;
  end;
end;

Lo he probado también con el MouseMove y funciona de pelos... además no importa si uso la TSTatusBar o un descendiente.

Nuevamente gracias.
__________________
Buena caza y buen remar... http://mivaler.blogspot.com
Responder Con Cita
  #9  
Antiguo 29-05-2008
Avatar de movorack
[movorack] movorack is offline
Miguel A. Valero
 
Registrado: feb 2007
Ubicación: Bogotá - Colombia
Posts: 1.346
Poder: 20
movorack Va camino a la famamovorack Va camino a la fama
ahh por cieto...

El de bicho lo había hecho así...

Código Delphi [-]
function TForm.GetStatusBarPanelClicked(StatusBar : TStatusBar; X, Y: Integer) : Integer;
var i, PanelWidthSum : integer;
begin
  PanelWidthSum := 0;
  for i := 0 to StatusBar.Panels.Count - 1 do
  begin
    if (x >= PanelWidthSum) and (x <= PanelWidthSum+StatusBar.Panels[i].Width) then
    begin
      Result := i;
      exit;
    end else
      Inc(PanelWidthSum, StatusBar.Panels[i].Width);
  end;

  Result := -1;
end;

Hago la salvedad que usando cualquiera de los dos códigos; NO tienes que agregar nada a Uses... El mismo compilador lo hace
__________________
Buena caza y buen remar... http://mivaler.blogspot.com

Última edición por movorack fecha: 29-05-2008 a las 23:44:54.
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
Statusbar con colores JULIPO Varios 4 04-06-2006 00:22:05
implmentar Articulo click..click..run Crash ASAPLTDA OOP 0 21-01-2006 16:16:08
Textos En StatusBar kman Varios 2 22-12-2005 00:06:56
Click...click. tap. RUN? Crash! Un mejor RAD mamcx Conexión con bases de datos 0 13-04-2005 20:45:35
statusbar y hints urush30 Varios 3 05-08-2004 12:43:55


La franja horaria es GMT +2. Ahora son las 19:22:49.


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