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 :

StringGrid fusion des cellules


Sujet :

Delphi

  1. #1
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut StringGrid fusion des cellules
    Bonjour,

    j'ai parcouru la FAQ et trouvé le moyen de fusionner des cellules.
    Cependant cette méthode fusionne les cellules mais il existe toujours les cases non fusionnée. Du coup lorsqu'on veux sélectionner une cellules fusionnée cela en sélectionne une des plusieurs cellules précédemment existante.
    J'ai aussi remarqué que lorsqu'on sélectionne ces cellules fusionnée puis qu'on les désélectionnes, les lignes de séparation réapparaisse ou disparaisse intempestivement.
    Alors voilà j'aimerais savoir si il est possible de remédier à cela, sinon si il existe un composant plus efficace pour ces manipulations.

    Merci beaucoup

  2. #2
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    J'ai essayé de rajouter l'instruction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AStringGrid.Canvas.DrawFocusRect(ARect);
    pensant redessiner le rectangle de focus mais ça ne semble pas fonctionné.


  3. #3
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    Toujours sans solution pour mon problème avec les cellules fusionnées.
    Je vais tenter de montrer ce que j'aimerais faire, juste le temps que je trouve comment poster des images ici.

  4. #4
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    Voilà les images comme prévu.

    La première qui pose problème à cause du focus des cellules fusionnée et de l'affichage centré dans les cellules fusionnée. Celle-ci est donc la grid que j'ai pu faire par moi-même et que je veux améliorer pour arriver à la bonne grid comme l'image suivante.



    Sur l'image ci-dessous que j'ai créé par paint j'ai représenté le résultat recherché.
    A savoir que les cellules jaunes sont clickable mais non éditable, les rouges et les bleus non clickable, les blanche éditable.
    Mon problème c'est surtout les cellules fusionnée et le focus de ces cellules.



    Merci.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Salut,

    En essayant de bidouiller l'affichage d'une stringgrid, j'ai moi aussi eu à me débattre avec les comportements par défaut de Delphi.

    Un truc qui ne m'a pas l'air mentionné dans la FAQ :
    un TStringGrid possède, dans ses propriétés, un petit flag booléen qui n'a l'air de rien : "DefaultDrawing".

    En fait, si ce flag est à True, avant d'exécuter ta méthode OnDrawCell lors du dessin d'une cellule, Delphi applique sa méthode.

    Si ça t'amuse, tu peux aller voir le code de l'unité "Grids.pas", cherche les occurences de "DefaultDrawing" et tu verras que ce petit flag peut avoir un effet dévastateur : il remplit le rectangle de la cellule concernée avec la couleur de fond, il dessine le texte de la grille de chaines sous-jacente, il dessine les bords de la cellule...

    Si ça ne t'amuse pas du tout (comme moi sur le coup), ne regarde pas le code de Grids.pas, désactive ce flag, et regarde le résultat. Il faudra peut-être que tu ajustes ta méthode OnDrawCell pour qu'elle dessine tout ce que tu souhaites, mais la fonction TCanvas.TextRect fait déjà le principal du travail (remplir le fond avec la bonne couleur, afficher le texte).

    *LeGEC*
    *LeGEC*

  6. #6
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    Merci pour l'astuce je vais y travailler.

  7. #7
    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
    Sur le forum, j'eu fourni une version améliorée de la FAQ :
    http://www.developpez.net/forums/d98...id/#post653242

    Regardes si ça peut te convenir.

    Sinon, sache que si tu "fusionnes", admettons, 4 cellules, tout ce que fait mon code, c'est de redessiner la contenu de la cellule correspondant au coin supérieur gauche de la "fusion" sur la surface complête représentée par les 4 cellules.

    En résumé, les 3 autres cellules existent toujours, mais on ne les vois plus, à cause de la première que l'on a agrandi.
    Bidouilleuse Delphi

  8. #8
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    Oki je vais tester l'unité que tu as fais.

    Ensuite oui j'avais compris ce que ton MergedCells faisait mais comme l'utilisateur doit clicker sur une case qui fait partie d'une zone fusionnée, cela n'est pas très propre car l'une des cellules fusionnée apparait ce n'est pas toute la zone fusionnée qui est selectionnée.

    Je vais continuer avec ton unité UnitFusionStringGrid, je te tiens au courant.

    Merci

  9. #9
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    Après quelque essais je rencontre un premier problème,

    les cases que je fusionne clignote (les bordures en fait) comme si il redessinait sans arrêter ces cases là.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 141
    Points : 142
    Points
    142
    Par défaut
    Il faudrait voir le code.

    Ce que tu décris ressemble furieusement à un mécanisme de messages qui s'appelle en boucle (par exemple le OnDraw qui ferait un invalidate, on le OnSelect qui ferait "Selection := qqch", ou...)

    Tes cellules clignotent, mais est-ce que ta grille est bloquée? est-ce qu'elle réagit aux clics?

    Regarde le code de tes différentes callbacks, essaye de déterminer si ça ne peut pas être le cas.

    *LeGEC*
    *LeGEC*

  11. #11
    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 cbegood Voir le message
    Après quelque essais je rencontre un premier problème,

    les cases que je fusionne clignote (les bordures en fait) comme si il redessinait sans arrêter ces cases là.
    1) Tu utilises bien le code qui a fait l'objet d'une Mise à Jour le 4/3/2006 ?
    (celui avec DessineZone, et non plus celui avec MergeCells)

    2) Tu l'utilises comment et sous quel OS (Vista ???? --> c'était pas prévu pour ) ?

    3) Vérifie que tu n'as pas des zones fusionnées qui se chevauchent (mais normalement, le code "s'en apercevrait"

    4) A l'origine, c'était tout de même plus du bricolage qu'autre chose (une rustine quoi !) du StringGrid tellement la question des fusions de cellules était récurrente. et c'est clair que ça ne fonctionne pas tip-top dès qu'il y a une histoire d'ascenceur vertical ou horizontal (mais ça je n'y suis pour rien à cause de certaines limitations dans le code de la VCL elle même... )

    Dans l'absolu, il faudrait refondre le composant TStringGrid, car il possède des méthode qui permettent de fusionner les cellules, mais je n'ai jamais compris pourquoi elles étaient mise en sous-procédures d'autres procédures ayant la visibilité private. Et pour le dessin des cellules, il y aurait aussi 2 ou 3 évènements utilisateurs à placer dans le code pour assouplir l'utilisation du composant.

    J'eu bien l'idée de réécrire le composant : j'aurais été obligé de faire un copié collé de 98% du code de Borland. Ce qui la fiche mal côté copyright...

    Thierry Laborde, si tu lis ça, dis à Codegear de rajouter du "OnBeforePaint" et du "OnAfterPaint" dans les composant de la VCL (Ca offrira plus de souplesse que le simple OnPaint).
    Bidouilleuse Delphi

  12. #12
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par LeGEC Voir le message

    Tes cellules clignotent, mais est-ce que ta grille est bloquée? est-ce qu'elle réagit aux clics?
    *LeGEC*
    Oui la grille réagit toujours quand je click.

  13. #13
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    Citation Envoyé par waskol Voir le message
    1) Tu utilises bien le code qui a fait l'objet d'une Mise à Jour le 4/3/2006 ?
    (celui avec DessineZone, et non plus celui avec MergeCells)
    Oui j'utilise bien la mise à jour.

    Rahh quel merde ces StringGrid.
    Ca manque quand même gravement une grille un peu plus magnable du genre Excel.

  14. #14
    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 cbegood Voir le message
    Oui la grille réagit toujours quand je click.
    Et tu as essayé les exemples fournis dans le lien que je t'ai donné ?
    là : http://www.developpez.net/forums/d98...id/#post657192

    (messages #14 et #15#) ?

    Est-ce qu'avec eux, ça clignote aussi ?
    Bidouilleuse Delphi

  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 cbegood Voir le message
    Oui j'utilise bien la mise à jour.

    Rahh quel merde ces StringGrid.
    Ca manque quand même gravement une grille un peu plus magnable du genre Excel.
    Ha c'est clair !
    Bidouilleuse Delphi

  16. #16
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    Je viens de tester ton exemple il fonctionne très bien.

    Le problème c'est que ton exemple est simple et moi je suis un gros nul lol

    Non plus sérieusement en fait ma grille change de nombre de colonne par un spinedit je dois donc re déterminer les zones de fusion en même temps que le changement du nombre de colonne je suppose.

  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
    Citation Envoyé par cbegood Voir le message
    Je viens de tester ton exemple il fonctionne très bien.

    Le problème c'est que ton exemple est simple et moi je suis un gros nul lol

    Non plus sérieusement en fait ma grille change de nombre de colonne par un spinedit je dois donc re déterminer les zones de fusion en même temps que le changement du nombre de colonne je suppose.
    Du coup, les anciennes zones fusionnées (celles devenues obsolètes) il faut les "tuer" (sinon tu te retrouves avec des conflits de "dessin") , alors attend je regardes...

    Edit :
    Bon, mon TZoneFusionnee c'est un bête enregistrement, donc ça s'inialise un peu comme tu veux en fait. Tu utilises un tableau de TZoneFusionnee , des variables distinctes ?
    Bidouilleuse Delphi

  18. #18
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    Aucun problème avec l'exemple que tu as donné, il s'agit donc d'une erreur dans la construction de mes zones de fusion.

  19. #19
    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 cbegood Voir le message
    Aucun problème avec l'exemple que tu as donné, il s'agit donc d'une erreur dans la construction de mes zones de fusion.
    Hé bien maintenant c'est donc à toi de jouer pour trouver ce qui cloche alors.

    Au boulot !
    Bidouilleuse Delphi

  20. #20
    Membre du Club
    Inscrit en
    Août 2008
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Août 2008
    Messages : 117
    Points : 50
    Points
    50
    Par défaut
    je montre tout de même le code que j'ai écris et qui ne fonctionne pas bien.
    Les zones ont l'air d'être bonne mais ça clignotte (comprend pas pourquoi)

    Comme je l'ai montré plus haut le tableau que je veux créer est assez simple.

    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
    procedure TInclineTest.GridDraftReadDrawCell(Sender: TObject; ACol,ARow: Integer; Rect: TRect; State: TGridDrawState);
    var i:integer;
        DesParametres:TParametresOnDrawCell;
        Zone:TZoneFusionnee;
    begin
    //On récupère les Paramêtres de OnDrawCell
      DesParametres.ACol:=ACol;
      DesParametres.ARow:=ARow;
      DesParametres.Rect:=Rect;
      DesParametres.State:=State;
      //Quel est le StringGrid qui déclenche l'évènement ?
      DesParametres.LeStringGrid:=(sender as TStringGrid);
     
      i:=1;
      if not(ARow in [6..8]) then
      begin
        while i<(GridDraftRead.ColCount - 1) do
        begin
       //création de la zone fusionnée   Zone:=SetZoneFusionnee(GridDraftRead,GridDraftRead.Cells[ACol,ARow],i,ARow,i+1,ARow,alHCenter,alVCenter,JustCenter);
          if not DessineZone(DesParametres,Zone)then
            begin
              if (ARow=0)and (ACol in [1..(GridDraftRead.ColCount-1)]) then
              begin
                 GridDraftRead.Canvas.Brush.Color:=clYellow;
              end;
              DessineCellule(DesParametres,alHCenter,alVCenter,JustCenter);
            end;
            i:=i+2;
        end;
      end;
    end;
    Je fais peut-être une erreur en créant la zone dans cette procédure?

Discussions similaires

  1. [HTML] Tableau pbl bordure et fusion des cellules
    Par Epistoliere dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 03/08/2006, 16h42
  2. [JSF] Fusion des cellules
    Par Shivan dans le forum JSF
    Réponses: 3
    Dernier message: 11/04/2006, 10h21
  3. [Swing][JTable]Fusion des cellules d'un tableau
    Par LordBlaize dans le forum Composants
    Réponses: 1
    Dernier message: 23/03/2006, 18h48
  4. [VB6] Problème MsFlexgrid et Fusion des cellules
    Par dubidon dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 07/02/2006, 09h00
  5. [StringGrid]Alignement des Cellules
    Par touhami dans le forum Composants VCL
    Réponses: 3
    Dernier message: 06/11/2005, 19h38

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