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

Composants VCL Delphi Discussion :

dessiner dans le canevas d'un composant


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut dessiner dans le canevas d'un composant
    Bonjour,

    Je voudrais ajouter à une analyse de ventes tabulaire un graphe démonstratif et pour cela, j'ai essayé d'utilisé le canvas d'un Tpaintbox mais le schéma disparaît aussitôt crée, et c'est la même chose dans le canevas d'un Tlabel.

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    le canvas est à l'écran ce que le crayon est au papier.

    avec TPaintBox il faut utiliser le canvas dans l'évènement OnPaint, et l'image sera redessinée à chaque fois que nécessaire.

    pour conserver le dessin, il faut utiliser le canvas d'un Bitmap et placer ce bitmap dans un TImage par exemple, dès lors le dessin devient persistant puisqu'il a été "imprimé" dans le Bitmap qui en garde le résultat en mémoire.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,
    avec TPaintBox il faut utiliser le canvas dans l’événement OnPaint, et l'image sera redessinée à chaque fois que nécessaire.
    ça ce n'est pas efficace parceque j'utilise le canvas pour créer un graphe on se basant sur le résultat d'une requête sql, et si je met la requête dans le onpaint alors là le nbre de fois ou le onpaint est appelé!

    par contre

    pour conserver le dessin, il faut utiliser le canvas d'un Bitmap et placer ce bitmap dans un TImage par exemple, dès lors le dessin devient persistant puisqu'il a été "imprimé" dans le Bitmap qui en garde le résultat en mémoire.
    là c'est intéressant, maintenant je vai voir si on peut dessiner sur le canevas d'un Timage vide.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Il faut regarder le code des samples Embarcadero (moi j'ai Xe ) comme TGauge pour voir comment il faut faire.
    Vcl.Samples.Gauges.TGauge

    Il faut créer des TBitmap (en fonction des états par exemple) et les flush-er dans le OnPaint.

    Moi j'ai testé et je ne suis arrivé à rien 1) Les primitives TCanvas restent trop lentes et le temps de création était assez conséquent 2) La gestion mémoire n'est pas terrible parce qu'il faut se trimballer des TBitmaps (création, initialisation et destruction, je travaille en C++)


    Je suis passé à la bibliothèque TBitmap32 et avec un peu de temps je n'ai plus eu de problème

  5. #5
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par chekkal Voir le message
    Bonjour,


    ça ce n'est pas efficace parceque j'utilise le canvas pour créer un graphe on se basant sur le résultat d'une requête sql, et si je met la requête dans le onpaint alors là le nbre de fois ou le onpaint est appelé!

    par contre


    là c'est intéressant, maintenant je vai voir si on peut dessiner sur le canevas d'un Timage vide.
    non, un TImage vide n'a pas de conteneur, si tu veux calculer ton image et la conserver, il faut la mettre dans un Bitmap
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    var
      b: TBitmap;
    begin
      b := TBitmap.Create;
      b.SetSize(Width, Height);
      with b.Canvas do
      begin
        ...
      end;
    end;
    ensuite cette image peut être dessiner sur la fiche à la demande (ou sur un TPaintBox qui n'est qu'une sous-zone de son parent)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure TForm1.OnPaint(Sender: TObject);
    begin
      Canvas.Draw(x, y, b); // évidement le Bitmap doit être déclaré dans la partie private de la fiche, créé dans le OnCreate, détruit dans le OnDestroy et rafraîchit à la demande
    end;
    on simplement placée dans un TImage qui se charger de l'afficher.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2010
    Messages
    945
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2010
    Messages : 945
    Points : 123
    Points
    123
    Par défaut
    Bonjour,

    J'ai modifier le code de cette manière
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    procedure Tform1.button1click(sender);
    var
        img:Tbitmap;
    begin
            img:=tbitmap.create;
            /// execution du code sql
             ////dessiné dans le canevas du bitmap
          img.savetofile('grapghe.bmp');
          gra.picture.loadfromfile('graphe.bmp');
     
     
    end;
    et ça marche mais un autre problème se pose , mais je vai l'exposer dans une autre discussion

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    ça sent quand même la fuite mémoire cette affaire !
    et pourquoi ne pas utiliser un stream plutôt qu'un fichier sauvegardé sur disque ?
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre chevronné

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Points : 1 884
    Points
    1 884
    Par défaut
    Bonjour à tous.

    ça sent quand même la fuite mémoire cette affaire !
    Evidemment, puisque le bitmap est créé, mais pas libéré (Img.Free).

    Et pourquoi faire compliqué quand on peut faire simple ?
    Pas besoin de sauver dans un fichier ou un stream.
    Simplement dessiner le bitmap sur le Canvas du TImage. Il faut savoir que, dans un TImage, toute modification de son Canvas est "mémorisée" dans un Bitmap.

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      MyBitmap: TBitmap;
    begin
      MyBitmap:= TBitmap.Create;
      try
         MyBitmap.SetSize(Image1.width, Image1.height);
         // exemple de dessin sur le bitmap
         with MyBitmap do
         begin
            Canvas.Brush.Color:= clYellow;
            Canvas.Rectangle(0,0,Width,Height);
         end;
         // affection au TImage
         Image1.Canvas.Draw(0,0,MyBitmap);
      finally
         MyBitmap.Free;
      end;
    end;
    Cordialement
    Thierry

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Pas besoin de sauver dans un fichier ou un stream.
    Oui aussi, c'est vrai en fait j'étais resté sur le loadfromfile d'où ma proposition de stream
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Commander au clavier un dessin dans un canevas
    Par cal23 dans le forum Tkinter
    Réponses: 10
    Dernier message: 19/01/2015, 20h37
  2. Réponses: 13
    Dernier message: 15/11/2014, 11h54
  3. Réponses: 4
    Dernier message: 10/09/2006, 19h06
  4. Dessin ne s'affiche pas dans le canevas
    Par Nadjib dans le forum Langage
    Réponses: 3
    Dernier message: 24/03/2006, 21h08
  5. Texte dans un canevas
    Par Bernard M dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2002, 17h56

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