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 :

Composant avec un TCanvas pour dessiner


Sujet :

Composants VCL Delphi

  1. #1
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut Composant avec un TCanvas pour dessiner
    Bonjour à tous,

    j'ai un petit problème: je recherche un composant de type panneau, dans lequel je puisse dessiner et remplir des formes géomètriques simples.

    Je sais que cela passera par l'utilisation de TCanvas, mais cette classe ne semble pas faîtes pour être utilisée directement.

    En fin de compte, je cherche un équivalent au JPanel de java.


    J'ai regardé les TPanel, mais il me semble qu'ils ne possèdent pas de propriété de type TCanvas...

    Une idée ?

    merci

  2. #2
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Je viens de remarquer que TLabel possède une propriété TCanvas !

    faute de mieux, je vais me servir de ça, mais si quelqu'un a une meilleure idée, je prend volontier

  3. #3
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    En fonction de ce que tu veux faire, à vrai dire de si tu veux que ce que tu dessines soit persistant ou pas, tu peux utiliser TPaintBox qui est fait exprès pour ce que tu veux faire je crois, ou bien TImage qui enregistrera tes dessins dans sa picture (en bitmap).

    Si tu veux que ce soit comme un TPanel, tu auras compris que tu peux mettre le TPaintBox (align := alClient) dans un TPanel.

  4. #4
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    Pour être complet, j'ajouterai qu'en réalité, tu peux aller voir le code de TPanel dans la VCL, pour te rendre compte que : bin tiens, il existe bien un Canvas, mais il est en "protected" donc inaccessible de l'extérieur.

    Alors si tu tiens absolument à n'utiliser que TPanel pour dessiner, voici ce que tu peux faire :

    1/ Solution du tricheur (sale car théoriquement non valide, mais pratique car rapide à mettre en place)

    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
     
    type
      TExplosedPanel = class(TPanel);
     
    (...)
     
    procedure TForm1.btn1Click(Sender: TObject);
    begin
      with TExplosedPanel(Panel1).Canvas do
        begin
          MoveTo(5, 5);
          LineTo(10, 20);
          {...}
        end;
    end;
    2/ Solution valide (il faut faire un composant descendant de TPanel, simple, mais faut le faire)

    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
     
    type
      { à mettre dans un paquet et à "registerer" }
      TCanvasPanel = class(TPanel)
      public
        property Canvas; { La visibilité de Canvas devient alors publique }
      end;
     
    (...)
     
    procedure TForm1.btn1Click(Sender: TObject);
    begin
      with CanvasPanel1.Canvas do
        begin
          MoveTo(5, 5);
          LineTo(10, 20);
          {...}
        end;
    end;

  5. #5
    Membre expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Points : 3 675
    Points
    3 675
    Par défaut
    Extra !

    Je vais prendre la deuxième solution j'aime pas la tricherie

    mais l'option TPaintBox me plait bien aussi. Moi ce que je voulais surtout connaître, c'est quel était le composant standard de delphi à utiliser lorsque l'on doit dessiner. En java c'est JPanel, donc par extension j'avais pensé à TPanel...

    Merci pour les précisions

  6. #6
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par DMO
    En fonction de ce que tu veux faire, à vrai dire de si tu veux que ce que tu dessines soit persistant ou pas, tu peux utiliser TPaintBox qui est fait exprès pour ce que tu veux faire je crois,
    Si tu veux que ce soit comme un TPanel, tu auras compris que tu peux mettre le TPaintBox (align := alClient) dans un TPanel.
    en plus de TpaintBox crée un variable de type TBitMap (TBitMap+TpaintBox=Timage a peut prés )

  7. #7
    DMO
    DMO est déconnecté
    Membre averti
    Avatar de DMO
    Profil pro
    Inscrit en
    Février 2004
    Messages
    290
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 290
    Points : 343
    Points
    343
    Par défaut
    TPaintBox est un simple descendant de TGraphicControl. Il en profite pour publier le Canvas et d'autres propriétés.

    Mais contrairement à un TImage, lorsque tu dessines dedans, puis que tu passes une autre fenetre au dessus de ton dessin, pour ensuite pousser cette fenetre, le dessin dans le Canvas du contrôle genre TPaintBox ne sera plus, alors que celui dessiné dans le TImage persistera.

    C'est ce que j'ai (peut être maladroitement je te l'accorde) voulu exprimer.

    Donc effectivement, le TImage est grossièrement un espèce de TPaintbox dont le contenu se dessine depuis un TPicture. Alors que lorsque tu dessines dans un Canvas, c'est à toi de dessiner et de redessiner quand il le faut.

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

Discussions similaires

  1. Choix composant pour dessin,texte avec OnKeyPressed
    Par YsYs dans le forum Composants VCL
    Réponses: 5
    Dernier message: 26/10/2011, 17h26
  2. Composant graphique pour dessiner courbes
    Par stephane.julien dans le forum C#
    Réponses: 11
    Dernier message: 02/11/2007, 16h26
  3. Où trouver un composant pour dessin ou simulation?
    Par zelig dans le forum Windows Forms
    Réponses: 2
    Dernier message: 01/05/2007, 01h21
  4. Réponses: 7
    Dernier message: 04/06/2006, 17h00

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