Delphi > Firemonkey

FMX komponenta - detekce kliku mimo

(1/5) > >>

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