XE Tokyo Erreur de transtypage

dc46 Messages postés 20 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 7 juillet 2022 - Modifié le 3 nov. 2018 à 22:38
dc46 Messages postés 20 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 7 juillet 2022 - 4 nov. 2018 à 08:22
Bonjour.
Je porte une application développé en Delphi 5 vers la version 10.2.
c := frmMain.gbChangeur.Controls[Box] as Tlabel;

Sachant que c est une variable déclaré TLabel, que frmMain est une TForm , que gbChangeur est un TGroupbox qui contient divers composant dont des labels.
Pas de problème à la compilation mais erreur d'exécution EInvalidCast.
J'attend donc une idée voir une solution.
Merci à tous.

EDIT : Ajout des balises de code

1 réponse

hoby500 Messages postés 86 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 26 mai 2019
Modifié le 3 nov. 2018 à 22:38
Justement la réponse est évidente :
TGroupbox qui contient divers composants dont des labels.

Donc il faudrait un test avant de caster le composant :
if frmMain.gbChangeur.Controls[Box] is Tlabel then
c := frmMain.gbChangeur.Controls[Box] as Tlabel;  


EDIT : Ajout des balises de code

sinon vous prendriez un Tbutton pour un tLABEL par exemple
0
dc46 Messages postés 20 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 7 juillet 2022
Modifié le 3 nov. 2018 à 22:38
Bonjour et merci de vous pencher sur mon problème.
Je comprend parfaitement votre raisonnement, mais ce qui me dérange le plus c'est que l'application développé en Delphi 5 fonctionne parfaitement avec le code tel que le l'ai écrit sachant que le groupbox ne contient pas que des labels.
Je ferais un test avec votre proposition, mais en attendant un avis j'ai modifier cette séquence par la séquence suivante :

c := TLabel(frmMain.FindComponent('capT' + IntToStr(Box)));

D'autant plus intéressant que je suis sur de m'adresser au bon Label alors qu'avec Controls[Box] je ne savait pas forcément comment étais indexé ma série de Label.
Dans l'ancienne version j'avais du créer mes labels dans l'ordre avant d'ajouter d'autre composants ce qui fais que mon label 'capT1' correspondait bien à Controls[1] et ainsi de suite.
Encore Mille Merci

EDIT : Ajout des balises de code
0
hoby500 Messages postés 86 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 26 mai 2019
4 nov. 2018 à 00:31
Je pense que DELPHI 5 compilait en mode "SANS vérification des types"
donc ca passait à la compilation
et je me demande s'il ne tolérait pas le transtypage lors de l'exécution.
0
hoby500 Messages postés 86 Date d'inscription mardi 25 février 2003 Statut Membre Dernière intervention 26 mai 2019
Modifié le 4 nov. 2018 à 08:29
En attendant votre solution peut être optimisée :
c := TLabel(frmMain.gbChangeur.FindComponent('capT' + IntToStr(Box)));

afin de parcourir les enfants de gbChangeur
et pas ceux de la fiche

EDIT : Ajout des balises de code

0
dc46 Messages postés 20 Date d'inscription mardi 6 avril 2004 Statut Membre Dernière intervention 7 juillet 2022
4 nov. 2018 à 08:22
Bonjour hoby500
J'ai testé l'écriture de ta première réponse qui effectivement évite l'exception de cast que j'avais. Mais vu la chronologie de création des composants c'était le souk.
Sur ta dernière proposition d'optimisation je peux en revanche te dire que ce ne sera pas accepté par le système du fait que la fonction 'FindComponent' ne peux s'appliquer que sur une 'Form' (dixit documentation Embarcadero).
Merci et bon dimanche.
0
Rejoignez-nous