29. januar 2006 - 13:41Der 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?
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;
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. :-)
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.
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.
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?
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.
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.
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?
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.