fix(android): the clear cross lives beside the field, not inside it

It was a TLabel, and in FMX a label does not take clicks - HitTest is False by default there. But fixing that alone would not have been enough: a child placed inside a TEdit does not reliably receive touches, the native control claims them across its whole surface.

It now sits in a wrapper next to the field, as a transparent rectangle with the cross drawn inside it - one Right and one Client, so there is no stacking order to guess either.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-15 19:27:36 +01:00
parent aba873b9cc
commit 49377b0990
+31 -15
View File
@@ -103,7 +103,8 @@ type
// --- ecran 2 : liste // --- ecran 2 : liste
FLayList: TLayout; FLayList: TLayout;
FSearch: TEdit; FSearch: TEdit;
FSearchHint, FSearchClear: TLabel; FSearchHint: TLabel;
FSearchClear: TRectangle;
/// Choix du dossier : un bouton peint, et un panneau de selection montre /// Choix du dossier : un bouton peint, et un panneau de selection montre
/// a la demande. FFolders[0] est toujours « tous les dossiers ». /// a la demande. FFolders[0] est toujours « tous les dossiers ».
FBtnFolder: TRectangle; FBtnFolder: TRectangle;
@@ -383,8 +384,9 @@ end;
procedure TForm8.BuildList; procedure TForm8.BuildList;
var var
LBar, LTop: TLayout; LBar, LTop, LSearchWrap: TLayout;
LBtnLock: TRectangle; LBtnLock: TRectangle;
LClearMark: TLabel;
begin begin
FLayList := TLayout.Create(Self); FLayList := TLayout.Create(Self);
FLayList.Parent := Self; FLayList.Parent := Self;
@@ -437,11 +439,37 @@ begin
FBtnFolder.Width := 170; FBtnFolder.Width := 170;
FBtnFolder.Margins.Left := 8; FBtnFolder.Margins.Left := 8;
// La croix vit A COTE du champ, pas dedans. Un enfant place dans un TEdit
// ne recoit pas les touches de facon fiable : le controle natif les capte
// sur toute sa surface. Un conteneur avec un Right et un Client leve en
// plus toute question d'ordre.
LSearchWrap := TLayout.Create(Self);
LSearchWrap.Parent := LTop;
LSearchWrap.Align := TAlignLayout.Client;
FSearchClear := TRectangle.Create(Self);
FSearchClear.Parent := LSearchWrap;
FSearchClear.Align := TAlignLayout.Right;
FSearchClear.Width := 46;
FSearchClear.Fill.Kind := TBrushKind.None; // invisible, mais cliquable
FSearchClear.Stroke.Kind := TBrushKind.None;
FSearchClear.Visible := False;
FSearchClear.OnClick := OnSearchClear;
LClearMark := TLabel.Create(FSearchClear);
LClearMark.Parent := FSearchClear;
LClearMark.Align := TAlignLayout.Client;
LClearMark.HitTest := False; // le clic va au rectangle
LClearMark.Text := 'X';
LClearMark.TextSettings.HorzAlign := TTextAlign.Center;
LClearMark.TextSettings.VertAlign := TTextAlign.Center;
Tint(LClearMark, 17, True);
// Le champ reste natif - il faut un clavier - et son fond vient desormais du // Le champ reste natif - il faut un clavier - et son fond vient desormais du
// style, recolore a la palette par make-style.ps1. PAS de rectangle derriere // style, recolore a la palette par make-style.ps1. PAS de rectangle derriere
// lui : il en resultait deux cadres arrondis emboites. // lui : il en resultait deux cadres arrondis emboites.
FSearch := TEdit.Create(Self); FSearch := TEdit.Create(Self);
FSearch.Parent := LTop; FSearch.Parent := LSearchWrap;
FSearch.Align := TAlignLayout.Client; FSearch.Align := TAlignLayout.Client;
FSearch.OnChangeTracking := OnSearchChanged; FSearch.OnChangeTracking := OnSearchChanged;
@@ -460,18 +488,6 @@ begin
// Croix d'effacement, montree seulement quand il y a quelque chose a // Croix d'effacement, montree seulement quand il y a quelque chose a
// effacer. Un TLabel et non un bouton : dans un champ, une croix se touche, // effacer. Un TLabel et non un bouton : dans un champ, une croix se touche,
// elle ne se dessine pas comme une commande. // elle ne se dessine pas comme une commande.
FSearchClear := TLabel.Create(FSearch);
FSearchClear.Parent := FSearch;
FSearchClear.Align := TAlignLayout.Right;
FSearchClear.Width := 44;
FSearchClear.Visible := False;
FSearchClear.Text := 'X';
FSearchClear.TextSettings.HorzAlign := TTextAlign.Center;
FSearchClear.TextSettings.VertAlign := TTextAlign.Center;
FSearchClear.StyledSettings := [];
FSearchClear.TextSettings.Font.Size := 17;
FSearchClear.TextSettings.FontColor := COL_MUTED;
FSearchClear.OnClick := OnSearchClear;
end; end;
/// Intitule discret au-dessus d'une valeur. Meme forme pour toutes les /// Intitule discret au-dessus d'une valeur. Meme forme pour toutes les