Sur une évolution récente, j'ai ajouté un TEdit pour saisir un codebarre au format indéterminé en plus d'un code barre au format bien précis géré par un TMaskEdit

J'ai le même code qui gère les deux Edit, au final, je retrouve un numéro

A la fin, j'efface le contenu du Edit, cela permet que l'utilisateur puisse saisir toute de suite un autre code barre
Et là, patatra, la modification du Text via un transtypage du TMaskEdit en TCustomEdit rend le contrôle instable
Il n'affiche plus son masque
Il n'accepte plus qu'un seul caractère et est en mode remplacement, donc inutilisable

Tout ça parce que la propriété Text est redéfini dans TCustomMaskEdit et SetText est même en reintroduce
Et le passage par un TCustomEdit fait appel au override du SetText par le TWinControl ce qui est incompatible

Voilà, je comprends très bien le bug, c'est lié à la redéfinition d'une propriété, je l'ai déjà fait mais il faut alors un code fortement typé et oublier le polymorphisme
Mais c'est quand même un piège à con !
une petite remarque dans http://docwiki.embarcadero.com/Libra...mMaskEdit.Text genre
N'utilisez pas la propriété Text du TCustomEdit pour manipuler le Text d'un TCustomMaskEdit
Surtout que mes tests, j'ai tout fait avec un Copier-Coller et cela fonctionne (il choppe le code entier)
A la recette (du coup, je me demande si elle a été faite avec une douchette et non au copier-coller aussi), personne n'a rien vu !

Code dfm : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
object Edit1: TEdit
  Left = 8
  Top = 648
  Width = 121
  Height = 21
  TabOrder = 51
  Text = 'Edit1'
  OnKeyDown = Edit1KeyDown
end
object MaskEdit1: TMaskEdit
  Left = 135
  Top = 648
  Width = 120
  Height = 21
  EditMask = '999c9999999999;0'
  MaxLength = 14
  TabOrder = 52
  OnKeyDown = Edit1KeyDown
end


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm.Edit1KeyDown(Sender: TObject; var Key: Word;Shift: TShiftState);
var
  Edit: TCustomEdit absolute Sender;
begin
  if Key <> 13 then
    Exit;
 
  ShowMessage(Edit.Text);
  Edit.Text := ''; // Bug
  //   (Sender as TCustomEdit).Text := ''; // Bug
  // MaskEdit.Text := ''; // OK
  Edit.SetFocus();
end;



le code véritable qui fonctionne en PROD

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
 
 
//------------------------------------------------------------------------------
procedure TfmMainColisage.edColisEsclaveKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  Edit: TCustomEdit absolute Sender;
  LColisFound: Boolean;
  LNumColis, LNatureChute: Integer;
  LMagasin, LTransporteur, LMarque, LFournisseur: string;
begin
  if Key <> 13 then
    Exit;
 
  LColisFound := ((Sender = edColisEsclave) and ColisageBusiness.ExtractNumeroColis(edColisEsclave.Text, LNumColis))
    or ((Sender = edColisEsclaveByNumTransp) and ColisageBusiness.ExtractNumeroColisByNumTransp(edColisEsclaveByNumTransp.Text, LNumColis));
 
  if not LColisFound then
  begin
    TXxxxFormFlasher.Flash(Self, clRouge);
    TXxxxMessageDlg.Show(_('N° de colis incorrect'), mtInformation, [mbOk], mbCancel);
    Edit.SetFocus();
    Edit.SelectAll();
    Exit;
  end;
 
  if LNumColis = FColisMaitre then
  begin
    TXxxxFormFlasher.Flash(Self, clRouge);
    TXxxxMessageDlg.Show(_('Vous ne pouvez ajouter un colis dans lui-même.'), mtInformation, [mbOk], mbCancel);
    Edit.SetFocus();
    Edit.SelectAll();
    Exit;
  end;
 
  if ColisageBusiness.ColisDejaAjoute(LNumColis) then
  begin
    TXxxxFormFlasher.Flash(Self, clRouge);
    TXxxxMessageDlg.Show(_('Ce colis a déjà été ajouté.'), mtWarning, [mbOk], mbCancel);
    Edit.SetFocus();
    Edit.SelectAll();
    Exit;
  end;
 
  if not ColisageBusiness.MagasinTransporteurOuMarqueDuColis(LNumColis, LMagasin, LTransporteur, LMarque, LFournisseur, LNatureChute) then
  begin
    TXxxxFormFlasher.Flash(Self, clRouge);
    TXxxxMessageDlg.Show(_('Ce colis n''existe pas.'), mtInformation, [mbOk], mbCancel);
    Edit.SetFocus();
    Edit.SelectAll();
    Exit;
  end;
 
  if ColisageBusiness.ColisEsclaveDejaConsolide(FColisMaitre) then
  begin
    TXxxxFormFlasher.Flash(Self, clRouge);
    TXxxxMessageDlg.Show(_('Ce colis fait déjà partie d''un autre colis maître.'), mtInformation, [mbOk], mbCancel);
    Edit.SetFocus();
    Edit.SelectAll();
    Exit;
  end;
 
  if (LMagasin = '') and (LFournisseur = '') and not (LNatureChute in [4,5]) then
  begin
    TXxxxFormFlasher.Flash(Self, clRouge);
    TXxxxMessageDlg.Show(_('Ce colis n''a pas de destination. Impossible de l''ajouter.'), mtWarning, [mbOk], mbCancel);
    Edit.SetFocus();
    Edit.SelectAll();
    Exit;
  end;
 
  // Ccolisage tri magasin
  if LMagasin <> '' then
  begin
    if LMagasin <> edMagasin.Text then
    begin
      TXxxxFormFlasher.Flash(Self, clRouge);
      TXxxxMessageDlg.Show(Format(_('Ce colis a une destination (%s) différente de celle du colis maître. Impossible de l''ajouter.'), [LMagasin]), mtWarning, [mbOk], mbCancel);
      Edit.SetFocus();
      Edit.SelectAll();
      Exit;
    end;
 
    // Les Colis Inter-Magasin (RE) partent d'un magasin A vers un magasin B, il est possible que le transporteur soit différent !
    if (LTransporteur <> uDeclarationHO.TRANSPORTEUR_NEUTRE ) and
       (edTransport.Text <> uDeclarationHO.TRANSPORTEUR_NEUTRE ) and
       (LTransporteur <> uDeclarationHO.TRANSPORTEUR_ECOM_REA ) and
       (LTransporteur <> edTransport.Text) then
    begin
      TXxxxFormFlasher.Flash(Self, clWebOrange);
      if TXxxxMessageDlg.Show(Format(_('Ce colis a un transporteur (%s) différent de celui du colis maître. Ignorer l''erreur et forcer l''ajout ?'), [LTransporteur]),
                              mtWarning, [mbCancel, mbIgnore],
                              [_('Annuler l''ajout'), _('Ignorer l''erreur et forcer l''ajout')]) <> mrIgnore then
      begin
        Edit.SetFocus();
        Edit.SelectAll();
        Exit;
      end;
    end;
  end
 
  // Colisage tri tiers (vers un fournisseur)
  else
  begin
    if LFournisseur <> edCodeFournisseur.Text then
    begin
      TXxxxFormFlasher.Flash(Self, clRouge);
      TXxxxMessageDlg.Show(Format(_('Ce colis est pour le fournisseur %s %s différent de celui du colis maître. Impossible de l''ajouter.'), [LFournisseur, ColisageBusiness.qVerifColisExiste.FieldByName('f_ch_nom').AsString]), mtWarning, [mbOk], mbCancel);
      Edit.SetFocus();
      Edit.SelectAll();
      Exit;
    end;
 
  end;
 
  TXxxxFormFlasher.Flash(Self, clVert);
  ColisageBusiness.AjouteColisEsclave(FColisMaitre);
 
  btnChangerColisMaitre.Enabled := False;
  btnAnnulerColisMaitre.Enabled := True;
  btnValiderColisMaitre.Enabled := True;
 
  edColisEsclave.Text := '';
  edColisEsclaveByNumTransp.Text := '';
  Edit.SetFocus();
end;