29. juni 2004 - 16:18Der er
4 kommentarer og 1 løsning
Events på form ved focus/kill focus
Jeg har lavet mit eget design på en form, kun som alm. kode indtil vidre. Jeg vil gerne kunne vise at formen har focus/ikke har focus. Jeg prøvede med wm_setfocus og wm_killfocus. Det virker bare kun så længe at der ikke er en komponent på formen der tager focus, fx en knap, så vil den åbenbart få messagene. Prøv selv at fjerne knappen så virker det. Hvordan fanger man så de to (måske nogle andre) messages?
Her er koden (ramme/flyt/resize virker fint).
formstyle sættes til fsNone
TForm1 = class(TForm) Bevel1: TBevel; //adskiller caption område og "client" - er top streg top=15 height=9, left=0, width=hele form, men det er jo ikke vigtigt
Label1: TLabel; //"caption" i caption område Image1: TImage; //"icon" i caption område Button1: TButton; //test og den giver problemmer!! private procedure WMNCHitTest( var Msg : TWMNCHitTest ); message wm_NCHitTest; procedure WMsetfocus(var msg: TWMSetFocus); message wm_setfocus; procedure WMkillFocus(var msg: TWMkillFocus); message wm_killfocus; public procedure CreateParams(var Params: TCreateParams); override; end;
procedure TForm1.CreateParams(var Params: TCreateParams); begin inherited CreateParams(Params); Params.Style := (Params.Style or WS_THICKFRAME); end;
procedure Tform1.WMsetfocus(var msg: TWMSetFocus); begin label1.Font.Color:=clBlack; end;
procedure Tform1.WMkillfocus(var msg: TWMkillFocus); begin label1.Font.Color:=clGray; end;
procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest); var xr,yr: integer; wr,hr: integer; begin xr:=msg.XPos-left; yr:=msg.YPos-top; wr:=clientWidth+3; hr:=clientHeight+3;
if xr<=2 then begin if yr<=2 then msg.Result:=HTTOPLEFT else if yr>=hr then msg.Result:=HTBOTTOMLEFT else msg.Result:=HTLEFT; exit; end;
if yr<=2 then begin if xr>=wr then msg.Result:=HTTOPRIGHT else msg.Result:=HTTOP; exit; end;
if xr>=wr then begin if yr>=hr then msg.Result:=HTBOTTOMRIGHT else msg.Result:=HTRIGHT; exit; end;
if yr>=hr then begin msg.Result:=HTBOTTOM; exit; end;
if yr <= 23 then begin //23 passer med bevelen. Msg.Result := HTCAPTION; exit; end;
Det her er ikke så hard-core som det du har gang i, men om du hægter dig fast i Application.OnActivate og OnDeactivate, så tror jeg du får den ønskede effekt.
Så er der lige den sag med at ændre farven på en TButton, men det har Borrisholt en løsning til...
type TMyHack = class(TControl) public property Font; // For at få fat i Font'en end;
procedure TForm1.ApplicationActivate(Sender: TObject); var i : integer; begin for i := 0 to ControlCount - 1 do if Controls[i] is TControl then TMyHack(Controls[i]).Font.Color := clBlue; end;
procedure TForm1.ApplicationDeactivate(Sender: TObject); var i : integer; begin for i := 0 to ControlCount - 1 do if Controls[i] is TControl then TMyHack(Controls[i]).Font.Color := clRed; end;
hrc>>okay, vil lige checkke det om lidt, MEN det med farven er lige meget det er en label i "caption" området som jeg skfiter farve på, eller jeg gør font.style til bold. Det med knappe var bare at den ligesom slugte mit event. +------------------------------------+ +caption + +------------------------------------+ + + + + + + +------------------------------------+
Det er modal jeg lige pt ville bruge det til, mit project har kun modals udfra en "mainform" i 2-3 niveauer, men det vill da være fint at vide til en anden gang. Kan man få de tilknyttede åbne forme til en application. Man kunne jo lave noget med at sætte forme på en liste ved create men det virker bøvlet. Desuden er det ikke helt sådan at windows virker normalt, kun ved modals, for ellers kan man normalt kun have en form i focus i en application, hvordan er det med sender?
procedure TForm1.ApplicationDeactivate(Sender: TObject); var i: integer; j: integer; f: Tform; begin for i:=0 to Application.ComponentCount-1 do if Application.Components[i] is Tform then begin f:=Application.Components[i] as Tform; for j:=0 to f.ComponentCount-1 do if f.Components[j] is Tlabel then (f.Components[j] as Tlabel).font.color:=clGray; end; end;
bemærk jeg tager bare alle labels, der skal testes på fx navn: "lbCaption" fx. Du får pointene, tak for hjælpen.
--nop
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.