Retrouver un composant

Résolu
kinay61 Messages postés 3 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 30 août 2007 - 30 août 2007 à 10:00
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 - 30 août 2007 à 15:31
Bonjour,
J'ai une Form avec des composants TLabel et TLabeledEdit.
Je voudrais sauvegardé dans un fichier la position de ces composants (c'est-à-dire propriété left, top, width et height).
Pour les retrouver, je sais faire
var Tmp : TLabel
begin
    Tmp:=TLabel(findComponent('label1'));
   // et ensuite, j' accède à Tmp.left,....
end;
Mais je souhaiterais faire une boucle pour les retrouver tous sans connaître à l'avance son Type (TLabel, TLabeledEdit,...)

Merci d'avance pour votre aide

5 réponses

Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
30 août 2007 à 11:30
Bonjour,














var i : Integer;
begin
for i := 0 to ComponentCount-1 do
if (Components[i].ClassNameIs('TLabel')
   or (Components[i].ClassNameIs('TLabeledEdit') then begin

       //ici, (Components[i] as TControl).BoundsRect ... etc
       ...

   end;
3
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
30 août 2007 à 11:38
... Ou si tu as bcp de types de composants, tu changes le tag des compos dont tu veux mémoriser la position, et :







var  i : Integer;
begin
for i := 0 to ComponentCount-1 do
  if Components[i].Tag <> 0 then begin...
0
kinay61 Messages postés 3 Date d'inscription mercredi 28 juillet 2004 Statut Membre Dernière intervention 30 août 2007
30 août 2007 à 12:05
Ta première solution fonctionne parfaitement mais pourquoi ne pas faire directement
(Components[i] as TControl).left;
(Components[i] as TControl).right;
(Components[i] as TControl).width;
(Components[i] as TControl).height;
Car avec BoundsRect, je n'ai pas directement Width et height
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
30 août 2007 à 12:18
Avec BoundsRect tu obtiens rapidement et en une seule fois les coordonnées de tous les coins de ton contrôle.


Ensuite, il ne te reste plus qu'à faire :


var  
MyRect : TRect;


begin

MonControle.BoundsRect := MyRect;




Et ton contrôle est placé et dimensionné en une seule fois.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
florenth Messages postés 1023 Date d'inscription dimanche 1 août 2004 Statut Membre Dernière intervention 17 août 2008 3
30 août 2007 à 15:31
Salut !

Au lieu de BoundsRect, tu as SetBounds() et là, tu as tout ce que tu veux sous la main.
D'ailleurs, quand tu fais :

<hr size="2" width="100%" />MonControl.Left := X;
MonControl.Top := Y;
MonControl.Width = W;
MonControl.Height := H;
<hr size="2" width="100%" />Ces 4 lignes vont appeler 4 fois SetBounds(): perte de temps.

Alors qu'il est bien plus simple de faire MonControl.SetBounds(X, Y, W, H);

Sinon, au lieu de comparer les nom des classes, tu peux simplement faire :

for I := 0 to ControlCount - 1 do
  Controls[I].SetBounds(X, Y, W, H).

En effet, Controls[] retient tous les contrôles enfants d'un contrôle parent. C'est justement ce que tu veux, non ?

++

Ressources Delphi, sources, tutoriaux, actu, ...: www.mx-dev.nethttp://te%3C/body
0
Rejoignez-nous