Avatar billede vint Nybegynder
12. februar 2007 - 14:23 Der er 5 kommentarer og
1 løsning

OnClick på paneler i statusbar

Hej.

Er det muligt at lave forskellige onClick hændelser for de forskellige paneler, der er oprettet på en statusbar?

Fx.

Der er oprettet en statusbar med 3 paneler.

Et simpelt eksempel blot for at illustrere:
Når der klikkes på panel1, så åbner form2.
Når der klikkes på panel2, så ændres formens caption.
Når der klikkes på panel3, så lukkes programmet.
osv.
Avatar billede a_nor Nybegynder
12. februar 2007 - 15:43 #1
du kan gemme koordinaterne i OnMouseDown og så i OnClick besteme hvilket panel du klikkede i:


procedure TForm1.StatusBar1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
GlobX:=x;
GlobY:=y;
end;

procedure TForm1.StatusBar1Click(Sender: TObject);
  var Panl:integer;
      PanW:integer;

begin
panW:=0;
label1.caption := sender.classname+  inttostr(Globx)+'  '+Inttostr(globy);
panl :=0;
repeat
  panW := Panw+ Statusbar2.Panels.Items[PanL].Width;
  inc(PanL);
  until (GlobX<PanW) or (PanL=statusbar2.Panels.Count);
//if GlobX<Panw then
  case Panl of
    1: Label2.caption :='1';
    2: Label2.caption :='2';
    3: Label2.caption :='3';
    ...
    end; // case
end;
Avatar billede a_nor Nybegynder
12. februar 2007 - 15:45 #2
Der skal selvfølgelig stå statusbar1 alle steder, Sorry
Avatar billede borrisholt Novice
12. februar 2007 - 15:47 #3
Jeg sad lige og kedede mig, så kom jeg i tanke om det var længesiden jeg havde været på eksperten, og så er her endda et sjovt spørgsmål, som jeg etenligt aldrig havde tænkt over hvordan man løste.

Men her er svaret i hvertfald :

uses
  commctrl;
{$R *.dfm}

procedure TForm1.StatusBar1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);

  function InRect(const X, Y: Integer; const ARect: TRect): Boolean;
  begin
    Result := (X >= ARect.Left) and (X <= ARect.Right) and (Y >= ARect.Top) and (Y <= ARect.Bottom);
  end;

var
  r: TRect;
  i: Integer;
begin
  for i := 0 to StatusBar1.Panels.Count - 1 do
  begin
    Statusbar1.Perform(SB_GETRECT, i, Integer(@R));
    if InRect(X, Y, R) then
      Caption := IntToStr(i);
  end;
end;


Jens B
Avatar billede borrisholt Novice
12. februar 2007 - 16:15 #4
Endelig er der også den object orienteret løsning :

1)
  Du laver en unit som ser således ud :

unit UnitJBStatusBar;

interface
uses
  Types, ComCtrls, CommCtrl;

type
  TStatusBar = class(ComCtrls.TStatusBar)
  private
    function GetPanelRect(Index: Integer): TRect;
  public
    class function InRect(const X, Y: Integer; const ARect: TRect): Boolean;
    function XYToStatusPanel(const X, Y: Integer): TStatusPanel;
    property PanelsRect[Index: Integer]: TRect read GetPanelRect;
  end;

implementation

{ TStatusBar }

function TStatusBar.GetPanelRect(Index: Integer): TRect;
begin
  Perform(SB_GETRECT, Index, Integer(@Result));
end;

class function TStatusBar.InRect(const X, Y: Integer; const ARect: TRect): Boolean;
begin
  Result := (X >= ARect.Left) and (X <= ARect.Right) and (Y >= ARect.Top) and (Y <= ARect.Bottom);
end;

function TStatusBar.XYToStatusPanel(const X, Y: Integer): TStatusPanel;
var
  i: Integer;
begin
  Result := nil;

  for i := 0 to Panels.Count - 1 do
    if InRect(X, Y, PanelsRect[i]) then
      Result := Panels[i];
end;

end.

2)
  på din form gør du som følger. Uses UnitJBStatusBar i toppen af din unit og  EFTER ComCtrls.

3)
  I din mousedown handler for din status bar skriver du som følger :

procedure TForm1.StatusBar1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  Caption := IntToStr(StatusBar1.XYToStatusPanel(X, Y).Index);
end;


En efter min smag lidt mere elegang løsning.
Jens B
Avatar billede martinlind Nybegynder
12. februar 2007 - 17:02 #5
Davs JB, how goes :) Koder du stadig Delphi ?
Avatar billede borrisholt Novice
13. februar 2007 - 09:49 #6
Dvvs Martin. Ja jeg koder stadig Delphi for IT Gruppen. Jeg har skrevet det kasse system som er i gang med at blive leveret til Super Best over hele lanndet
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester