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 :

[Methode] Gestion graphique dans delphi


Sujet :

Composants VCL Delphi

  1. #1
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut [Methode] Gestion graphique dans delphi
    Bonjour,

    Je me tourne vers vous pour connaitre votre opinion sur la mise oeuvre d'une foncitonnalité.

    Dans un TPaintBox, je dessine un graphique (des points contrôlés reliés par des droites). Par dessus ce TPaintBox je voudrais avoir une sorte de curseur qui se balade de point en point. Seulement je ne veux pas qu'il soit dessiné dans le PaintBox, mais je voudrai pouvoir le déplacer à la souris, avec un système d'aimantation sur les points de mon tracé.

    J'ai été clair ?

    Je pensais réaliser ce curseur mobile avec un TImage (à l'avenir il y en aurait plusieurs créé dynamiquement par l'utilisateur). Pensez vous que ce soit la meilleure solution ? Comment vous y prendreriez vous ?

    Merci.

  2. #2
    Membre éclairé Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Par défaut
    C'est pour faire quoi au final?

    Car la méthode dépend du résultat final.

  3. #3
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Salut
    Citation Envoyé par declencher
    Comment vous y prendreriez vous ?
    En utilisant le TPaintBox pour dessiner le curseur... ce sera beaucoup plus facile:
    Tu dessines le curseur du paintBox juste en dessous du curseur dans le OnMouseMove du PaintBox... Si les valeurs X et Y s'approchent d'un point, tu dessines le curseur directement sur le point
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  4. #4
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    Justement j'ai dit ce que ça devait donner au final : l'utilisateur créera autant de curseur qu'il voudra pour qualifier ou non les points de son tracé.

    Effectivement ce serait plus simple de tracer les curseurs sur la TPaintBox, mais je trouve cette solution particulièrement lourde.

  5. #5
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Citation Envoyé par declencher
    Effectivement ce serait plus simple de tracer les curseurs sur la TPaintBox, mais je trouve cette solution particulièrement lourde.
    Ah bon Je pense que ta méthode avec des TImage est beaucoup plus lourde
    Avec juste le TPaintBox, tu n'as qu'une seule "image" à afficher: son Canvas.. Avec des TImage, chaque TImage plus le Canvas du TPaintBox est à afficher... Et puis ce n'est pas très propre de procéder comme ça... C'est mon avis
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  6. #6
    Membre éclairé

    Inscrit en
    Novembre 2002
    Messages
    815
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 815
    Par défaut
    j'ai essayé quelles lignes de code , pour positionner des " marqueur " dans un endroit bien precis d'un Tpaintbox , je positionne des carrés avec un genre de grille aimanté . tu promenes ton carré et quand il est a çà place tu le poses . La seule chose que j'ai pas fait c'est l'effacement d'un marqueur , mais çà suis le meme principe.

    Juste une idée bien sur a optimiser , puisque je ne gere que 10 marqueur .

    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
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    unit paint1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ExtCtrls, StdCtrls;
     
    type
      TForm1 = class(TForm)
        PaintBox1: TPaintBox;
        Button1: TButton;
        procedure PaintBox1Paint(Sender: TObject);
        procedure DessineFlaf(Dest:Tcanvas;x,y:integer);
        procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
        procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
        procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
        procedure DessineFont(Dest:Tcanvas);
        procedure FormCreate(Sender: TObject);
        Procedure CalibrePas(X1,Y1:integer;var X:integer; var Y:integer);
      private
        { Déclarations privées }
        bouge:boolean;
        OldX,OldY:integer;
        Asauve:array[1..10] of TBitMap;
        Apos:array[1..10] of Trect;
        Indice:integer;
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    procedure TForm1.PaintBox1Paint(Sender: TObject);
    Var Arect:Trect;
    begin
      Arect:=Rect(0,0,height,width);
      PaintBox1.Canvas.Brush.color:=clblack;
      PaintBox1.Canvas.fillrect(Arect);
      DessineFont(paintbox1.Canvas);
    end;
     
    //-------------------------------------------------------------------------
    procedure TForm1.DessineFont(Dest:Tcanvas);
    Var i:integer;
        SourceRect,DestRect:Trect;
    begin
      with dest do
      begin
           pen.Color:=cllime;
           Pen.Width:=1;
           for i:=1 to 7 do
           begin
               moveto(0,50*i);lineto(height,50*i);
               moveto(50*i,0);lineto(50*i,height);
           end;
      end;
      for i:=1 to 10 do
      begin
           SourceRect:=Apos[i];
           DestRect:=Rect(0,0,30,30);
           Paintbox1.canvas.CopyRect(SourceRect,Asauve[i].canvas,DestRect);
      end;
    end;
    //-------------------------------------------------------------------------
    procedure TForm1.DessineFlaf(Dest:Tcanvas;x,y:integer);
    begin
       with dest do
       begin
            Brush.Style:=BsClear;
            Pen.Width:=3;
            pen.Color:=clblack;
            rectangle(oldX-10,oldY-10,oldX+10,oldY+10);
            pen.Color:=clred;
            rectangle(X-10,Y-10,X+10,Y+10);
            OldX:=X;
            OldY:=Y;
       end;
    end;
    //-------------------------------------------------------------------------
    Procedure TForm1.CalibrePas(X1,Y1:integer;var X:integer; var Y:integer);
    var Dx,Dy:integer;
    begin
         dx:= X1 div 50;
         dy:= Y1 div 50;
         X:= Dx * 50 ;
         Y:= Dy * 50 ;
    end;
    //-------------------------------------------------------------------------
    procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
        if bouge then
        begin
            CalibrePas(X,Y,X,Y);
            DessineFont(paintbox1.Canvas);
            DessineFlaf(paintbox1.Canvas,X,Y);
        end;
    end;
    //-------------------------------------------------------------------------
    procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    begin
        bouge:=true;
    end;
    //-------------------------------------------------------------------------
    procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    var SourceRect,DestRect:Trect;
    begin
        bouge:=false;
        CalibrePas(X,Y,X,Y);
        SourceRect:=Rect(0,0,30,30);
        DestRect:=Rect(X-15,Y-15,X+15,Y+15);
        if indice<10 then
        begin
             inc(indice);
             Asauve[indice].Canvas.CopyRect(SourceRect,paintbox1.canvas,DestRect);
             Apos[indice]:=DestRect;
        end;
    end;
    //-------------------------------------------------------------------------
    procedure TForm1.FormCreate(Sender: TObject);
    var i:integer;
    begin
       Indice:=1;
       For i:=1 to 10 do
       begin
           Asauve[i]:=TBitmap.Create;
           Asauve[i].Width:=30;
           Asauve[i].Height:=30;
       end;
    end;
    end.
    bye !

  7. #7
    Membre éclairé

    Inscrit en
    Novembre 2002
    Messages
    815
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 815
    Par défaut
    Si la methode t'interesse , j'ai aussi le deplacement de marqueur et leur suppression...
    bye !

  8. #8
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    Merci pour ce code, je n'en attendais pas autant.
    Selon vous tous il est préférable pour moi de m'appuyer sur lesTBitMap plutôt que sur les TImage pour gérer mes curseurs ?

    Si vous avez d'autres idées ou opinion je suis preneur. En attendant je vaisq appronfondir les tests sur les Tbitmap.

  9. #9
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Par défaut
    Oui le problème de TImage, c'est qu'elles stockent un max de variables et autres que tu ne te sers pas forcément... Donc pour un affichage correct, il vaut mieux tout afficher directement dans le canvas d'un TPaintBox
    Pedro
    Aucune réponse aux sollicitations techniques par MP

    Faut pas attendre d'en avoir besoin pour s'en servir... (Lucien Stéphane)

    Les pages Source C'est bon. Mangez-en!
    Le défi Delphi
    Règles du forum - FAQ Delphi - Pensez au chtit
    Aéroclub Bastia Saint-Exupéry

  10. #10
    Membre éclairé

    Inscrit en
    Novembre 2002
    Messages
    815
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 815
    Par défaut
    Resalut je viens de faire un essaie avec des Timages ,Tpanel ...( comme marqueur .
    L'avantage certain est la simplicité pour la mise en oeuvre , puisque c'est pas toi qui dessine ce qui est a redessiner quand tu deplaces ! , j'ai utilisé en plus un composant qui gere le deplacement et le redimentionnemenrt d'un object en dynamique sur la fiche ( donc en plus le marquer peut etre adapter en temps reel )... donc la programmation consiste juste a ajouter ce composant ( deplace , resize ) , et creer en dynamique les marqueurs

    Par contre lors du deplacement , c'est moins fluide surement lier a la gestion des dessins de tout les objets contre seulement le dessin du seul paint box.

    Salut .

  11. #11
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    Bonjour,

    J'ai déjà fait une maquette avec un TImage se déplaçant dans les limites d'un TPaintBox, c'est très fluide est facile à programmer.
    Je vais faire le test avec un TBitMap. Ce sera plus long mais peut être plus propre.

  12. #12
    Membre éclairé Avatar de declencher
    Inscrit en
    Mai 2003
    Messages
    441
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 441
    Par défaut
    Re Bonsoir,

    Je viens de me faire une petite maquette avec un TPaintBox et des TBitmap créés dynamiquement. Chaque clique sur un TSpeedButton me crée un TBitmap. Chaque Bitmap peut être bougé indépendament dans les limites de la TPaintBox.

    C'est plus simple qu'avec des TImages et c'est bien plus propre au niveau du code.

    Bye et merci pour les conseils.

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

Discussions similaires

  1. Gestion des graphiques dans un classeur
    Par Kutoh dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/07/2013, 15h42
  2. Gestion evenement dans graphique excel
    Par taupin dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/01/2008, 23h42
  3. [Débutant] Modifs dans Delphi
    Par J-P-B dans le forum XMLRAD
    Réponses: 6
    Dernier message: 20/06/2003, 15h55
  4. Réponses: 3
    Dernier message: 09/02/2003, 01h09
  5. Réponses: 10
    Dernier message: 27/08/2002, 23h24

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