Accéder à un composant dans un TPanel [Résolu]

Messages postés
9
Date d'inscription
vendredi 26 février 2010
Dernière intervention
1 mars 2011
- - Dernière réponse : cs_cantador
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
- 24 févr. 2011 à 16:29
Bonjour à tous et toutes,

Tout d'abord, j'ai fait quelques recherches, et je n'ai pas trouvé de sujet m'ayant aidé sur mon questionnement actuel. Je tiens donc à m'excuser d'avance si j'ai raté un sujet similaire.

Alors voici mon problème :

J'ai actuellement dans mon programme que je developpe avec Delphi, plusieurs TPanel.
Ils sont composés de la manière suivante :



Sur chaque Panel présent sur ma fiche, j'y ai donc 3 labels et une image.
Le label num_ a pour Caption le numéro que je souhaite récupérer.

Je gère un évènement DragOver de chaque panel de cette manière :

procedure TFrm_Principal.fond_panini1DragOver(Sender, Source: TObject; X,
Y: Integer; State: TDragState; var Accept: Boolean);
begin
If (Sender is TLabel) then
begin
If ((Sender as TLabel).Parent is TPanel) then
Accept := true;
end;
If (Sender is TImage) then
begin
If ((Sender as TImage).Parent is TPanel) then
Accept := true;
end;
end;


L'image et les panels sont générateurs de cet évènement car ils superposent totalement le panel. Difficile à expliquer, mais là n'est pas le problème, jusque là ça va...
Mais voilà !

Je veux à présent gérer le DragDrop et c'est ainsi que j'ai procédé.

procedure TFrm_Principal.fond_panini1DragDrop(Sender, Source: TObject; X,
Y: Integer);

var numCase : integer;

[...]
If (Source is TLabel) then
begin
If ((Source as TLabel).Parent is TPanel) then
numCase := strtoint((((Source as TLabel).Parent as TPanel).Components[4] as TLabel).Caption);
end;
[...]


Mon problème c'est que Component, j'ai présumé que c'était les composants, car je ne suis pas super fort avec Delphi. J'aimerais donc atteindre le 4ème composant dans mon Panel, puisque tous mes panels se composent de la même façon. Et le 4ème est TOUJOURS le label donc je veux le caption.


En espérant que vous m'avez compris ! Sinon je suis à votre disposition pour plus de renseignements si je me suis vraiment mal exprimé.
Un grand merci d'avance à tous ceux qui pourront m'apporter leur aide !

Aurel.
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
3
Merci
Salut,

Je n'ai pas très bien compris ce que tu voulais faire.
Mais tu dois utiliser TControl (classe de base de tous les composants visibles lors de l'exécution).
Et le 4ème controls enfant a l'indice[3] (en Delphi, les tableaux commencent presque toujours à l'indice[0]).

Donc :

... ((Source as TLabel).Parent as TPanel). Controls[3] ...

_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 105 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Caribensila
Messages postés
9
Date d'inscription
vendredi 26 février 2010
Dernière intervention
1 mars 2011
0
Merci
Désolé pour le doublon mais suite à plusieurs tests, j'ai remarqué que :

MessageDlg(inttostr((((Source as TImage).Parent as TPanel).ComponentCount)),mtInformation,[mbOk],0);

me retourne 0.

et

MessageDlg(inttostr((((Source as TImage).Parent as TPanel).Name)),mtInformation,[mbOk],0);

me retourne bien le bon nom de composant.

Déduction = Les composants à l'intérieur du TPanel ne sont pas comptés comme étant des composants "fils" de ce panel.
La question persiste, quelle propriété faut-il donc utiliser pour "rezoomé" à l'intérieur de ce panel. Pardonnez moi là métaphore ^^

Autre question qui me vient en même temps : Comme l'image est dans mon Panel, je regarde quel est le panel parent pour ensuite accéder au composant label dans ce même panel ( donc par transitivité le panel de mon image ).
Mais apparemment il est impossible d'accéder à un composant d'un composant parent, sauf s'il s'agit de la fiche?


Pas très français tout ça, comprendront qui pourront ! ;)

Encore merci d'avance,
A bientôt !
Je continue mes recherches.
Commenter la réponse de Dpx26000
Messages postés
9
Date d'inscription
vendredi 26 février 2010
Dernière intervention
1 mars 2011
0
Merci
C'est vrai que c'est pas facile à comprendre si on a pas les composants sous les yeux, c'est un peu tiré par les cheveux, mais vous avez parfaitement compris ma question et ça marche !

Ainsi pour accéder au parent d'un composant c'est : .Parent
Pour accéder à un composant enfant de ce composant c'est : .Controls

Un grand merci à vous Caribensila!!
A bientôt !
Commenter la réponse de Dpx26000
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
Bonjour,

components[i] ->> TForm
controls[i] ->>> TPanel ou autre conteneur

Attention néanmoins à ne pas désigner un composant par son indice..(risque de confusion..surtout en cas de modif)
Le chercher avec une boucle ou FindComponent en détectant sa classe ou
son nom

cantador
Commenter la réponse de cs_cantador
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
La remarque de Cantador est très juste.

Tu peux aussi utiliser le Tag du composant.
Tous les compos ont une propriété Tag fournie pour les besoins particuliers des développeurs.


_______________________________________
Soutenez Wikimédia France aujourd'hui : http://dons.wikimedia.fr
Commenter la réponse de Caribensila
Messages postés
4996
Date d'inscription
dimanche 26 février 2006
Dernière intervention
27 mars 2018
0
Merci
Caribensila , le taggeur fou !

cantador
Commenter la réponse de cs_cantador

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.