XE Tokyo Erreur de transtypage

Messages postés
17
Date d'inscription
mardi 6 avril 2004
Dernière intervention
4 novembre 2018
- 2 nov. 2018 à 11:51 - Dernière réponse :
Messages postés
17
Date d'inscription
mardi 6 avril 2004
Dernière intervention
4 novembre 2018
- 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

Afficher la suite 

Votre réponse

5 réponses

Messages postés
83
Date d'inscription
mardi 25 février 2003
Dernière intervention
4 novembre 2018
Modifié par jordane45 le 3/11/2018 à 22:38
0
Merci
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
Messages postés
17
Date d'inscription
mardi 6 avril 2004
Dernière intervention
4 novembre 2018
- 3 nov. 2018 à 18:37
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
Messages postés
83
Date d'inscription
mardi 25 février 2003
Dernière intervention
4 novembre 2018
- 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.
Messages postés
83
Date d'inscription
mardi 25 février 2003
Dernière intervention
4 novembre 2018
- 4 nov. 2018 à 07:18
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

Messages postés
17
Date d'inscription
mardi 6 avril 2004
Dernière intervention
4 novembre 2018
- 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.
Commenter la réponse de hoby500

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.