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 :

Grille en quinconce


Sujet :

Composants VCL Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 228
    Points : 117
    Points
    117
    Par défaut Grille en quinconce
    Bonjour,

    Je suis à la recherche d'infos pour dessiner une grille dont les cellules seraient en quinconce :
    Un truc dans ce genre là
    x x x x x x
    .x x x x x x
    x x x x x x
    .x x x x x x

    Est-ce possible de faire celà ? Dans un dbgrid, StringGrid ou DrawGrid ou autre !
    Merci d'avance

  2. #2
    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
    avec stringgrid c'est facille, inspire de: http://delphi.developpez.com/faq/?pa...leurstringgrid
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 228
    Points : 117
    Points
    117
    Par défaut
    Bonjour et merci pour ce lien, mais j'ai déjà regardé cette partie de la faq et je ne vois pas comment résoudre mon problème ici.

    Dans mes idées, j'ai :
    1) Possibilité de décaler une ligne sur 2 d'une grille, mais là je ne sais pas si c'est réalisable (c'est pourtant ce que je cherche à faire)
    2) Fusions de cellules :
    1ère ligne : (A1:B1) (C11) (E1:F1) etc.
    2ème ligne : (B2:C2) (D2:E2) (F2:G2) etc
    3ème ligne : ((A3:B3) (C33) (E3:F3) etc.
    4ème ligne : ...
    Dans ce cas, j'aurais un problème par la suite dans mon projet car j'ai besoin que les références de mes cellules soit A1, B1, C1, D1 et ainsi de suite. Pour ce cas, les cellule B1 ou D1 n'existeraient plus !

    Merci pour votre aide !

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Le Tstringgrid ne permet pas directement de résoudre le problème.

    Pour celà, on peut envisager la solution suivante :
    • - utiliser un tStringgrid invisible à plusieurs colonnes,
      - utiliser un autre tstringgrid visible à une seule colonne,
      - travailler normalement sur les cellules du TstringGrid invisible,
      - définir une procedure Ondrawcell pour le tstringgrid visible à 1 colonne,
      - dans ce événement, tracer "à la main" le contenu des cellules (1 cellule par ligne) à partir des valeurs de la grille invisible, sans oublier de tracer les séparateurs de colonnes.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 228
    Points : 117
    Points
    117
    Par défaut
    Bonjour et merci de ton aide

    Houlà, j'ai du mal à saisir là
    - utiliser un tStringgrid invisible à plusieurs colonnes,
    C'est lui qui va me servir de référence pour les cellules ? A1, B1, D2, etc.
    - utiliser un autre tstringgrid visible à une seule colonne,
    - dans ce événement, tracer "à la main" le contenu des cellules (1 cellule par ligne) à partir des valeurs de la grille invisible, sans oublier de tracer les séparateurs de colonnes.
    Donc ce stringgrid avec le même nombre de ligne que celui visible et une seule colonne où j'aurais dessiné des traits de séparation de colonnes. Ces traits seront bien sûr décalés sur la ligne du dessous et ainsi de suite pour donner un effet de quinconce.
    L'utilisateur verra le tableau dessiné sur ce stringgrid. Mais j'ai besoin de connaitre la cellule sur laquelle l'utilisateur veut agir. Et étant donné, qu'il y aura un décalage entre l'endroit où l'utilisateur aura cliqué et les cellules du stringgrid invisible !!!

    Dur dur là . Je ne sais pas si on arrive à me comprendre là, j'ai dû mal moi-même !

  6. #6
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Effectivement comme la property "Col" de la grid visible sera toujours à 0 (1 seule colonne).
    Il faudrait piéger le onMouseDown et traiter la position relative de la souris en X afin de modifier la property "Col" de la grid invisible.

    Si on veut en plus faire de l'édition, la solution des 2 grids ne convient plus vraiment.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 228
    Points : 117
    Points
    117
    Par défaut
    Si on veut en plus faire de l'édition, la solution des 2 grids ne convient plus vraiment.
    Bonjour,
    Effectivement, j'ai un besoin d'éditer les cellules de la grille !

    Je te remercie quand même pour m'avoir aidé

    J'avais lu, il y a un ou deux an sur ce forum, un post traitant de ce sujet avec un TDrawGrid, mais je ne le trouve plus.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 228
    Points : 117
    Points
    117
    Par défaut
    Bonjour,
    Je me permets de remonter mon post
    Quelqu'un aurait il une petite piste à me donner !
    Merci

  9. #9
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Décrit moi exactement ce que dois faire ton application, j ai peut etre le bout de code qui peut t aider

  10. #10
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Ta grille aura beaucoup de cellules ? des scrollbars ou pas du tout ?
    Bidouilleuse Delphi

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 228
    Points : 117
    Points
    117
    Par défaut
    Bonjour et merci à tous les deux pour votre aide

    Pour imager, cette grille doit représenter un casier de rangement de bouteilles.
    Donc l'utilisateur, à l'aide d'un clic souris, ajoutera ou otera une bouteille qui devra être représentée par un dessin quelconque dans une cellule de la grille.

    - Le nombre de cellules : Je ne l'ai pas encore définit car tout dépendra des limites d'affichage et d'exécution.

    - Pas de scrollbars.

    PS. Je me suis orienté vers une grille contenant des fusions de cellule.
    Fusion de A1-A2 ; A3-A4 et B2-B3 ; B4-B5

  12. #12
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Sinon, je te propose ceci en attendant mieux
    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
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, Grids;
     
    type
      TForm1 = class(TForm)
        StringGrid1: TStringGrid;
        procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
          Rect: TRect; State: TGridDrawState);
        procedure StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
          var CanSelect: Boolean);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    //dessin d'une cellule
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    Var i,j,x,y:Integer;
      R:TRect;
    begin
      With Sender As TStringGrid Do With Canvas Do
      Begin
        InflateRect(Rect,1,1);
        if Odd(ARow) then OffsetRect(Rect,DefaultColWidth div 2,0);
        Brush.Style := bsSolid;
        //TextRect(Rect, Rect.Left+2, Rect.Top+2, Cells[ACol, ARow]);
        If gdFixed in State
        { Les cellules fixes sont toujours dessinées en gris }
        Then Brush.Color := clBtnFace
        Else Begin
               { Les cellules sélectionnées sont en bleue }
               If gdSelected In State
               Then Brush.Color := clNavy
               { sinon, c'est une cellule normale}
               Else Brush.Color := Color;
             End;
     
        Canvas.FillRect(Rect);
        Canvas.Brush.Color:=clDkGray;
        Canvas.FrameRect(Rect);
        InflateRect(Rect,-3,-3);
        { Sélection de la couleur de texte }
        If gdSelected In State Then
          SetTextColor(Canvas.Handle,clWhite)
        Else SetTextColor(Canvas.Handle,clBlack);
     
        { Dessin du texte en utilisant la fonction API }
        DrawText(Canvas.Handle, PChar(Cells[ACol,ARow]), -1, Rect ,DT_NOPREFIX );
      End;
    end;
     
    //selection d'une cellule
    procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol,
      ARow: Integer; var CanSelect: Boolean);
    var xx,ccol,rrow:Integer;
    begin
       With (Sender As TStringGrid) Do
       begin
         xx:=ScreenToClient(Mouse.CursorPos).X;
         if Odd(ARow) then
         begin
           if xx<(DefaultColWidth div 2)
           then CanSelect:=False
           else begin
                 if ACol>1 then
                 if (xx<(CellRect(ACol-1,ARow).Right+(DefaultColWidth div 2)))
                 then begin
                        CanSelect:=False;
                        StringGrid1.Col:=ACol-1;
                        StringGrid1.Row:=ARow;
                      end;
                end;
         end;
         Invalidate;
       end;
    end;
     
     
    end.
    Bidouilleuse Delphi

  13. #13
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Leesox
    Bonjour et merci à tous les deux pour votre aide

    Pour imager, cette grille doit représenter un casier de rangement de bouteilles.
    Donc l'utilisateur, à l'aide d'un clic souris, ajoutera ou otera une bouteille qui devra être représentée par un dessin quelconque dans une cellule de la grille.

    - Le nombre de cellules : Je ne l'ai pas encore définit car tout dépendra des limites d'affichage et d'exécution.

    - Pas de scrollbars.
    C'est tout ? Parce que ça ne me parait pas trop compliqué à faire...
    Bidouilleuse Delphi

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 228
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par waskol
    C'est tout ? Parce que ça ne me parait pas trop compliqué à faire...
    Tu parles pour toi là
    Merci, je regarde ton code

  15. #15
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Leesox
    Citation Envoyé par waskol
    C'est tout ? Parce que ça ne me parait pas trop compliqué à faire...
    Tu parles pour toi là
    Merci, je regarde ton code

    C'est vrai que ce qui parait simple pour soi même ne l'est pas forcément pour les autres...
    Bidouilleuse Delphi

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 228
    Points : 117
    Points
    117
    Par défaut
    Ok, çà m'aide bien. Je vais me débrouiller avec çà.

  17. #17
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Si tu pouvais attendre ce soir ou demain soir ce serait cool parce que j'imagine bien ce que tu veux faire (gérer ta cave perso ?) et que j'ai éventuellement du code à te proposer (rien de bien compliqué mais sympa)

    Le code est là,dans ma tête, il n'y a plus qu'a le faire sortir.

    Juste un avant goût, et à partir de ce que je t'ai fourni :
    Au lieu de dessiner des carrés en quinconce, il est très facile (je parle pour moi sans doute), de dessiner des casiers un peu comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      /\    /\    /\ 
    /    \/    \/    \
    \    /\    /\    /
      \/    \/    \/
      /\    /\    /\ 
    /    \/    \/    \
    \    /\    /\    /
      \/    \/    \/
    En fait il suffit juste de remplacer le "FrameRect(ARect)" qui dessine la bordure de cellule par une succession de 4 (LineTo), en utilisant les mileux des cotés du rectangle ARect.

    Dans chaque casier tu peux y dessiner une bouteille (un cercle vert bouteille, ou bien blanc/rouge/rose) si le casier en contient une (valeur de la chaine de caractère de la cellule<>'') et affiché par dessus le Nom du crû (Chateau Trucmuche 1992).
    Donc d'ajouter quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if stringgrid1.cells[Acol,ARow]<>'' then canvas.circle();
    Pour éditer le contenu du casier, double clic sur la case, et hop petite fenètre d'édition. Dans lequel tu renseigne le contenu du casier (rien, une bouteille) et le contenu de la bouteille (rosé/rouge/blanc, mousseux, année, crû, etc...)

    Ca te plait comme idée ?
    Bidouilleuse Delphi

  18. #18
    Membre averti

    Homme Profil pro
    Inscrit en
    Octobre 2003
    Messages
    908
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 908
    Points : 447
    Points
    447
    Par défaut
    Ca serait pas plus simple d'utiliser une paint box, avec un evenement sur la souris ?

    Utiliser une Stringgrid pour faire ça , cela ne me semble pas trés propre ...

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 228
    Points : 117
    Points
    117
    Par défaut
    Citation Envoyé par waskol
    Si tu pouvais attendre ce soir ou demain soir ce serait cool parce que j'imagine bien ce que tu veux faire (gérer ta cave perso ?) et que j'ai éventuellement du code à te proposer (rien de bien compliqué mais sympa)

    Juste un avant goût, et à partir de ce que je t'ai fourni :
    Au lieu de dessiner des carrés en quinconce, il est très facile (je parle pour moi sans doute), de dessiner des casiers un peu comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      /\    /\    /\ 
    /    \/    \/    \
    \    /\    /\    /
      \/    \/    \/
      /\    /\    /\ 
    /    \/    \/    \
    \    /\    /\    /
      \/    \/    \/
    En fait il suffit juste de remplacer le "FrameRect(ARect)" qui dessine la bordure de cellule par une succession de 4 (LineTo), en utilisant les mileux des cotés du rectangle ARect.

    Dans chaque casier tu peux y dessiner une bouteille (un cercle vert bouteille, ou bien blanc/rouge/rose) si le casier en contient une (valeur de la chaine de caractère de la cellule<>'') et affiché par dessus le Nom du crû (Chateau Trucmuche 1992).
    Donc d'ajouter quelque chose de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if stringgrid1.cells[Acol,ARow]<>'' then canvas.circle();
    Pour éditer le contenu du casier, double clic sur la case, et hop petite fenètre d'édition. Dans lequel tu renseigne le contenu du casier (rien, une bouteille) et le contenu de la bouteille (rosé/rouge/blanc, mousseux, année, crû, etc...)

    Ca te plait comme idée ?
    C'est exactement çà et j'ai tout mon temps.
    Depuis que je fais du delphi, je n'ai que très rarement utilisé le canevas pour effectuer du dessin. Il va falloir me mette au taf là

    Citation Envoyé par rvzip64
    Ca serait pas plus simple d'utiliser une paint box, avec un evenement sur la souris ?

    Utiliser une Stringgrid pour faire ça , cela ne me semble pas trés propre ...
    J'ai pensé à ne pas utilisé de grille (Stringgrid ou DrawGrid), mais toujours pareil, il faut que je me mette au dessin.
    Comment fonctionne un paintbox ? J'ai jeté un coup d'oeil sur la faq et les sources, je n'ai rien vu ! Apparement tout fonctionne sur le canevas ! Est-ce que cette solution serait plus efficace en terme d'affichage ?

  20. #20
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Pourtant grand afficionado du TPaintBox, je dirais que dans ce cas ci, le StringGrid fera parfaitement l'affaire, et même peut-être plus simple à programmer qu'un PaintBox
    Bidouilleuse Delphi

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. : Adapter la taille d'une grille
    Par SteelBox dans le forum C++Builder
    Réponses: 3
    Dernier message: 31/07/2003, 07h08
  2. Désactiver la multi-sélection d'une grille
    Par Riko dans le forum Composants VCL
    Réponses: 6
    Dernier message: 17/06/2003, 09h47
  3. Grille avec saisie & Combos lié
    Par J-P-B dans le forum XMLRAD
    Réponses: 2
    Dernier message: 12/06/2003, 11h08
  4. jaimerais savoir commen creer une grille.......
    Par zephyr dans le forum Flash
    Réponses: 5
    Dernier message: 29/04/2003, 12h14
  5. [VB6] [Interface] Grille avec combobox
    Par khany dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/01/2003, 09h55

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