Bonjour
Dans une application, j'ai plusieurs fenêtres qui comporte de 1 à n TEdit servant de zone de saisie pour la recherche de ligne dans une une DBGrid (ou plus exactement dans le Dataset affiché dans le DBGrid).
Jusque là, chaque saisie de recherche était codée dans les évènements OnChange de chaque TEdit. Le code consistait à :
Désactiver les OnChange des TEdit non concernés, vider leur contenu, réactiver le OnChange et enfin prendre en compte la valeur saisie dans le TEdit en cours pour lancer une recherche sur une colonne dédiée.
Sur une fenêtre pour commencer, j'ai remplacé les TEdit par des TLabeledEdit de façon à supprimer les TLabel associés qui étaient superflus.
Ensuite, j'ai fais une procédure pour généraliser le traitement. En gros, ça donne :
C'est à dire que dans les OnChange, je passe en premier élément du tableau le TLabeledEdit "appelant" et les autres à la suite.
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 procedure TDatamod.Recherche(Table: TTable; NomIndex, NomChamp: string; ZonesS: array of TLabeledEdit); var I: Integer; Evt: TNotifyEvent; begin if (Length(ZonesS) = 0) or NomIndex.IsEmpty or NomChamp.IsEmpty then Exit; if Length(ZonesS) > 1 then for I := Succ(Low(ZonesS)) to High(ZonesS) do with TLabeledEdit(ZonesS[I]) do begin Evt := OnChange; // <---------- ici OnChange = nil :-( OnChange := nil; Text := ''; OnChange := Evt; end; Recherche(Table, NomIndex, NomChamp, ZonesS[0].Text); end;
Et là ça fait une plombe que je m'arrache les cheveux parce que dans le code, l'évènement OnChange est nil alors que c'est justement le OnChange qui a appelé la procédure de recherche.
Je refais le même code mais cette fois avec des TEdit simples et là ça fonctionne parfaitement. Le OnChange est bien assigné.
Le TLabeledEdit est un composant un peu spécial et j'imagine que ça vient de là.
Auriez-vous une idée sur ce OnChange égal à nil dans un cas et pas dans l'autre ?
Partager