Autor Téma: ComboBox - zaostrenie na ďalší komponent  (Přečteno 1662 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7391
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
ComboBox - zaostrenie na ďalší komponent
« kdy: 02-02-2023, 16:22:03 »

Mám
Kód: Delphi [Vybrat]
  1. type
  2.   TBasalForm = class(TForm)
  3.   public
  4.     procedure HandleKeyPress(Sender: TObject; var Key: Char);
  5.   end;
  6. .
  7. procedure TBasalForm.HandleKeyPress(Sender: TObject; var Key: Char);
  8. begin
  9.   if Key = #13 then
  10.   begin
  11.     SelectNext(TWinControl(Sender), True, True);
  12.     Key := #0;
  13.   end;
  14. end;
  15. .
  16. constructor TBasalForm.Create(AOwner: TComponent);
  17. begin
  18.   inherited;
  19.   Self.KeyPreview := True;
  20.   Self.OnKeyPress := HandleKeyPress;
  21. ...
To mi funguje pre všetky komponenty, okrem rodiny ComboBox.
Ak si to v teste vložím priamo do ComboBox.Onchange, tak to ide.
Chcem to mať v týchto udalostiach.
  • OnChange
  • OnKeyPress
Ide to nejako vyriešiť v TBasalForm?
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7391
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #1 kdy: 07-02-2023, 13:50:09 »
Ďakujem za všetky odpovede. V poslednej dobe ich mám neúrekom ;D
Mám funkciu, ktorá prechádza každý formulár. Tam to môžem urobiť.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline soko.ban

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 2
    • Verze Delphi: RAD Studio 12.1 (Začínal jsem s Delphi 2)
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #2 kdy: 08-02-2023, 10:24:29 »
Nepomůže nastavit TForm.KeyPreview? V defaultu je False.

Btw, nebylo by lepší použít override na KeyPress místo toho přiřazení eventu sám na sebe?

Kód: Delphi [Vybrat]
  1. procedure TWinControl.KeyPress(var Key: Char);
  2. begin
  3.   if Assigned(FOnKeyPress) then FOnKeyPress(Self, Key);
  4. end;
  5.  

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7391
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #3 kdy: 08-02-2023, 12:07:05 »
Nepomůže nastavit TForm.KeyPreview? V defaultu je False.

Btw, nebylo by lepší použít override na KeyPress místo toho přiřazení eventu sám na sebe?

Kód: Delphi [Vybrat]
  1. procedure TWinControl.KeyPress(var Key: Char);
  2. begin
  3.   if Assigned(FOnKeyPress) then FOnKeyPress(Self, Key);
  4. end;
  5.  
bez toho TForm.KeyPreview = True by to vôbec nefungovalo.
Ja do OnKeyPress dávam vlastnú udalosť. Viď prvý príspevok. Tu uverejnenému kódu nerozumiem. Rozmýšľal som nad tým, že si neprepíšem udalosť, ak už existuje. V tom prípade bude musieť obsahovať kód na zmenu zaostrenia. To bude lepšie než nič.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline soko.ban

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 2
    • Verze Delphi: RAD Studio 12.1 (Začínal jsem s Delphi 2)
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #4 kdy: 08-02-2023, 14:14:32 »
TComboBox je složená komponenta.  Vespod je TComboBox, na něm Edit. Proto to z něj nefunguje. Pěkně to lze zjistit pomocí WinDowse (http://www.greatis.com/delphicb/windowse/)

Zbytek bude snad pochopitelný z kódu.

Kód: Delphi [Vybrat]
  1. TBasalForm = class(TForm)
  2. protected
  3.   procedure KeyPress(var Key: Char); override;
  4. end;
  5.  
  6. procedure TBasalForm.KeyPress(var Key: Char);
  7. var
  8.   LHWND: HWND;
  9.   LW: TWinControl;
  10. begin
  11.   if Key = #13 then
  12.   begin
  13.     LHWND := GetFocus;
  14.     LW := FindControl(LHWND);
  15.     if LW = nil then
  16.     begin
  17.       LHWND := GetParent(LHWND);
  18.       LW := FindControl(LHWND);
  19.     end;
  20.     if LW <> nil then
  21.     begin
  22.       var LShiftPressed := (GetKeyState(VK_SHIFT) and $8000) = 0;
  23.       SelectNext(LW, LShiftPressed, True);
  24.       Key := #0;
  25.     end;
  26.   end
  27.   inherited;
  28. end;
  29.  

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7391
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #5 kdy: 08-02-2023, 15:51:42 »
Citace
TComboBox je složená komponenta.  Vespod je TComboBox, na něm Edit. Proto to z něj nefunguje. Pěkně to lze zjistit pomocí WinDowse
Jaj, až také vedomosti nemám. Pri čítaní som si spomenul, že som to už videl/čítal.
Ďakujem za vysvetlenie a ukážku. Naštudujem si to.
Pri CombBox určite nepoužívam udalosť OnKeyPress. Ale OnChange používam. Musím si urobiť analýzu používania OnChange. Na základe toho uvidím čo a ako.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline soko.ban

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 2
    • Verze Delphi: RAD Studio 12.1 (Začínal jsem s Delphi 2)
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #6 kdy: 09-02-2023, 08:12:33 »
Ještě jsem si všiml, že název proměnné mi tam neodpovídá stavu. Takhle je to logičtější.

Kód: Delphi [Vybrat]
  1.       var LShiftPressed := (GetKeyState(VK_SHIFT) and $8000) > 0;
  2.       SelectNext(LW, not LShiftPressed, True);
  3.  

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7391
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #7 kdy: 09-02-2023, 09:09:31 »
Snáď to pochopím ;D
K tomu len vlastná skúsenosť. OnKeyPress sa volá len zo zoznamu. Nevolá sa z Edit poľa. Tam sa volá OnChange.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7391
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #8 kdy: 15-02-2023, 14:56:02 »
Na TComboBox to funguje pekne.
Žiaľ, nefunguje to na TAdvDBLookupComboBox. Tento komponent používam podstatne viac. Netuším ako je riešený. Väčšinou majú vlastné riešenia.
Kód: Delphi [Vybrat]
  1.   TAdvDBLookupComboBox = class(TCustomEdit, ITMSStyle)
  2.   TCustomEdit = class(TWinControl)
V prílohe je celá (len) definícia triedy.
Len upozorňujem, že to je pre mňa nepriechodné. Nerozumiem ani tu uverejnenému kódu. Len tak zhruba hádam :(
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Online pf1957

  • Padawan
  • ******
  • Příspěvků: 3527
  • Karma: 139
    • Verze Delphi: D2007, XE3, DX10
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #9 kdy: 16-02-2023, 19:23:26 »
Na TComboBox to funguje pekne.
Žiaľ, nefunguje to na TAdvDBLookupComboBox. Tento komponent používam podstatne viac. Netuším ako je riešený. Väčšinou majú vlastné riešenia.
Kód: Delphi [Vybrat]
  1.   TAdvDBLookupComboBox = class(TCustomEdit, ITMSStyle)
  2.   TCustomEdit = class(TWinControl)
V prílohe je celá (len) definícia triedy.
Len upozorňujem, že to je pre mňa nepriechodné. Nerozumiem ani tu uverejnenému kódu. Len tak zhruba hádam :(
Vzdyt sis delal nejake vlastni komponenty slozene z jinych, ne? Ten princip je, ze musis najit top-level window, ze ktereho chces predat focus na jeho sourozence. A k tomu je deklarace tridy k nicemu, ty se musis podivat do konstrukturu, z ceho se ta slozena komponenta sklada a musis zjistit, ktera cast te slozene komponenty ma focus a pak najit tu top level, pokud je to nejaka vnitrni komponenta.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7391
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #10 kdy: 17-02-2023, 09:03:08 »
Ďakujem. Pozriem sa na to. Za výsledok neručím :)
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7391
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #11 kdy: 18-02-2023, 11:15:28 »
  • kódu od soko.ban presne nerozumiem. Len tak zhruba
  • pozrel som sa na kód TAdvDBLookupComboBox a aj krokoval jeho tvorbu. Nepomohlo mi to. Nepochopil som ho
TAdvDBLookupComboBox používam jedine pre hodnoty cudzích kľúčov. Takže to nepovažujem za kritické.
Nemám na to. Nechávam to tak.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline soko.ban

  • Mladík
  • **
  • Příspěvků: 53
  • Karma: 2
    • Verze Delphi: RAD Studio 12.1 (Začínal jsem s Delphi 2)
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #12 kdy: 20-02-2023, 08:09:36 »


Tak si nainstaluj ten WinDowse. Najedeš myší nad nějakou komponentu a on ti řekne co je zač a jaké má parenty. (Na tom obrázku je v obou případech myš nad ComboBoxem).
Takže když najedeš nad TEdit, dozvíš se, že to je TEDit a parent je TForm. Pokud nad TComboBox, dozvíš se, že to je Edit a parent je TComboBox a pak TForm.
SelectNext má jako první parametr CurrentControl: TWinControl, takže pokud voláním GetFocus a FindControl dostanu nil, tak je ještě zkusím mrknout na jeho Parent a použít ten. U TEdit vyhoví první volání, u TComboBox to projde na ten parent.
Tipuju, že ten TAdvDBLookupComboBox  bude něco podobného.
My používáme komponenty od DevExpressu, a ty jsou takhle dělaný všechny (Nosič a inneredit).

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7391
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #13 kdy: 20-02-2023, 09:07:19 »
Ďakujem. Za pokus nič nedám. Skúsim to.
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 7391
  • Karma: 44
    • Verze Delphi: W11 + D11.3.1
Re: ComboBox - zaostrenie na ďalší komponent
« Odpověď #14 kdy: 20-02-2023, 15:51:41 »
Nepomohlo mi to. Tak som kód dal priamo do komponentu. Dal som bod prerušenia. Čuduj sa svete, nedostal som sa tam. Udalosť som priradil k TEdit a tam sa dalo krokovať. Pri ostatných TMS ComboBox sa udalosť volá.
Vyskúšal som vlastnosť ReturnIsTab (dal som True) a robí to čo som už teraz predpokladal a potrebujem to.
Problém je vyriešený. Len neviem prečo sa nespustí OnKeyPress. Idem si pozrieť návod.
« Poslední změna: 20-02-2023, 16:04:30 od Stanislav Hruška »
Win11 64b, Delphi 11.3.1, FireBird 4.01
Expert na kladenie nejasne formulovaných otázok.