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

Delphi Discussion :

Canvas et Boutons


Sujet :

Delphi

  1. #21
    Rédacteur/Modérateur

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

    Pour info, la 3D et Delphi c'est avec les versions XE et plus et l'environnement FMX. Cela ne veut pas dire que ce n'était pas possible avant mais c'est quand même beaucoup plus facile depuis.
    Je n'ai pas encore accroché ce wagon


    Citation Envoyé par chrisguinchard Voir le message
    Pour SergioMaster qui semble préoccupé par les calculs de positions
    Pas du tout, je suis juste quelqu'un qui a pour habitude de faire le moins de calcul possible pour éviter les erreurs.

    Juste par défi intellectuel, je me suis fait le plateau localisable (pour peu de mettre les textes en variable ressource), sensible à l'échelle et au DPI de l'écran (difficile de le montre sans vidéo)
    mon seul regret : le centre du plateau (toujours à cause du problème de l'étoile prise dans un fichier SVG, mais c'est un détail)

    Nom : Capture.PNG
Affichages : 255
Taille : 41,3 Ko
    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
    procedure TForm1.FillGridClick(Sender: TObject);
    var l,c : integer;
        aRect : TRectangle;
     
        procedure MotTriple(r : TRectangle);
        begin
          R.Fill.Color:=Talphacolors.Red;
          with TText.Create(Self) do
               begin
                 Parent:=R;
                 Align:=TalignLayout.Contents;
                 Text:='mot triple'; // localisable
                 TextSettings.Font.Size:=8;
               end;
        end;
        procedure MotDouble(r : TRectangle);
        begin
          R.Fill.Color:=Talphacolors.Pink;
          with TText.Create(Self) do
               begin
                 Parent:=R;
                 Align:=TalignLayout.Contents;
                 Text:='mot double'; // localisable
                 TextSettings.Font.Size:=8;
               end;
        end;
        procedure LettreTriple(r : TRectangle);
        begin
          R.Fill.Color:=Talphacolors.Royalblue;
          with TText.Create(Self) do
               begin
                 Parent:=R;
                 Align:=TalignLayout.Contents;
                 Text:='lettre triple'; // localisable
                 TextSettings.Font.Size:=8;
               end;
        end;
        procedure LettreDouble(r : TRectangle);
        begin
          R.Fill.Color:=Talphacolors.Lightseagreen;
          with TText.Create(Self) do
               begin
                 Parent:=R;
                 Align:=TalignLayout.Contents;
                 Text:='lettre double';  // localisable
                 TextSettings.Font.Size:=8;
               end;
        end;
        procedure Star(R : TRectangle);
        begin
          with TText.Create(Self) do
               begin
                 Parent:=R;
                 Align:=TalignLayout.Contents;
                 Text:=#1046;
                 TextSettings.Font.Size:=8;
                 TextSettings.Font.Style:=[TFontStyle.fsBold];
               end;
     
        end;
     
    begin
    for l := 0 to 14 do
      for c := 0 to 14 do
        begin
          aRect:=TRectangle.Create(Self);
          aRect.Fill.Color:=TAlphaColors.Cream;
          aRect.Stroke.color:=TAlphaColors.Lightgreen;
          aRect.Parent:=Plateau;
          case ValeurCase[c,l] of
            -3 : MotTriple(ARect);
            -2 : MotDouble(ARect);
            3  : LettreTriple(ARect);
            2  : LettreDouble(ARect);
          end;
          if (l=7) AND (c=7) then Star(aRect);
        end;
     
    end;
    Pas un seul appel au canvas ou calculs de positions Par contre une utilisation à fond de la possibilité d'ajouter des composants enfants à d'autres composants.

    Où je suis moins content, c'est dans ma manière de définir le plateau (initialisation d'un tableau) mais le but de l'exercice était de "voir" quel serait le meilleur moyen de faire le plateau
    un TGridPanelLayout (défini au design) a été mon choix.
    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
    for var l := 0 to 14 do
      for var c := 0 to 14 do
        ValeurCase[c,l]:=1;
    // mots triples
    valeurcase[0,0]:=-3;
    valeurcase[0,7]:=-3;
    valeurcase[0,14]:=-3;
    valeurcase[7,0]:=-3;
    valeurcase[7,14]:=-3;
    valeurcase[14,0]:=-3;
    valeurcase[14,7]:=-3;
    valeurcase[14,14]:=-3;
    // mots doubles
    valeurcase[1,1]:=-2;
    valeurcase[1,13]:=-2;
    valeurcase[2,2]:=-2;
    valeurcase[2,12]:=-2;
    valeurcase[3,3]:=-2;
    valeurcase[3,11]:=-2;
    valeurcase[4,4]:=-2;
    valeurcase[4,10]:=-2;
    valeurcase[13,1]:=-2;
    valeurcase[13,13]:=-2;
    valeurcase[12,2]:=-2;
    valeurcase[12,12]:=-2;
    valeurcase[11,3]:=-2;
    valeurcase[11,11]:=-2;
    valeurcase[10,4]:=-2;
    valeurcase[10,10]:=-2;
    // lettres triple
    valeurcase[5,1]:=3;
    valeurcase[9,1]:=3;
    valeurcase[5,13]:=3;
    valeurcase[9,13]:=3;
    valeurcase[1,5]:=3;
    valeurcase[5,5]:=3;
    valeurcase[9,5]:=3;
    valeurcase[13,5]:=3;
    valeurcase[1,9]:=3;
    valeurcase[5,9]:=3;
    valeurcase[9,9]:=3;
    valeurcase[13,9]:=3;
    // Lettres Doubles
    valeurcase[3,0]:=2;
    valeurcase[11,0]:=2;
    valeurcase[3,14]:=2;
    valeurcase[11,14]:=2;
    valeurcase[6,2]:=2;
    valeurcase[8,2]:=2;
    valeurcase[6,12]:=2;
    valeurcase[8,12]:=2;
    valeurcase[0,3]:=2;
    valeurcase[7,3]:=2;
    valeurcase[14,3]:=2;
    valeurcase[0,11]:=2;
    valeurcase[7,11]:=2;
    valeurcase[14,11]:=2;
    valeurcase[2,6]:=2;
    valeurcase[6,6]:=2;
    valeurcase[8,6]:=2;
    valeurcase[12,6]:=2;
    valeurcase[2,8]:=2;
    valeurcase[6,8]:=2;
    valeurcase[8,8]:=2;
    valeurcase[12,8]:=2;
    valeurcase[3,7]:=2;
    valeurcase[11,7]:=2;
    Les lettres (du moins le style du "pion") ce n'est pas encore fait mais ne saurait tarder.

    20mn plus tard voilà un premier jus
    Nom : Capture_2.PNG
Affichages : 247
Taille : 3,6 Ko
    pas totalement satisfaisant, j'aurais voulu mettre un effet relief sur la lettre et la valeur.
    Idem j'ai utilisé un SpeedButton (ce qui en soit n'est pas mal) pour la lettrine mais du coup je suis obligé de coder ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // à tranformer en fonction, result TSpeedButton  
    procedure unPion(Lettre : String; valeur : word);
    begin 
    Pion.text:=Lettre;
    Pion.tag:=valeur;
    TText(Pion.FindStyleResource('detail')).text:=valeur.toString;
    end;
    j'eusse préféré Pion.detail:='1'; du coup autant renommer en "valeur"
    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

  2. #22
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2018
    Messages : 18
    Points : 2
    Points
    2
    Par défaut valeur des cases
    Joli ton plateau !

    J'ai cherché quelles boucles pourraient "remplir" le tableau contenant les "valeurs" des cases pour le calcul...
    voilà ce que j'ai fait :

    procedure Tplateau.init_puis_case;
    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
    var i,j : word;
    // puis_case : array [1..15,1..15] of word = valeur des cases 
    // 0=pas de facteur, 1=mot x3, 2=mot x2, 3=étoile, 4=lettre x2, 5=lettre x3
     
    begin
      for i:=1 to 15 do
          for j:=1 to 15 do puis_case[i,j]:=0; //mise à zéro
      puis_case[1,1]:=1; puis_case[1,8]:=1;puis_case[1,15]:=1;  //mot 3x
      puis_case[15,1]:=1; puis_case[15,8]:=1;puis_case[15,15]:=1;  //mot 3x
      puis_case[8,1]:=1;puis_case[8,15]:=1;  //mot 3x
     
      puis_case[8,8]:=3;      //étoile
     
      for i:=1 to 4 do begin    // mot 2x
        puis_case[i+1,i+1]:=2;puis_case[i+1,15-i]:=2;
        puis_case[15-i,i+1]:=2;puis_case[15-i,15-i]:=2;
      end;
                                  //Lettre 3x
      puis_case[2,6]:=5; puis_case[2,10]:=5;puis_case[14,6]:=5;puis_case[14,10]:=5;
      for i:=0 to 3 do begin
        j:=4*i;puis_case[6,j+2]:=5; puis_case[10,j+2]:=5;
      end;
                                  // Lettre 2x
       puis_case[1,4]:=4; puis_case[1,12]:=4;puis_case[3,7]:=4;puis_case[3,9]:=4;
       puis_case[15,4]:=4; puis_case[15,12]:=4;puis_case[13,7]:=4;puis_case[13,9]:=4;
       puis_case[4,1]:=4; puis_case[4,8]:=4;puis_case[4,15]:=4;
       puis_case[7,3]:=4; puis_case[7,7]:=4;puis_case[7,9]:=4;puis_case[7,13]:=4;
       puis_case[9,3]:=4; puis_case[9,7]:=4;puis_case[9,9]:=4;puis_case[9,13]:=4;
       puis_case[12,1]:=4; puis_case[12,8]:=4;puis_case[12,15]:=4;
       puis_case[8,4]:=4; puis_case[8,12]:=4; 
    end;
    Pour les jetons, j'ai photographié les jetons de mon vrai Scrabble!! pour les mettre dans une Timage.
    Pour les cases, j'ai fait 5 dessins que j'ai mis dans une Timage.

  3. #23
    Rédacteur/Modérateur

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

    Merci d'utiliser les balises de code pour encadrer le code présenté (utilisation du bouton [#] ou saisie des balises)

    Citation Envoyé par chrisguinchard Voir le message
    Joli ton plateau !
    C'était la partie "facile" et je ne désespère pas de trouver un SVG (en restant dans les composants de base d'un version Delphi Rio Community) "utilisable" pour l'étoile
    en attendant voici qui est mieux que le caractère cyrillique
    Nom : Capture_3.PNG
Affichages : 230
Taille : 5,3 Ko

    J'ai cherché quelles boucles pourraient "remplir" le tableau contenant les "valeurs" des cases pour le calcul...
    Pas de répartition "magique" donc, d'un autre côté le Array of (en particulier d'objet) permet plein de choses pour les calculs ensuite dont acte, à moins de mettre ce tableau dans un fichier (texte,xml ... ou base de donautre, il faut passer par la case "saisie"

    Pour les jetons, j'ai photographié les jetons de mon vrai Scrabble!! pour les mettre dans une Timage.
    Donc lourd (en octets) c'est pour cela que j'ai envisagé les styles, avec une version VCL j'aurais envisagé de créer mon propre composant

    Pour les cases, j'ai fait 5 dessins que j'ai mis dans une Timage.
    Voilà où la version FMX différe puisque dans mon cas il s'agit de simples textes (donc facilement localisable pour d'autres langues)

    voici le rendu de fin de matinée (du au début de la journée de travail)
    Nom : Capture.PNG
Affichages : 233
Taille : 38,6 Ko

    ce qui ne va pas : les lettres dans la grille sont encore crénelées (et oui, le G n'a pas la bonne valeur, pour l'instant je ne me suis pas occupé de lettres sensu stricto)
    a contrario la lettre posée à côté semble correcte il me reste juste le relief (possible par la propriété shadow) à réaliser
    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. #24
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2018
    Messages : 18
    Points : 2
    Points
    2
    Par défaut Photo et dessin
    J'ai essayé initialement de bâtir de plateau avec des "Tlabel", mais je ne vois pas comment mettre une lettre en majuscule avec sa valeur en indice dans le "caption".
    Alors j'ai opté pour une photo de l'ensemble des jetons, mises dans une Timage, et une procedure qui "découpe" chaque jeton pour les placer dans un "array of TBitmap".
    Bien sûr cela "prend du volume", et au premier écran c'est moins esthétique !
    Je voulais arriver vite à la résolution des problèmes qui venaient ensuite :
    -les jetons placés nouvellement doivent être alignés horizontalement ou verticalement.
    -il ne doit pas y avoir de "trou" dans l'alignement de ces nouveaux jetons.
    -il doit y avoir "contact" avec au moins un jeton placé aux tours précédents. (sauf le 1er tour, et la case étoile doit alors être utilisée)
    -les jetons des tours précédents sont inamovibles.
    -quand on place un joker, quelle lettre représente-t-il?
    -et si on place les 2 jokers dans le nouveau mot?
    -et le calcul du score : pour un prof de math à la retraite ce fut la cerise sur le gâteau dont je n'ai fait qu'une bouchée (le gourmand !)

    Il reste à peaufiner la présentation... mais je suis un mauvais commercial!
    Images attachées Images attachées      

  5. #25
    Expert confirmé Avatar de sergio_is_back
    Homme Profil pro
    Responsable informatique, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable informatique, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 084
    Points : 5 604
    Points
    5 604
    Par défaut
    Citation Envoyé par chrisguinchard Voir le message
    J'ai essayé initialement de bâtir de plateau avec des "Tlabel", mais je ne vois pas comment mettre une lettre en majuscule avec sa valeur en indice dans le "caption".
    Pour ma part j'aurais opté pour un TFrame (ça existe sous Lazarus aussi)
    Le TFrame est un container, il peut contenir plusieurs contrôles, Un TImage pour l'image de fond (qui sera toujours la même), un TLabel pour la lettre et un deuxième TLabel pour la valeur...

    Exemple avec Delphi : (Une frame avec un TImage et deux TLabel)

    Nom : Unsaved image.jpg
Affichages : 219
Taille : 26,3 Ko

    Comme en plus d'être un container, le TFrame est aussi un descendant du TControl, tu peux en instancier à volonté les placer où tu veux sur ta grille, ça t'évitera d'avoir autant de photos à recadrer proprement...

  6. #26
    Expert confirmé Avatar de sergio_is_back
    Homme Profil pro
    Responsable informatique, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable informatique, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 084
    Points : 5 604
    Points
    5 604
    Par défaut
    Petit exemple de ce pourrait être le constructeur sous Delphi (j'ai pas testé le code) :

    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
     
    unit Unit6;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
      Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Imaging.pngimage, Vcl.ExtCtrls;
     
    type
      TFrame6 = class(TFrame)
        fImage: TImage;
        fLettre: TLabel;
        fValeur: TLabel;
      private
        { Déclarations privées }
      public
        constructor Create(Parent : TControl; Lettre : string; Valeur : Integer);
      end;
     
    implementation
     
    {$R *.dfm}
     
    { TFrame6 }
     
    constructor TFrame6.Create(Parent : TWinControl; Lettre: string; Valeur: Integer);
    begin
        inherited Create(Parent);
        Width:=fImage.Width; // La largeur de la frame est la largeur de l'image
        Height:=fImage.Height; // La hauteur de la frame est la hauteur de l'image
        ParentWindow:=Parent.Handle; // La frame se dessine dans le parent
        fLettre.Caption:=Lettre;
        fValeur.Caption:=Format('%d',[Valeur]);
     
    end;
     
    end.
    Le constructeur initialise la lettre et la valeur. Le paramètre Parent est un TWincontrol, une grille, une fiche, ou même un autre Tframe bref un contrôle qui peut en contenir d'autres

  7. #27
    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
    J'ai répondu il y a quelques semaines sur une question sur le positionnement d'un TShape dans un rectangle qui peut être unes solution à ta question.

    https://www.developpez.net/forums/d2...er-ondragdrop/

    Il y a un exemple en pièce jointe dans cette discussion

  8. #28
    Candidat au Club
    Homme Profil pro
    Enseignant
    Inscrit en
    Mai 2018
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2018
    Messages : 18
    Points : 2
    Points
    2
    Par défaut Merci
    Merci pour tous les conseils.
    J'ai pu corriger les défauts qui m'avaient amené à poser les questions initiales.
    Mon projet est encore très perfectible, et je me rends compte que la longue interruption dans l'autoformation, à cause d'activités diverses et prenantes, a creusé des lacunes que j'essaierai de combler au fur et à mesure des nécessités.

    A bientôt peut-être pour d'autres sujets de discussion.

Discussions similaires

  1. Faire des Boutons canvas
    Par passicon dans le forum Java ME
    Réponses: 1
    Dernier message: 23/04/2010, 13h09
  2. Afficher gif sur canva avec bouton
    Par NightK dans le forum GUI
    Réponses: 7
    Dernier message: 23/04/2010, 01h45
  3. Afficher une élément dans un Canvas après un clic sur un bouton
    Par D-Day dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 28/02/2010, 19h39
  4. Faire un lien bouton vers un canvas
    Par ljuboja78 dans le forum Flex
    Réponses: 1
    Dernier message: 18/03/2009, 12h19
  5. [C#][XAML] bouton fermer pour canvas
    Par matb33 dans le forum Général Dotnet
    Réponses: 8
    Dernier message: 18/07/2007, 13h57

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