Delphi > Firemonkey
FMX komponenta - detekce kliku mimo
age.new:
Dobrý den,
pro Firemonkey mám komponentu třídy TLayout. Na této komponentě mám zobrazení textu, možnost kliku, rozbalení dalšího obsahu a tak. Potřeboval bych ale zachytit klik mimo tuto komponentu a její obsah zase sbalit. Něco jako je roletka u TComboBox, kde mi ale princip není moc jasný. Na internetu nic funkčního není, resp. ne, když to chci řešit interně v komponentě.
Nenapadá někoho jakým způsobem se to dá řešit?
Děkuji.
pf1957:
S FXM jsem nic podstatneho nedelal, ale rekl bych, ze to musi byt podobne, jako u VCL: TControl implementuje IControl, ktery obsahuje mechanismus Enter/Exit resp. Activate/DeActivate. Takze si ty metody prekryt a udelat si, co potrebujes.
age.new:
Dobrý den,
četl jsem něco o OnExit (DoExit). Po vytvoření procedury DoExit a jejím override je ale volána jen když deaktivuji celý Form (nebo jej ukončuji). Zítra se podívám na OnDeactivate a dám vědět.
Děkuji.
pf1957:
--- Citace: age.new 04-01-2022, 15:35:34 ---četl jsem něco o OnExit (DoExit). Po vytvoření procedury DoExit a jejím override je ale volána jen když deaktivuji celý Form (nebo jej ukončuji). Zítra se podívám na OnDeactivate a dám vědět.
--- Konce citace ---
To je zrejme tim, ze ten TLayout neni focusable (to by musel byt potomek TWinControls = mit handle okna - to se takove eventy volaji pri ztrate focusu), takze docilit toho, aby se to chovalo jako dropdown list u comboboxu nemusi byt jednoduse, pokud vubec, resitelne.
Radek Červinka:
--- Citace: pf1957 04-01-2022, 22:34:39 ---To je zrejme tim, ze ten TLayout neni focusable (to by musel byt potomek TWinControls = mit handle okna - to se takove eventy volaji pri ztrate focusu), takze docilit toho, aby se to chovalo jako dropdown list u comboboxu nemusi byt jednoduse, pokud vubec, resitelne.
--- Konce citace ---
Tohle není pravda. FMX si az na vyjimky na handle okna nehraje a vubec je nepotrebuje. I ten ComboBox je seskladan z primitiv a neni to nativni prvek. U nekterych controlu se da zapnout platformova verze (typicky TEdit, datumove vstupy) pres Property ControlType.
Ale zpet. Pokud to dobre chapu, tak zkus tohle:
Misto Layout pouzij TPanel. Na formulari mam dva TPanel, a v kazdem je TRectangle at neco vidime.
fmx soubor:
--- Kód: Delphi ---object Form2: TForm2 Left = 0 Top = 0 Caption = 'Form2' ClientHeight = 480 ClientWidth = 640 FormFactor.Width = 320 FormFactor.Height = 480 FormFactor.Devices = [Desktop] OnCreate = FormCreate DesignerMasterStyle = 0 object Panel1: TPanel Position.X = 256.000000000000000000 Position.Y = 32.000000000000000000 TabOrder = 0 OnEnter = Panel1Enter OnExit = Panel1Exit object Rectangle1: TRectangle Align = Client HitTest = False Size.Width = 120.000000000000000000 Size.Height = 120.000000000000000000 Size.PlatformDefault = False end end object Panel2: TPanel Position.X = 400.000000000000000000 Position.Y = 32.000000000000000000 TabOrder = 1 object Rectangle2: TRectangle Align = Client HitTest = False Size.Width = 120.000000000000000000 Size.Height = 120.000000000000000000 Size.PlatformDefault = False end endend
--- Kód: Delphi ---unit Unit2; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.ListBox, FMX.StdCtrls, FMX.Controls.Presentation, FMX.Objects; type TForm2 = class(TForm) Panel1: TPanel; Panel2: TPanel; Rectangle1: TRectangle; Rectangle2: TRectangle; procedure Panel1Exit(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Panel1Enter(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form2: TForm2; implementation {$R *.fmx} procedure TForm2.FormCreate(Sender: TObject);begin Panel1.CanFocus := True; Panel1.HitTest := True; Panel2.CanFocus := True; Panel2.HitTest := True; Rectangle1.HitTest := False; // vypneme hittest u vnitrni komponenty, takze probubla do panelu Rectangle2.HitTest := False; // to sameend; procedure TForm2.Panel1Enter(Sender: TObject);begin Rectangle1.Stroke.Color := TAlphaColorRec.Red;end; procedure TForm2.Panel1Exit(Sender: TObject);begin Rectangle1.Stroke.Color := TAlphaColorRec.Grey;end;
Navigace
[0] Seznam témat
[#] Další strana
Přejít na plnou verzi