Pb Référence With

Résolu
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 - 14 déc. 2007 à 18:46
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 - 16 déc. 2007 à 23:27
 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

10 réponses

Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
14 déc. 2007 à 19:07
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="" />
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
14 déc. 2007 à 20:15
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;
3
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
14 déc. 2007 à 20:39
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;
3
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
14 déc. 2007 à 23:39
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
3

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

Posez votre question
cs_Loda Messages postés 814 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 30 juillet 2009 3
16 déc. 2007 à 23:27
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.
3
Guillemouze Messages postés 991 Date d'inscription samedi 25 octobre 2003 Statut Membre Dernière intervention 29 août 2013 6
14 déc. 2007 à 20:48
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?)

 
0
Caribensila Messages postés 2527 Date d'inscription jeudi 15 janvier 2004 Statut Membre Dernière intervention 16 octobre 2019 18
14 déc. 2007 à 21:25
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!
0
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
14 déc. 2007 à 22:08
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
0
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
16 déc. 2007 à 11:24
Bon je refais un essai de commentaire.

Jean_Jean
0
cs_Jean_Jean Messages postés 615 Date d'inscription dimanche 13 août 2006 Statut Membre Dernière intervention 13 décembre 2018 3
16 déc. 2007 à 11:26
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
0
Rejoignez-nous