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

Signaler
Messages postés
9
Date d'inscription
vendredi 26 février 2010
Statut
Membre
Dernière intervention
1 mars 2011
-
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
-
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.

6 réponses

Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
14
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
Messages postés
9
Date d'inscription
vendredi 26 février 2010
Statut
Membre
Dernière intervention
1 mars 2011

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.
Messages postés
9
Date d'inscription
vendredi 26 février 2010
Statut
Membre
Dernière intervention
1 mars 2011

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 !
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
13
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
Messages postés
2527
Date d'inscription
jeudi 15 janvier 2004
Statut
Membre
Dernière intervention
16 octobre 2019
14
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
Messages postés
4715
Date d'inscription
dimanche 26 février 2006
Statut
Modérateur
Dernière intervention
27 mars 2018
13
Caribensila , le taggeur fou !

cantador