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

cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 14 déc. 2007 à 18:46 - Dernière réponse : cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention
- 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
Cirec 4231 Messages postés vendredi 23 juillet 2004Date d'inscription 3 août 2018 Dernière intervention - 14 déc. 2007 à 19:07
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="" />

Merci Cirec 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de Cirec
Meilleure réponse
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 14 déc. 2007 à 20:15
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;

Merci Guillemouze 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de Guillemouze
Meilleure réponse
japee 1799 Messages postés vendredi 27 décembre 2002Date d'inscription 19 juillet 2018 Dernière intervention - 14 déc. 2007 à 20:39
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;

Merci japee 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de japee
Meilleure réponse
f0xi 4304 Messages postés samedi 16 octobre 2004Date d'inscription 9 mars 2018 Dernière intervention - 14 déc. 2007 à 23:39
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

Merci f0xi 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de f0xi
Meilleure réponse
cs_Loda 900 Messages postés vendredi 3 novembre 2000Date d'inscription 30 juillet 2009 Dernière intervention - 16 déc. 2007 à 23:27
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.

Merci cs_Loda 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 89 internautes ce mois-ci

Commenter la réponse de cs_Loda
Guillemouze 1015 Messages postés samedi 25 octobre 2003Date d'inscription 29 août 2013 Dernière intervention - 14 déc. 2007 à 20:48
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
Caribensila 2684 Messages postés jeudi 15 janvier 2004Date d'inscription 26 juillet 2018 Dernière intervention - 14 déc. 2007 à 21:25
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
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 14 déc. 2007 à 22:08
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
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 16 déc. 2007 à 11:24
0
Merci
Bon je refais un essai de commentaire.

Jean_Jean
Commenter la réponse de cs_Jean_Jean
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 16 déc. 2007 à 11:26
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
cs_Jean_Jean 639 Messages postés dimanche 13 août 2006Date d'inscription 5 mai 2016 Dernière intervention - 18 déc. 2007 à 07:45
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.