Delphi > Firemonkey

FMX komponenta - detekce kliku mimo

<< < (3/5) > >>

age.new:
Rád bych to řešil v rámci komponenty. Ať už ji dám na formulář nebo panel či layout. Po těch letech už mě FMX moc nepřekvapuje - neustálé obcházení základních funkcí, stovky chyb a nedodělaných komponent :(

ComboBox je řešený přes TPopup, což je custom form, které se globálně obsluhují v FMX.Platform.Win.WndProc (pokud se dobře pamatuji). Nechápu, proč zde není vyvedená cestička dál a třeba všem objektům s AutoCapture není předána. Bylo by to elegantní a funkční. Nezbývá, než si to zprogramovat a zase držet další pas soubory v projektu.

Přes TPopup to zkouším teď, ale nenašel jsem způsob, jak se dostat ještě před ClosePopup proceduru, která je zavolána již pozdě (po zrušení některých ukazatelů). Kdyby existovalo nějaké CanClosePopup jako je CloseQuery.

age.new:
Tak se mi podařilo docílit požadovaného efektu pomocí TPopup, ale narazil jsem na další nesmyslnou chybu. Objekt umístěný v TPopup ztrácí HitTest vlastnost, resp. MouseDown událost se zaznamená jen na neprůhledných pixelech objektu. Takže pokud máte část průhlednou, tak klik v tomto místě skryje TPopup objekt i když byl klik uvnitř. To se děje u TLayout i TRectangle. Nastavený HitTest jak u TPopup, tak ani u jiných objektů nepomůže.... asi se zde objevuje vlastnost u formulářů, které když jsou průhledné, tak HitTest nezabere i když je nastavený. Takto je to ale nedomyšlené.

Radek Červinka:

--- Citace: age.new  05-01-2022, 12:06:15 ---Tak se mi podařilo docílit požadovaného efektu pomocí TPopup, ale narazil jsem na další nesmyslnou chybu. Objekt umístěný v TPopup ztrácí HitTest vlastnost, resp. MouseDown událost se zaznamená jen na neprůhledných pixelech objektu. Takže pokud máte část průhlednou, tak klik v tomto místě skryje TPopup objekt i když byl klik uvnitř. To se děje u TLayout i TRectangle. Nastavený HitTest jak u TPopup, tak ani u jiných objektů nepomůže.... kdybych dostal korunu za každou chybu, tak již mám postavený dům.

--- Konce citace ---

Jen pro zajimavost: jak by jsi toho docilil u VCL? Podle mne by ses nedostal vubec nikam - to jen takova poznamka. Myslim si, ze to pres TPopup neni dobre reseni.
Podle mne jdes spatnou cestou. Porad nechapu proc se ti nelibi reseni pres ztratu fokusu, tj. dokud neco nema jiny fokus tak se nic nastane.

pf1957:

--- Citace: Radek Červinka  05-01-2022, 12:16:11 ---Podle mne jdes spatnou cestou. Porad nechapu proc se ti nelibi reseni pres ztratu fokusu, tj. dokud neco nema jiny fokus tak se nic nastane.

--- Konce citace ---
No protoze bys musel zajistit, ze vsechny widgety okolo jsou nebo lezi na focusable widgetu, aby ke ztrate fokusu doslo, takze porusujes zapouzdrenost komponenty. Ale je pravda, ze neco takove bys horko tezko dociloval i u VCL - tam by ses musel nejspis centralne povesit na nejake zpravy jako WM_ACTIVATE, WM_KILLFOCUS a neco kolem mysi a porozhlednout se, komu presne patri.

Treba v browserech a JavaScriptu se to resi obsluhou udalosti onClick, kterou tam ma ale kazdy element a udalosti lze obsluhovat hromadne pres JQUERY a mam dojem, ze pres OnClick, na ktery muze byt poveseno vic posluchacu, se to delava i v dotNetu.

age.new:
Přes fokus to není dobrá cesta. Některé objekty fokus nemají a pak by to nefungovalo. TComboBox to má řešené přes TPopup. Udělám to stejně, sic s omezením grafických prvků na max 99% průhlednost.

Domnívám se, že u VCL se nabízí řešení více. Globální hook, zachytávání message událostí ...

Navigace

[0] Seznam témat

[#] Další strana

[*] Předchozí strana

Přejít na plnou verzi