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 FMX Delphi Discussion :

Relation entre composant FMX et son Canvas


Sujet :

Composants FMX Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2021
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Relation entre composant FMX et son Canvas
    Bonjour,
    Mon besoin est simple , j'ai une Form en FMX qui possede un TPanel et je veux dessiner une ligne dans le TPanel.
    Mon TPanel possede les props suivantes
    Width = 300
    Height = 200


    La procedure qui dessine est la suivante :


    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
    procedure TForm3.Button1Click(Sender: TObject);
    var
        aCanvas:TCanvas;
    begin
       aCanvas := Panel1.Canvas;
       if aCanvas.BeginScene then
      try
        aCanvas.Stroke.Thickness := 1.5;
        aCanvas.Stroke.Kind := TBrushKind.bkSolid;
        aCanvas.Fill.Color := TAlphaColorRec.Black;
        aCanvas.Fill.Kind := TBrushKind.bkSolid;
        aCanvas.DrawLine(PointF(0, 0),   PointF(300, 200),1);
      finally
        aCanvas.EndScene;
      end;
    end;
    On part bien de 0,0 qui devrait etre l'origine du composant Panel et aller au point opposé en bas à droite. Cette procédure devrait dessiner une diagonale.

    Or le résultat est que la droite dessinée part bien de 0,0 mais celui de la Form propriétaire du TPanel et pas du TPanel lui-même.

    Nom : Capture.jpg
Affichages : 246
Taille : 22,1 Ko


    De plus quand on redimensionne la fenetre, le trait precedement tracé disparait.

    Question 1) Chaque composant ne possede t il pas son propre Canvas ou bien partage il celui de la Form en dessous
    Question 2) Y a t il un moyen de changer la gestion de l origine du Canvas d un composant sans faire un changement de repere à la mano
    Question 3) Que faire pour persister le trait pour qu il ne disparaisse pas lors d'un redimensionement de fenetre

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Je ne connais pas FMX donc je répondrais qu'au point 3)
    Il faut le faire dans un OnPaint d'un TControl pour que la ligne soit redessinée et le paramètre Canvas du TOnPaintEvent doit être utilisable en se basant sur ARect
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour et bienvenue,

    Un simple petit code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
        aCanvas:TCanvas;
        fcanvas : Tcanvas;
    begin
       fcanvas:=Canvas;
       aCanvas := Panel1.Canvas;
    montre que fcanvas=acanvas.


    Je procéderai différement, puisqu'un composant peut être parent d'un autre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    begin
      with Tline.Create(self) do
       begin
        parent:=Panel1;
        Stroke.Thickness:=1.5;
        Width:=300;
        Height:=200;
       end;
    end;
    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

  4. #4
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut Un premier élément de réponse
    J'ai mis un Timage dans le TPanel
    ET j'ai préchargé l'image avec une image blanche de 50x50

    Nom : Capture d’écran 2021-05-12 164955.jpg
Affichages : 204
Taille : 7,8 Ko

    L'image peut être générée dynamiquement.

    Ensuite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with Image1.Bitmap.Canvas do
      begin
        BeginScene ;
        Stroke.Thickness := 1.5;
        Stroke.Kind := TBrushKind.bkSolid;
        Fill.Color := TAlphaColorRec.Black;
        Fill.Kind := TBrushKind.bkSolid;
        DrawLine(PointF(0, 0),   PointF(50, 50),1);
        EndScene ;
      end;
    end;

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Effectivement mais, là, tu travailles sur le Canvas d'un Bitmap, plus vraiment d'un composant
    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

  6. #6
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut Version aboutie
    Citation Envoyé par SergioMaster Voir le message
    Effectivement mais, là, tu travailles sur le Canvas d'un Bitmap, plus vraiment d'un composant
    Oui, j'ai regardé dans mes exemples fmx, c'est toujours le cas chez moi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
      Image1.Bitmap := TBitmap.Create(round(Panel1.Width), round (Panel1.Height));
      Image1.Bitmap.Clear (TAlphaColor (0));
      with Image1.Bitmap.Canvas do
      begin
        BeginScene ;
        Stroke.Thickness := 1.5;
        Stroke.Kind := TBrushKind.Solid;
        Fill.Color := TAlphaColorRec.Black;
        Fill.Kind := TBrushKind.bkSolid;
        DrawLine(PointF(0, 0),   PointF((Panel1.Width),  (Panel1.Height)),1);
        EndScene ;
      end;
    Nom : aaaa.jpg
Affichages : 232
Taille : 17,6 Ko

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2021
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci pour vos solutions qui fonctionnent très bien.

    Je ne connaissais pas le composant TLine qui simplifie le problème.

    Pour conclure, pourquoi la solution d'AWeber solutionne le probleme de la position de l'origine par rapport à ce que j'avais ecrit au départ ?

    Merci pour votre expertise en tout cas.

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Thierry_74 Voir le message
    Je ne connaissais pas le composant TLine qui simplifie le problème.
    et il y a beaucoup d'autres shapes (rectangle étant celle que j'utilise le plus) mais les RadiantShapes en ajoute pas mal
    Pour conclure, pourquoi la solution d'AWeber solutionne le probleme de la position de l'origine par rapport à ce que j'avais ecrit au départ ?
    parce qu'il travaille sur un Bitmap.Canvas pas sur un composant au sens strict

    J'ai essayé aussi ce que Graig Chapman propose https://chapmanworld.com/2015/08/05/...g-tcanvas-fmx/ mais je pense que les versions récentes n'aiment pas car cela ne fonctionne pas. J'avais déjà pensé à récupéré le Canvas de l'évènement OnPaint avec le même dépit.

    Maintenant il s'agit peut-être d'une option GDI qu'il faudrait forcer
    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

  9. #9
    Membre émérite
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 496
    Points : 2 762
    Points
    2 762
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par Thierry_74 Voir le message
    Merci pour vos solutions qui fonctionnent très bien.

    Je ne connaissais pas le composant TLine qui simplifie le problème.

    Pour conclure, pourquoi la solution d'AWeber solutionne le probleme de la position de l'origine par rapport à ce que j'avais ecrit au départ ?

    Merci pour votre expertise en tout cas.
    Parce que nous ne sommes pas dans le même canvas je pense
    Panel1.Canvas; et Image1.Bitmap.Canvas
    ET aussi le Align
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        object Image1: TImage
          MultiResBitmap = <
            item
            end>
          Align = Client
        end

  10. #10
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    ne pas oublier le du bas de page
    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

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2021
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2021
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Merci pour vos réponses rapides et précises.

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

Discussions similaires

  1. Auditer son code - relations entre fichiers
    Par flyjodel dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 07/10/2018, 19h27
  2. Réponses: 0
    Dernier message: 17/08/2010, 15h11
  3. [Design/ID] Relation de dépendance entre composants
    Par ze_corsaire dans le forum UML
    Réponses: 12
    Dernier message: 17/01/2008, 21h42
  4. Relation entre composant et variables
    Par argon dans le forum AWT/Swing
    Réponses: 20
    Dernier message: 28/05/2006, 18h39
  5. [Relations] afficher les relations entre 2 tables
    Par dzincou dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 14/01/2004, 17h07

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