12. februar 2007 - 14:23Der 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.
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.
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;
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 :
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
Synes godt om
Ny brugerNybegynder
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.