Pb Référence With [Résolu]

Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
- - Dernière réponse : cs_Jean_Jean
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
- 18 déc. 2007 à 07:45
 Bonjour à tous,

Voilà, j'ai trouvé une bizarerie avec le référencement de With. Bien que j'ai contourné le problème en n'utilisant pas cette instruction, j'aime bien comprendre le pourquoi. Si qlq a une idée!!

J'ai des panels créés dynamiquement que je charge dans un tableau de Panel CurActivite. Je change la couleur du Panel concerné par la classique instruction qui fonctionne :
    CurActivite[NumActivite].Color := TPanel(FindComponent('Panel'+IntToStr(NumSelect))).Color;

Mais comme j'ai d'autres réglages à effectuer sur les Panels du Tableau, j'utilise With et là ça plante à l'exécution :
Message d'erreur "...accès violation at xxx : read of adress..."

With CurActivite[NumActivite] do
 begin
     Color   : = TPanel(FindComponent('Panel'+IntToStr(NumSelect+17))).Color;
     ...
 end;

Merci!

Jean_Jean
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
Messages postés
4229
Date d'inscription
vendredi 23 juillet 2004
Dernière intervention
3 août 2018
3
Merci
Salut,

tu t'y prends mal

il faut faire :

With TPanel(FindComponent('Panel' + IntToStr(NumSelect + 17))) do
Begin
  CurActivite[NumActivite].Color := Color;

  CurActivite[NumActivite].Width := Width;

End;

 
@+
Cirec

<hr siz="" />

Dire « Merci » 3

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

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

Commenter la réponse de Cirec
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
3
Merci
With CurActivite[NumActivite] do
begin
  Color    //color de



CurActivite[]





  :=
  TPanel(
    FindComponent( //findcomponent est appelé sur







CurActivite[] !!!




=> nil

      'Panel'+IntToStr(NumSelect+17)
    )
  )
  .Color; //nil.color = ?
      
     ...
 end;



tu peux palier le probleme en faisant comme ca :

With CurActivite[NumActivite] do
 begin
     Color   := TPanel(Self.FindComponent('Panel'+IntToStr(NumSelect+17))).Color;
     ...
 end;

Dire « Merci » 3

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

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

Commenter la réponse de Guillemouze
Messages postés
1799
Date d'inscription
vendredi 27 décembre 2002
Dernière intervention
19 juillet 2018
3
Merci
Bien vu, Guillemouze.

En effet, ça fonctionne aussi comme ça :

var
  AColor: TColor;

AColor := TPanel(FindComponent('Panel'+IntToStr(NumSelect+17))).Color;

with CurActivite[NumActivite] do
begin  
  Color := AColor;
  // ...
end;

Dire « Merci » 3

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

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

Commenter la réponse de japee
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Dernière intervention
9 mars 2018
3
Merci
function AssignProp(src, dest : TPanel): boolean;
begin
  result := assigned(src) and assigned(dest);
  if not result then
    exit;

  dest.color := src.color;
  dest.width := src.width;
  // dest.      := src. ;
end;

...
var P1, P2 : TPanel;
begin
  P1 := CurActivite[NumActivite];
  P2 := TPanel(FindComponent('Panel'+IntToStr(NumSelect+17))); // <== BEURK!!

  AssignProp(P1, P2);
end;

<hr size="2" width="100%" />
http://deefaze.gnomz.com

Dire « Merci » 3

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

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

Commenter la réponse de f0xi
Messages postés
900
Date d'inscription
vendredi 3 novembre 2000
Dernière intervention
30 juillet 2009
3
Merci
salut,

un conseil en passant,

comme tu crée tes TPanel dynamiquement, pourquoi ne pas garder une référence dans un Tcomponentlist? cela t'éviterais d'avoir à utiliser le findcomponent qui est très loin d'être permformant...

aussi, suivant comment et pourquoi tu génére tes panels dynamiquement, tu peux garder la réf du panel dans l'object qui l'as généré (cad l'objet qui est réprésenté par le panel).

bon code!

Loda
<hr size="2" width="100%" />Se poser les bonnes questions est le premier pas pour trouver les bonnes réponses.

Dire « Merci » 3

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

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

Commenter la réponse de cs_Loda
Messages postés
1015
Date d'inscription
samedi 25 octobre 2003
Dernière intervention
29 août 2013
0
Merci
merci jappe ;)

Attention notez bien ce qui va suivre, je vais pas le dire souvent :
C'est un avantage
de VB su Delphi, en VB, il faut prefixer d'un point les elements du with. par exemple :
with monpanel do
  .Color := findcomponent

"." devant color => color du with
pas de "." devant le findcomponent => methode de l'objet implicite (self?)

 
Commenter la réponse de Guillemouze
Messages postés
2684
Date d'inscription
jeudi 15 janvier 2004
Dernière intervention
26 juillet 2018
0
Merci
Salut,

Moi, j'aime pas le "with" car je trouve que ça rend souvent le code moins lisible.
Je l'emploie quand ça évite une variable locale, et encore!
Commenter la réponse de Caribensila
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
0
Merci
Merci à tous!

@Cirec, bien vu! J'avais effectivemlent inversé, Mdr, c'est quand même pas Alzheimer!
@ Guillemouze : intéressant la référence à self
@ Japee : toujours pour la simplification de lecture! Tu devrais écrire un bouquin pour débutant
@ Cari : Qd même ds certains cas, ça allège! Mais j'ai remarqué aussi que dans d'autres effectivement on ne sait plus à qui appartient la propriété!
Bien à vous!

Jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
0
Merci
Bon je refais un essai de commentaire.

Jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
0
Merci
Ah, ça y est!
J'avais un problème avec mon éditeur.
Merci donc Foxi pour ce code très intéressant et simplificateur d'écriture de la série FindComponent...
A+
Jean_Jean
Commenter la réponse de cs_Jean_Jean
Messages postés
641
Date d'inscription
dimanche 13 août 2006
Dernière intervention
13 décembre 2018
0
Merci
Merci Loda pou ta suggestion!
Je ne connaissais pas ce composant!

Tu veux dire une phrase du genre :
if Components[i] Is TPanel then TPanel(Components[i]).Color:=ClWhite;
Mais justement, je voulais éviter les boucles pour identifier le composant recherché.

j'ai trouvé un code de Delphiprog qui semble s'approcher de ce que tu préconise.
http://www.delphifr.com/codes/UTILISER-TOBJECTLIST_12266.aspx
ou peut-être celui de caribensila
http://www.delphifr.com/codes/COMPOSANT-DYNAMIQUE-COMMENT-CODER-COMPOS-NON-ENCORE-CREE_37127.aspx
J'étudierai cela un peu plus tard. si cela doit me faire gagner du code et de la lisibilité, je suis partant.
je fais référence à mes TPanels dans tous les sens :
 changement de propriété, clic, déplacement drag and drop ...

Jean_Jean
Commenter la réponse de cs_Jean_Jean

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.