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 :

TImage : FillRect ne fonctionne pas


Sujet :

Composants FMX Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 413
    Billets dans le blog
    2
    Par défaut TImage : FillRect ne fonctionne pas
    Bsr,

    On continue dans cet enfer de FMX pour Android: le dessin d'un rectangle rempli

    La ligne est tracée, pas le rectangle ...

    Vraiment pénible, ce FMX

    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
     
    procedure TTabbedForm.Image1Paint(Sender: TObject; Canvas: TCanvas; const ARect: TRectF);
    begin
    Image1.Bitmap := Tbitmap.Create(Trunc(image1.width),trunc(image1.Height));
      with Image1.Bitmap do
      begin
        Clear(FVueBackground);
        Canvas.BeginScene;
          Canvas.Stroke.Kind   := TBrushKind.Solid;
          canvas.Fill.Color := clBlack;
          canvas.Fill.Kind  :=  TBrushKind.Solid;
          Canvas.FillRect(ARect, 1, canvas.Fill);
     
     
          CNV.Stroke.Color     := TAlphaColors.red;
          CNV.Stroke.Kind      := TBrushKind.Solid;
          CNV.Stroke.Thickness := 4;
          Canvas.DrawLine(TPointF.Zero,Tpointf.Create(image1.Bitmap.Width,image1.Bitmap.height),1);
     
        Canvas.EndScene;
      end;
     
    end;

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    Citation Envoyé par JP CASSOU Voir le message
    Vraiment pénible, ce FMX
    Vraiment pénible ces habitudes Pourquoi compliquer quelque chose de simple

    1- on est dans un évènement onPaint donc pas de BeginScene / EndScene
    2- utilisation de with Image1.Bitmap inutile et portant à confusion, on est déjà dans Image1, le Canvas de la procédure y fait référence
    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
     
    procedure TForm34.Image2Paint(Sender: TObject; Canvas: TCanvas;
      const ARect: TRectF);
    var r : TRectF; // futur rectangle
    begin
    // Pas sur que ces deux lignes soient au bon endroit, je les aurais plutôt mises en Oncreate  
    Image1.Bitmap := Tbitmap.Create(Trunc(image1.width),trunc(image1.Height));
    Image1.Bitmap.Clear(TAlphaColors.Lightblue); // rectangle entier, pas besoin de FillRect
    //-------------------------------------------------------------------------------------
    Canvas.Stroke.Kind   := TBrushKind.Solid;
    canvas.Fill.Color := TAlphaColors.Navy;
    Canvas.Fill.Kind  :=  TBrushKind.Solid;
    R:=ARect; 
    R.Inflate(-10,-10,-10,-10); // Diminution du rectangle 
    Canvas.FillRect(R, 1, canvas.Fill);
    // ligne
    Canvas.Stroke.Color     := TAlphaColors.red;
    Canvas.Stroke.Kind      := TBrushKind.Solid;
    Canvas.Stroke.Thickness := 4;
    Canvas.DrawLine(R.LeftTop,R.BottomRight,1);  // R.LeftTop = TPointF.Create(R.Left,R.Top), R.BottomRight=TpointF.Create(R.Right,R.Bottom) 
    end;
    Nom : Capture.PNG
Affichages : 179
Taille : 8,4 Ko
    * Image1 est contenu dans un TPanel, et alignée client, mais avec des marges.
    * Attention à la propriété wrapmode de Image1, mise à original plutôt que Stretch

  3. #3
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    en plus la création d'un Bitmap alors qu'on est en train de dessiner sur l'image ne me semble pas une bonne idée, surtout à chaque dessin de l'image: jolies fuites mémoire en perspective

    m'est avis qu'il faut arrêter de copier/coller des codes de n'importe où

  4. #4
    Membre très actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 413
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par pprem Voir le message
    en plus la création d'un Bitmap alors qu'on est en train de dessiner sur l'image ne me semble pas une bonne idée, surtout à chaque dessin de l'image: jolies fuites mémoire en perspective

    m'est avis qu'il faut arrêter de copier/coller des codes de n'importe où
    Je me disais bien que ce Image1.Bitmap := Tbitmap.Create(Trunc(image1.width),trunc(image1.Height)); était suspect, mais tous les exemples que j'ai lu mentionnaient cette ligne. Idem pour le BeginScene/EndScene

    Dans un événement OnMouseMove de l'image ou de son conteneur, puis-je dessiner directement sur le canevas du Image1 (pour tracer une courbe à main levée provisoire) sans que çà redéclenche un OnPaint ?:

    Nom : exemple_dessin_main_levee.png
Affichages : 181
Taille : 154,2 Ko

    Après un OnPaint:

    Nom : exemple_dessin_main_levee_2.png
Affichages : 163
Taille : 131,2 Ko

  5. #5
    Membre Expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Par défaut
    Tu peux regarder ce que j'ai fait sur cet exemple : https://github.com/DeveloppeurPascal.../010-Signature

    Un programme FMX de test d'une TFrame permettant de signer quelque depuis un terminal. La partie "signature" n'étant en fait qu'un dessin au doigt ou à la souris sur la zone de l'image.

  6. #6
    Membre très actif

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2013
    Messages : 413
    Billets dans le blog
    2
    Par défaut En réponse à votre aide: Simplification d'une polyligne
    Citation Envoyé par pprem Voir le message
    Tu peux regarder ce que j'ai fait sur cet exemple : https://github.com/DeveloppeurPascal.../010-Signature

    Un programme FMX de test d'une TFrame permettant de signer quelque depuis un terminal. La partie "signature" n'étant en fait qu'un dessin au doigt ou à la souris sur la zone de l'image.
    Merci pour votre aide.

    Petite contribution en retour:

    Ci-dessous: Simplification d'une polyligne par l'Algorithme de Douglas-Peucker https://fr.wikipedia.org/wiki/Algori...ouglas-Peucker

    Paramètres:
    ArrayOfTPointf: array of TPointf; // Tableau de points 2D (x,y) de taille n
    Marker: array of boolean; // Tableau de booléens de taille n
    Tol2: double; // Tolérance, dans la même unité que les coordonnées. Typiquement 0.20 m.


    =============================

    Fonctions préliminaires:
    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
     
     function VecMinInt2D(const A, B: TPointf): TPointf;
     begin
       Result.X := A.X - B.X;
       Result.Y := A.Y - B.Y;
     end;
     
     function DotProdInt2D(const A, B: TPointf): Double;
     begin
       Result := A.X * B.X + A.Y * B.Y;
     end;
     
     function NormSquaredInt2D(const A: TPointf): Double;
     begin
       Result := A.X * A.X + A.Y * A.Y;
     end;
     
     function DistSquaredInt2D(const A, B: TPointf): Double;
     begin
       Result := NormSquaredInt2D(VecMinInt2D(A, B));
     end;
     function SafeDivide(const a, b: double; const Default: double): double;
     begin
       try
         Result := a / b;
       except
         Result := Default;
       end;
     end;
    Procédure:
    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
     
    procedure SimplifyInt2D(var ArrayOfTPointf: array of TPointf;
                                           var Tol2: double;
                                            var Marker: array of boolean; const j, k: integer);
     // Simplify polyline in OrigList between j and k. Marker[] will be set to True
     // for each point that must be included
    var
       i, MaxI: integer; // Index at maximum value
       MaxD2: double;    // Maximum value squared
       CU, CW, B: double;
       DV2: double;
       P0, P1, PB, U, W, Oi: TPoint3Df;
    begin
       // Is there anything to simplify?
       if k <= j + 1 then exit;
     
       P0 := ArrayOfTPointf[j];
       P1 := ArrayOfTPointf[k];
       U  := VecMinInt2D(P1, P0); // Segment vector
       CU := DotProdInt2D(U, U); // Segment length squared
       MaxD2 := 0;
       MaxI  := 0;
       // Loop through points and detect the one furthest away
       for i := j + 1 to k - 1 do begin
         Oi := ArrayOfTPointf[i];
         W  := VecMinInt2D(Oi, P0);
         CW := DotProdInt2D(W, U);
     
         // Distance of point Orig[i] from segment
         if (CW <= 0) then
         begin
           // Before segment
           DV2 := DistSquaredInt2D(Oi, P0)
         end
         else
         begin
           if (CW > CU) then
           begin
             // Past segment
             DV2 := DistSquaredInt2D(Oi, P1);
           end else
           begin
             // Fraction of the segment
             B := SafeDivide(CW, CU, 0.00);
             PB.X := P0.X + B * U.X;
             PB.Y := P0.Y + B * U.Y;
             DV2 := DistSquaredInt2D(Oi, PB);
           end;
         end;
     
         // test with current max distance squared
         if (DV2 > MaxD2) then
         begin
           // Orig[i] is a new max vertex
           MaxI  := i;
           MaxD2 := DV2;
         end;
       end;
     
       // If the furthest point is outside tolerance we must split
       if (MaxD2 > Tol2) then
       begin // error is worse than the tolerance
         // split the polyline at the farthest vertex from S
         Marker[MaxI] := True;  // mark Orig[maxi] for the simplified polyline
         // recursively simplify the two subpolylines at Orig[maxi]
         SimplifyInt2D(Tol2, Marker, j, MaxI); // polyline Orig[j] to Orig[maxi]
         SimplifyInt2D(Tol2, Marker, MaxI, k); // polyline Orig[maxi] to Orig[k]
       end;
    end;
    Utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        ...
        NbBuffVertex := length(MyArrayOfTPointF);
        SetLength(Marker, NbBuffVertex);                        // Create a marker array
        Marker[0]     := True;                                  // Include first and last point
        Marker[NbBuffVertex - 1] := True;
        for i := 1 to NbBuffVertex - 2 do Marker[i] := False;   // Exclude intermediate for now
         SimplifyInt2D(MyArrayOfTPointF, Tol2, Marker, 0, NbBuffVertex - 1);      // Simplify
    Avant simplification:
    Nom : simplify_poly1.png
Affichages : 166
Taille : 59,6 Ko
    Après:
    Nom : simplify_poly2.png
Affichages : 171
Taille : 72,0 Ko

Discussions similaires

  1. [Lazarus] With objet do ne fonctionne pas avec TImage
    Par Jipété dans le forum Lazarus
    Réponses: 2
    Dernier message: 17/11/2016, 08h42
  2. La propriété Transparent de TImage ne fonctionne pas
    Par randriano dans le forum C++Builder
    Réponses: 8
    Dernier message: 07/02/2007, 14h16
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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