29. januar 2006 - 13:41 Der er 10 kommentarer og
1 løsning

Hvilken component havde sidst focus?

Hvordag finder man ud af hvilken komponen der sidst havde focus.

Jeg har en form med mange komponenter, bl.a. en TListBox.
Når denne ListBox har focus er Delete knappen Enabled.
Og når den ikke har focus, så er Delete knappen ikke Enabled.

procedure TForm83.ListBoxEnter(Sender: TObject);
begin
  Delete.Enabled := True;
end;

procedure TForm83.ListBoxExit(Sender: TObject);
begin
  Delete.Enabled := False;
end;

På formens OnKeyDown har jeg en case forgrening, der aflæser tastaturtrykket, og der virker det godt nok.
  case Key of
    VK_DELETE : if ListBox.Focused then
                  DeleteClick(Sender);

Formålet er at vise at man ikke har noget at bruge Delete knappen til, når ListBox ikke har focus, så virker Delete tasten(på tastaturet) nemlig som den gør i f.ex. en teksteditor.

Men når jeg så klikker på Delete knappen sker der ingen ting. Idet, når listboksen mister focus, så Disables delete knappen åbenbart før den registrerer at der er trykket på den.

Er der en anden måde i Delete knappen OnClick event man kan checke om det var ListBox'en der sidst havde focus, så man var fri for at disable knappen?
Avatar billede psycosoft-funware Nybegynder
29. januar 2006 - 13:54 #1
procedure TForm1.ListBox1Exit(Sender: TObject);
begin
  button1.Enabled := False;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
  button2.SetFocus;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  case Key of
  VK_DELETE: begin
  if ListBox.Focused then
  Button1.Click;
  end;

end;

end.

//er det til en lille hjælp...? :-)
29. januar 2006 - 14:56 #2
Ikke rigtig.

Fordi når jeg klikker med musen på Delete knappen, så skulle følgende kode jo afvikles.

procedure TForm83.DeleteClick(Sender: TObject);
begin  // Slet markerede kommentar.
  if ListBox.ItemIndex >= 0 then
  begin
    if Figur11.Form11.Hente then
    begin
      Global.SletKNotat(Index);
      Vis;
    end;
  end;
end;

Men jeg tror at denne stump afvikles først.

procedure TForm83.ListBoxExit(Sender: TObject);
begin
  Delete.Enabled := False;
end;

Og jeg har på fornemmelsen at Delete knappen (på formen, ikke på tastaturet) bliver disabled så tidlig i processen at Delphi mener at procedure procedure

TForm83.DeleteClick(Sender: TObject);
begin  // Slet markerede kommentar.
  if ListBox.ItemIndex >= 0 then
  begin
    if Figur11.Form11.Hente then
    begin
      Global.SletKNotat(Index);
      Vis;
    end;
  end;
end;

ikke skal afvikles.

Hvis jeg udfaser eller sletter

procedure TForm83.ListExit(Sender: TObject);
begin
  Delete.Enabled := False;
end;

så kan jeg godt få noget ud af at klikke på Delete knappen.

Det er intet problem for mig selv at det ikke virker med musen, da jeg stort set aldrig bruger musen, men derimod i udstrakt grad gør brug af tastatur genveje. Men da flere af brugerne er fanatiske muse brugere, er jeg nødt til at få denne del til at virke tilfredsstillende. En af brugerne er så fanatisk, af hvis der havde været et billede af tastaturet på skærmen som man kunne klikke på med musen, så ville hun aldrig nogen sinde bruge tastaturet. Jeg kan ikke overbevise hende om at hus skal bruge musen noget mindre, jeg får blot at vide at det skal jeg overhovedet ikke blande mig i. :-)
29. januar 2006 - 15:35 #3
Jeg har fundet ud af at hvis man laver følgende istedet for ListBoxEnter og ListBoxExit, så kan man godt klikke på Delete knappen.

procedure TForm83.FormKeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Delete.Enabled := ListBox.Focused;
end;

For så bliver Delete knappen ikke disablet når man klikker på den.
Problemet er at hvis man klikker (med musen) på en af de øvrige komponenter, så ændrer det ikke på Delete knappens Enable egenskab.

Jeg har prøvet med.

procedure TForm83.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Delete.Enabled := ListBox.Focused;
end;

men det virker kun hvis man bagefter klikker et tomt sted på formen.

Er der en rutine der afvikles uanset hvor på formen man klikker med den rådne mus, uanset om det er på en tom del af formen eller på en af de øvrige komponenter?
Jeg ville helst ikke til at lave en OnClick event til alle komponenter på formen.
Avatar billede kroning Nybegynder
30. januar 2006 - 10:57 #4
Nu har jeg ikke testet det men hvad hvis du placere din listbox og dine knapper på et panel eller en groupbox og så benytter Onenter/Onexit for panelet/groupboxen?
Avatar billede kroning Nybegynder
30. januar 2006 - 14:10 #5
Nu har jeg testet det og det virker fint, men det kan self. kun bruges hvis din listbox og din button er så de kan placeres på samme panel.
30. januar 2006 - 20:37 #6
Hej Kroning

Jeg lavede et panel der fyldte hele formen, og flyttede alle komponenter over på panelet.
Men, jeg får det stadig væk ikke til at fungere.
Når jeg klikker på ListBoxen så skulle Delete knappen Enables, og når jeg klikker på en af de øvrige komponenter, f.eks. en TEdit, så skulle delete knappen Disables.

Selv med en panel der dækker hele formen og med alle komponenter på den, så skal jeg stadig klikke på et tomt sted på panelet før Delete knappens Enable egenskab ændrer sig.
Avatar billede kroning Nybegynder
30. januar 2006 - 21:09 #7
Det jeg mente var at kun din ListBox og din delete knap skal være på panelet så kan du bruge OnEnter/Onexit for panelet til at diseable/enable din Delete knap.
30. januar 2006 - 21:27 #8
Hej Kroning

Du har ret.
Hvis det kun er ListBox og Delete der er på panelet så virker det.
Det bevirker dog at indtil videre ser organiseringen af min form temmelig tilfældig ud, da de øvrige knapper ikke kan stå på linie med Delete. Kan man give en panel et andet udseende end en rektangel?
Avatar billede kroning Nybegynder
30. januar 2006 - 22:09 #9
>end en rektangel?
Det kan man sikkert jeg ved bare ikke hvordan.
01. marts 2006 - 18:54 #10
Hej Kroning
Smid et svar så vi kan få lukket dette spørgsmål
Avatar billede kroning Nybegynder
01. marts 2006 - 19:52 #11
jo
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

IT-JOB

IT-Universitetet i København

CIO

Netcompany A/S

IT Consultant

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Sektionschef til Enterprise Arkitektur i Forsvaret på Østerbro

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Netværkstekniker til Forsvarets Cyberdivision i Hvidovre – Er det dig?