fix(android): a fresh container per entry, and the filename left to read in its own direction

Row order alternated: correct on first open, upside down on the next. Neither the stacking convention nor an explicit Index stabilised it. Since the first population is reliable, there is never a second one - the scroll box is destroyed and rebuilt per entry. Costs one control; removes a whole class of oddities.

The attachment size moved from the value into the caption. An Arabic filename followed by a latin size mixes two reading directions in one line, and FMX's bidirectional rendering makes a mess of it. Apart, each reads its own way.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
r-zakarya
2026-08-15 15:21:19 +01:00
parent bbb44a3787
commit 3a9248c6c7
+23 -9
View File
@@ -470,11 +470,8 @@ begin
FDetToast.TextSettings.Font.Size := 12; FDetToast.TextSettings.Font.Size := 12;
FDetToast.Opacity := 0.7; FDetToast.Opacity := 0.7;
// Defilant : une entree avec dix champs personnalises depasse l'ecran d'un // Le corps defilant n'est PAS cree ici : il est recree a chaque ouverture
// telephone, et les lignes ne sont connues qu'a l'ouverture. // d'entree, voir ShowDetail.
FDetBody := TVertScrollBox.Create(Self);
FDetBody.Parent := FLayDetail;
FDetBody.Align := TAlignLayout.Client;
FDetTitle := TLabel.Create(Self); FDetTitle := TLabel.Create(Self);
FDetTitle.Parent := FLayDetail; FDetTitle.Parent := FLayDetail;
@@ -542,10 +539,17 @@ begin
if FTotpTimer <> nil then FTotpTimer.Enabled := False; if FTotpTimer <> nil then FTotpTimer.Enabled := False;
FTotpValue := nil; FTotpValue := nil;
FTotpCode := ''; FTotpCode := '';
// Detruites explicitement plutot que par DeleteChildren : le conteneur est // LE CONTENEUR ENTIER EST DETRUIT, pas seulement ses lignes.
// un TVertScrollBox, dont les enfants comprennent ses propres barres. //
// Reutiliser le TVertScrollBox donnait un ordre d'affichage qui ALTERNAIT :
// correct a la premiere ouverture, inverse a la suivante. Ni la convention
// d'empilement ni un Index explicite ne l'ont stabilise. Puisque la premiere
// population est fiable, on n'en fait jamais de seconde - un conteneur neuf
// par entree. Ca coute la creation d'un controle, ca supprime une classe
// entiere de bizarreries.
for LRow in FRowCtls do LRow.Free; for LRow in FRowCtls do LRow.Free;
SetLength(FRowCtls, 0); SetLength(FRowCtls, 0);
FreeAndNil(FDetBody);
SetLength(FRowValues, 0); SetLength(FRowValues, 0);
SetLength(FRowShown, 0); SetLength(FRowShown, 0);
SetLength(FRows, 0); SetLength(FRows, 0);
@@ -570,6 +574,12 @@ var
begin begin
Touch; Touch;
ClearDetailRows; ClearDetailRows;
// Conteneur neuf. Align=Client, donc il ne dispute sa place ni au titre
// (Top) ni au pied (Bottom) : l'ordre de creation lui est indifferent.
FDetBody := TVertScrollBox.Create(Self);
FDetBody.Parent := FLayDetail;
FDetBody.Align := TAlignLayout.Client;
FCurrent := FVault.Entry(AVaultIndex); FCurrent := FVault.Entry(AVaultIndex);
FDetTitle.Text := FCurrent.Display; FDetTitle.Text := FCurrent.Display;
FDetToast.Text := ''; FDetToast.Text := '';
@@ -594,9 +604,13 @@ begin
// Les pieces jointes ne sont pas encore enregistrables sur le telephone, // Les pieces jointes ne sont pas encore enregistrables sur le telephone,
// mais taire leur existence serait pire : on saurait sur le poste qu'une // mais taire leur existence serait pire : on saurait sur le poste qu'une
// entree porte un document, et pas ici. // entree porte un document, et pas ici.
// Taille dans l'INTITULE, pas collee au nom : un nom de fichier arabe suivi
// d'une taille latine melange deux sens de lecture dans la meme ligne, et le
// rendu bidirectionnel de FMX en fait n'importe quoi. Separes, chacun se
// lit dans son sens.
for I := 0 to High(FCurrent.Attachments) do for I := 0 to High(FCurrent.Attachments) do
Add('Piece jointe', FCurrent.Attachments[I].FileName + ' ' + Add('Piece jointe - ' + HumanSize(FCurrent.Attachments[I].SizeBytes),
HumanSize(FCurrent.Attachments[I].SizeBytes), False); FCurrent.Attachments[I].FileName, False);
Add('Dossier / etiquettes', LMeta, False); Add('Dossier / etiquettes', LMeta, False);
// Le sous-type n'existe que pour les modeles (carte, cle SSH, serveur...) ; // Le sous-type n'existe que pour les modeles (carte, cle SSH, serveur...) ;