IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

faire référence à un objet externe à la classe


Sujet :

Langage Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut faire référence à un objet externe à la classe
    Salut à tous,

    Je n'arrive pas à trouver la syntaxe adéquate pour déclarer une référence à un objet extérieur à ma classe.
    Mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    TMyFrame = Class (TGraphicControl)
        private
          BmpFond             :TBitmap;
          BmpExt               : ???????
    Pour être précis, dans mon expl j'ai un bitmap qui sera créé avec la classe et qui servira au dessin du fond. Mais en plus j'aimerais utiliser un bitmap extérieur à la classe pour le dessiner par dessus ce fond mais sans le récréer puisqu'il existe deja dans l'appli qui va créer un objet MyFrame.
    En fait j'aimerai juste que MyFrame puisse utiliser un Bitmap dont on ne lui passerait que la référence, comme on assigne par expl un popupmenu à une Form. Je voudrais éviter de récréer un bitmap et d'y assigner un qui existe deja.

    La solution est surement enfantine, mais je n'ai que depuis peu une approche réellement objet dans mon code
    Merci pour votre aide (et votre indulgence...)

  2. #2
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Si j'ai bien compris, un pointeur ferait l'affaire ... Tu déclares ton BmpExt en tant que pointeur sur un TBitMap, et pendant l'execution, tu donnes l'adresse de ton BitMap extérieur à ton TMyFrame.

    Ex:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    TMyFrame = Class (TGraphicControl)
        private
          BmpFond             :TBitmap;
          BmpExt              : ^TBitMap;
    ...
     
    var MyFrame : TMyFrame;
         MonBmpExterieur : TBitMap;
     
    ...
     
    MyFrame := TMyFrame.Create;
    MyFrame.BmpExt:=@MonBmpExterieur;
    Je sais pas si c'est bien ca que tu cherchais

    Bonne chance !

  3. #3
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    merci mick605 pour ta réponse rapide
    je ne l'ai pas testée encore mais je dois avouer que je viens de résoudre mon problème.

    en fait je déclare comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TMyFrame = Class (TGraphicControl)
        private
          BmpFond             :TBitmap;
        public
          BmpExt               : TBitmap;
    puis dans le code de l'appli, apres la création de MyFrame,

    Je ne sais pas pourquoi je me suis mis en tête que si je déclarais une variable TBitmap il fallait forcement passer par un .create.

    La preuve que non.
    Maintenant peut-être que cette façon de faire n'est pas la meilleure ou va me causer du soucis à l'usage.Donc si quelqu'un à un commentaire, je suis preneur.
    Mais pour le coup je pense pas (la honte x 2)

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Voila, je viens d'essayer ta solution, mick605. Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    TMyFrame = Class (TGraphicControl)
        private
          BmpFond             :TBitmap;
        public
          BmpExt              : ^TBitMap;  <-- mis en public pour accès extérieur
    ...
     
    var MyFrame : TMyFrame;
         MonBmpExterieur : TBitMap;
     
    ...
     
    MyFrame := TMyFrame.Create;
    MyFrame.BmpExt:=@MonBmpExterieur;
    Jusque là, compilation ok.
    Mais lorsque je veux utiliser BmpExt dans la procedure de dessin de ma classe, ça coince:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Procedure TMyFrame.Paint;
     
     {dessin du bitmap du fond}
      if BmpFond<>nil then Canvas.Draw(0,0,BmpFond);
     
    {essai dessin du bitmap extérieur}
      Canvas.Draw(20,20,extBmp); '<--Erreur de compilation
    le message d'erreur est le suivant : "aucune version surchargée de Draw ne peut être appelée avec ces arguments".

    J'ai donc tenté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Canvas.Draw(20,20,Tbitmap(extBmp));
    A la compilation, ça passe. A l'execution : plantage grave. Restart Delphi obligé

    J'en reviens donc à ma solution. Mais ça m'embête de n'avoir pas pu mettre la tienne en œuvre.
    Surtout que le fait de pointer un objet me garanti de ne pas dupliquer le bitmap.
    Dans ma solution je n'en suis pas sur à 100%.
    Si quelqu'un peut lever le doute...

  5. #5
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    BmpExt est défini comme un pointeur vers le TBitmap. D'où l'erreur de compilation (il devrait d'ailleurs être nommé PBmpExt ).

    Essaye comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Canvas.Draw(20, 20, BmpExt^);
    @+

  6. #6
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Salut,

    Une propriété doit suffire non ?!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    (...)
    private
      FExtBmp: TBitmap;
    public  
      property ExtBmp: TBitmap read FExtBmp write FExtBmp
    (...)
    Akim Merabet

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Cl@udius,

    merci, ta syntaxe est la bonne et tout s'exécute très bien maintenant
    Tu auras compris que je n'ai pas encore souvent utilisé les pointeurs...

    Kaféine,

    Je ne suis pas sur qu'utiliser une propriété soit si différent, car à un moment donné il faut bien faire le lien vers un objet extérieur au code de ma classe.
    Soit directement comme je le fais en affectant hors classe un bmp extérieur au bmp"intérieur"
    ou par simple référence grâce au pointeur.
    Mais peut-être n'ai-je pas compris ta façon de faire.

    En tout ca, merci à tous pour vos lumières.

    Par contre, et désolé d'insister sur ce point, je ne sais toujours pas si le fait d'utiliser une variable (pas un pointeur, donc) va créer un double du bitmap source
    ou si au contraire, le fait d'écrire "BmpExt:=AnotherBmp" va utiliser AnotherBmp lorsque dans le code de la classe je vais appeler BmpExt...
    C'est juste que je vais généraliser la méthode à d'autres objets et les bitmaps ne seront pas petits,
    donc si j'ai tout en double en mémoire, c'est moyen... Et puis pour le principe

  8. #8
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Salut,

    je voulais dire que cela suffisait...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    TMyFrame = Class (TGraphicControl)
        private
          BmpFond             :TBitmap;
          FBmpExt: TBitmap;
        public
           property BmpExt: TBitmap read FBmpExt write FBmpExt
    ...
     
    var MyFrame : TMyFrame;
         MonBmpExterieur : TBitMap;
     
    ...
     
    MyFrame := TMyFrame.Create;
    MyFrame.BmpExt:=MonBmpExterieur;
    Akim Merabet

  9. #9
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    les objets sont déjà des pointeurs, donc aucune utilité de le déclarer en pointeur.


    si on as :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
      B1, B2 : TBitmap;
    begin
      B1 := TBitmap.Create; (B1 = adresse mémoire)
      B2 := B1; (B2 = adresse mémoire de B1)
      B2.Free; (invalide B1)
    end;

    la meilleure façon de faire étant d'utiliser une propriété :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    type
      TMaClasse = class
      private
        fInnerBitmap : TBitmap;
        fOuterBitmap : TBitmap;
        procedure SetInnerBitmap(value: TBitmap);
      protected
        procedure QuelqueChose;
      public
        property InnerBitmap : TBitmap read fInnerBitmap write SetInnerBitmap;
        property OuterBitmap : TBitmap read fOuterBitmap write fOuterBitmap;
        constructor Create;
      end;
     
    constructor TMaClasse.Create;
    begin
      fInnerBitmap := TBitmap.Create;
      fOuterBitmap := nil;
    end;
     
    procedure TMaClasse.SetInnerBitmap(value: TBitmap);
    begin
      fInnerBitmap.Assign(Value);
    end;
     
    procedure TMaClasse.QuelqueChose;
    begin
      if Assigned(fOuterBitmap) then
        fInnerBitmap.Canvas.Draw(fOuterBitmap);
    end;
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  10. #10
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Kaféine,
    désolé, je n'avais effectivement pas compris

    Dr Who,
    ton premier exemple répond bien à la question de la double utilisation ou non de la mémoire. Merci. Je peux donc écarter l'utilisation des pointeurs.

    Pour ton second code, celui de la classe utilisant une propriété, il répond parfaitement à mon besoin et donne raison au passage à Kaféine.

    Cependant, sachant que ma classe ne servira pas à créer de composant, pourrai-je me contenter de déclarer ma variable public (bmpExt) ,
    de l'affecter hors classe (Myframe.bmpExt:=MonBmpExterieur)
    puis de l'utiliser dans la classe (avec tests "if assigned(bmpExt)") ?
    Ne crois pas que je cherche à utiliser absolument "ma" façon ou à en faire le moins possible par paresse.
    Mais j'essaye de bien intégrer les bases de la poo. Donc si cette méthode n'est pas la bonne, j'aimerais juste comprendre en quoi.

    Encore merci pour votre aide à tous

  11. #11
    Membre éclairé Avatar de Kaféine
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 569
    Points : 736
    Points
    736
    Par défaut
    Citation Envoyé par David Voir le message
    Cependant, sachant que ma classe ne servira pas à créer de composant, pourrai-je me contenter de déclarer ma variable public (bmpExt) ,
    de l'affecter hors classe (Myframe.bmpExt:=MonBmpExterieur)
    puis de l'utiliser dans la classe (avec tests "if assigned(bmpExt)") ?
    Ne crois pas que je cherche à utiliser absolument "ma" façon ou à en faire le moins possible par paresse.
    Mais j'essaye de bien intégrer les bases de la poo. Donc si cette méthode n'est pas la bonne, j'aimerais juste comprendre en quoi.
    Tu peux, mais c'est pas top.
    Les propriétés, à l'instar des Getters/Setters en Java, permettent des contrôles de validité...
    Tu auras de toute façon besoin, enfin il me semble, lors de l'assignation du BmpExt de rafraîchir la frame pour mettre à jour l'affichage.
    Et pour cela, l'emploi d'une propriété est parfait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    type
     TMyFrame = class(TGraphicControl) 
     private
       FBmpExt: TBitmap;
       procedure SetBmpExt(const Value: TBitmap);
     public
       property BmpExt: TBitmap read FBmpExt write SetBmpExt;
     
    (...)
     
    procedure TMyFrame.SetBmpExt(const Value: TBitmap);
    begin
      FBmpExt := Value;
      Invalidate; //<-- rafraichir la frame 
    end;
    Akim Merabet

  12. #12
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    Points : 53
    Points
    53
    Par défaut
    Entre temps j'ai réalisé l'assignation avec une procédure comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    TMyFrame.AssignBmpExt(sourceBmp:Tbitmap);
    begin
      try 
        BmpExt:=sourceBmp;
      except
      end; 
      ...
    end;
    que j'appelle donc depuis l'extérieur en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Frame1.AssignBmpExt(AnotherBmp);
    Ça marche aussi. Mais je pense qu'il est dans mon intérêt de prendre de bonnes habitudes. Je passerai donc par une propriété.
    Merci encore à tous

  13. #13
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    pou info : ton bloc try except ne sert à rien ici ...
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  14. #14
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963
    Par défaut
    c'est le rôle de setter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    private
    ...
    FBmpExt: TBitmap;
    procedure SetBmpExt(B:TBitmap);
        public
           property BmpExt: TBitmap read FBmpExt write SetBmpExt
     
     
    procedure TMyFrame.SetBmpExt(B:TBitmap);
    begin
       if Assigned(B) and (B != FBmpExt) then 
        FBmpExt :=B
    end;


    ..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [POO] faire réfrence à un objet dynamiquement
    Par penguin50 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 14/04/2009, 06h25
  2. Réponses: 2
    Dernier message: 30/12/2006, 13h34
  3. [VB6] faire référence à un objet situé sur un autre form
    Par coyott dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 15/05/2006, 15h13
  4. Référence à un objet existant depuis une classe
    Par Adrenalys dans le forum ASP
    Réponses: 2
    Dernier message: 21/07/2005, 00h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo