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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    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 Expert

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    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 confirmé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    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 confirmé
    Homme Profil pro
    Inscrit en
    Mars 2002
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 76
    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 confirmé
    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 : 62
    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
    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 émérite 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
    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
    (...)

+ 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