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

Dpx26000 9 Messages postés vendredi 26 février 2010Date d'inscription 1 mars 2011 Dernière intervention - 23 févr. 2011 à 17:09 - Dernière réponse : cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention
- 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 

6 réponses

Répondre au sujet
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 23 févr. 2011 à 18:31
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Caribensila
Dpx26000 9 Messages postés vendredi 26 février 2010Date d'inscription 1 mars 2011 Dernière intervention - 23 févr. 2011 à 17:57
0
Utile
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
Dpx26000 9 Messages postés vendredi 26 février 2010Date d'inscription 1 mars 2011 Dernière intervention - 24 févr. 2011 à 08:04
0
Utile
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 24 févr. 2011 à 14:31
0
Utile
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
Caribensila 2671 Messages postés jeudi 15 janvier 2004Date d'inscription 18 janvier 2018 Dernière intervention - 24 févr. 2011 à 14:43
0
Utile
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
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 24 févr. 2011 à 16:29
0
Utile
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.