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

C# Discussion :

Accesseur et appel methode statique


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Accesseur et appel methode statique
    Bonjour

    Je me gratte les neurones sur un concept que je dois encore consolider

    J'ai une petite classe qui doit me servir a positionner des texte dans une image

    Les elements fondamentaux de cette classe sont donc

    1- Le texte
    2- L'image du texte
    3- Le font utilisé

    J'aimerais dans l'accesseur du texte ou du font reconstruire l'image

    Je vais donc depuis ces accesseur appeler une methode qui utilisera le texte et le font pour construire l'image

    Mais cette methode est evidement lourde
    a) Usage d'un graphics
    b) Usage d'un brush
    etc.

    La question est donc OU et Comment declarer cette methode proprement afin qu'elle ne se repande pas dans l'app si j'instancie 200 classe texte par exemple

    Merci de vos conseils

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Je comprends pas bien ton histoire... une méthode, ce n'est pas une donnée (un champ), ce n'est pas dupliqué pour chaque instance...
    D'ailleurs je comprends pas bien comment tu comptes utiliser ta classe. Tu en crées une instance pour chaque texte à écrire sur l'image ? Poste un bout de code pour fixer les idées...

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Je comprends pas bien ton histoire... une méthode, ce n'est pas une donnée (un champ), ce n'est pas dupliqué pour chaque instance...
    A bon !
    J'etais persuadé que toutes les methodes d'une classes etaient dupliquées a chaque instance (un peu comme les methodes d'une lib non déclarées statiques)

    Voici le code de la classe (c'est encore un proto, il manque des enums et des commentaires)

    Effectivement a chaque texte j'instancie une nouvelle classe pour composer une liste

    Grace a toi je viens de remplacer le TextRenderer

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Mapscope.BcTools;
    using System.Drawing;
    using System.Windows.Forms;
     
    namespace TestFloatingText
    {
     
      public class C_PrintObj
      {
        static Font _defaultFont = new Font("Arial", 10);
        static Color _defaultTxtColor = Color.Black;
        static Color _defaultBackColor = Color.Beige;
    //    static Bitmap bmp = new Bitmap(16, 16);
    //    static Graphics StaticG = Graphics.FromImage(bmp);
     
        public C_PrintObj()
        {
          this.Fnt = FontSerializable.FromFont(_defaultFont);
          this.TextColor = ColorSerializable.FromColor(_defaultTxtColor);
          this.BackColor = ColorSerializable.FromColor(_defaultBackColor);
        }
     
        public C_PrintObj(Font TxtFnt,Color FntColor,Color BackColor) 
        {
          this.Fnt = FontSerializable.FromFont(TxtFnt);
          this.TextColor = ColorSerializable.FromColor(FntColor);
          this.BackColor = ColorSerializable.FromColor(BackColor);
        }
     
        public int TP;    // 0=bitmap 2=txt
        public string Country;                  // Quel Country
        public string LayerID;                  // Quel layer
        public string Code { get; set; }           // Quel code externe
        public UInt32 ID { get; set; }           // Code Interne si possible
        private string _text;                    // Texte a afficher
        public ColorSerializable TextColor;     // Couleur texte
        public ColorSerializable BackColor;     // Couleur fond
        public int BackAlpha;                   // Alpha channel Couleur fond
        public FontSerializable Fnt;            // Font Texte
        public PointF MapPosition;
        public Point PagePosition;
        public Rectangle Bounds;
        public Bitmap Bmp;
        public bool DrawBorder;
        /// <summary>
        /// Indique si l'element est activé pour déplacement et ne fera pas partie du fond statique
        /// UN SEUL par liste
        /// </summary>
        public bool Moving;
        public string Text
        {
          get
          {
            return _text;
          }
          set
          {
            _text = value;
            if ((this.TP == 0) && (_text != string.Empty))
            {
              this.Bmp = ToImage(value, this.Fnt.ToFont(), TextColor.ToColor(), BackColor.ToColor());
              this.Bounds = new Rectangle(0, 0, Bmp.Width, Bmp.Height);
            }
          }
        }
        // ***************************************************************************************
        private static Bitmap ToImage(string curStr, Font font, Color color, Color BackColor)
        {
          StringFormat format = new StringFormat();
          SolidBrush LgdBrush = new SolidBrush(color);
          format.Alignment = StringAlignment.Center;
          SizeF szTxt = TextRenderer.MeasureText(curStr, font);
          // +2 pour cadre eventuel
          Bitmap bmpTxt = new Bitmap((int)szTxt.Width + 2, (int)szTxt.Height + 2);
          Graphics txtG = Graphics.FromImage(bmpTxt);
          RectangleF cellarea = new RectangleF(0, 0, szTxt.Width, szTxt.Height);
          SolidBrush BackColorBr = new SolidBrush(Color.FromArgb(255, BackColor));
          txtG.FillRectangle(BackColorBr, cellarea);
          txtG.DrawString(curStr, font, LgdBrush, cellarea, format);
          return bmpTxt;
        }
     
        class PrSettings
        {
        }
      }
    }

  4. #4
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut Color et Font Serializable
    Pour le meme prix je t'envoie les Classes ColoSerializable et FontSerializable

    (ca peut servir avec un XmlSerializer

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tiens, c'est marrant, j'aurais pas généré la méthode dans le set de la propriété Text... J'aurais plutôt défini Bmp et Bounds comme des propriétés, dont le get génère la donnée voulue en lazy loading. Un truc comme ça :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
        private Bitmap _bmp = null;
     
        public Bitmap Bmp
        {
            get
            {
                if (_bmp == null)
                {
                    _bmp = ToImage(_text, this.Fnt.ToFont(), TextColor.ToColor(), BackColor.ToColor());
                }
                return _bmp;
            }
        }
     
        private Rectangle _bounds = Rectangle.Empty;
     
        public Rectangle Bounds
        {
            get
            {
                if (_bounds.IsEmpty())
                {
                    _bounds = new Rectangle(0, 0, Bmp.Width, Bmp.Height);
                }
                return _bounds;
            }
        }
     
        public string Text
        {
          get
          {
            return _text;
          }
          set
          {
            _text = value;
            // Le texte a changé, on reset Bmp et Bounds
            _bmp = null;
            _bounds = Rectangle.Empty;
          }
        }
    J'etais persuadé que toutes les methodes d'une classes etaient dupliquées a chaque instance (un peu comme les methodes d'une lib non déclarées statiques)
    Les seuls membres de la classe qui sont dupliqués pour chaque instance sont les champs. Tout le reste, ce n'est pas des données, mais du code, donc ça ne servirait à rien de le dupliquer...

    Donc pour répondre à ta question initiale, pas d'inquiétude à avoir, tu peux laisser ta méthode comme membre d'instance comme tu as fait

  6. #6
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Salut Tomlev

    A mon avis ta maniere de faire, certainement bonne n'est peut etre pas la meilleure dans mon cas

    Le but in fine etant de pouvoir deplacer et positionner une collection d'image sur un fond. Si je fais comme tu dis chaque move implique d'abord la reconstruction de l'image du texte avant le traitement externe pour le positionnement de cette image sur le fond, c'est donc plus lourd

    ERREUR : -1 pour moi j'avais pas capté to Lazy loading ! (mais pratiquement ca change pas grand chose dans le contexte)

    Une alternative serait de faire une methode publique DrawObj a ma classe a laquelle je devrais alors passer le graphics utilisé (à reflechir)

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

Discussions similaires

  1. namespace VS methodes statiques
    Par olive_le_malin dans le forum C++
    Réponses: 5
    Dernier message: 16/03/2007, 14h14
  2. Réponses: 2
    Dernier message: 02/05/2006, 14h34
  3. Methodes statiques
    Par romeo9423 dans le forum C++
    Réponses: 3
    Dernier message: 01/02/2006, 11h30
  4. [Singleton] difference singleton classe avec methodes statiques
    Par matN59 dans le forum Design Patterns
    Réponses: 6
    Dernier message: 15/01/2006, 11h04
  5. [C#][WebServices] Appel methode avec une classe en paramètre
    Par bran_noz dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/09/2004, 16h41

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