Avatar billede nop Nybegynder
29. juni 2004 - 16:18 Der 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;

    msg.Result:=HTCLIENT; //bare formen
end;
Avatar billede hrc Mester
30. juni 2004 - 23:16 #1
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;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnActivate := ApplicationActivate;
  Application.OnDeactivate := ApplicationDeactivate;
end;
Avatar billede nop Nybegynder
01. juli 2004 - 08:41 #2
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                            +
+------------------------------------+
+                                    +
+                                    +
+                                    +
+------------------------------------+

sådan skal min form se ud.
Avatar billede nop Nybegynder
01. juli 2004 - 15:59 #3
Det virker rent faktisk, MEN :) hvad med flere forme, og især de modale?
Avatar billede nop Nybegynder
01. juli 2004 - 16:05 #4
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?
Avatar billede nop Nybegynder
01. juli 2004 - 16:13 #5
Fandt ud af hvordan:

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
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