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 :

Améliorer traitement affichage StringGrid


Sujet :

Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Améliorer traitement affichage StringGrid
    Bonjour tout le monde,

    Voilà ma question :
    Imaginons un stringgrid de 5 colonnes 1 FixedCol et 1 FixedRow

    Est-ce qu'on peut dans l'évenement OnDrawCell écrire dans l'entête de la colonne un chiffre par rapport au position de la souris dans la colonne ?

    En fait si ma souris est par exemple en plein milieu de la colonne 3 dans n'importe quelle ligne supérieur à la fixed est que je peux écrire "tata" dans l'entête exactement en position vertical où se trouve la souris ?

    Actuellement je joue avec le mousemove et le ondrawcell avec un array de String qui ressemble à cela

    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
      RepereHorairesMouseMoveinStringlist    : Array[0..29] of String =
      (' 6h','  6h30','    7h','      7h30','        8h','          8h30',
       '            9h','              9h30','                10h',
       '                10h30','                   11h','                   11h30',
       '                       12h','                       12h30','                           13h',
       '                           13h30', '                               14h',
       '                               14h30','                                   15h',
       '                                   15h30','                                       16h',
       '                                       16h30','                                           17h',
       '                                           17h30','                                               18h',
       '                                               18h30','                                                   19h',
       '                                                   19h30',
       '                                                       20h',
       '                                                    20h30'
      );
    Et selon le mousemove j'écrit StringGridS[i,1] = RepereHorairesMouseMoveinStringlist['calcul position de la souris']

    Mais dans mon nouveau cas il faudrait que je gère une dizaine de Array de string différent.

    J'ai essayé de jouer avec le Trect de ondraw mais cela ne changement rien
    extrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        // Heures EN MOUVEMENT
        if (Arow = 1) And (ACol > 0) And (Cote=0) then
        Begin
          Degrader(TStringGrid(Sender).Canvas,Rect,clcream,clMoneyGreen);
          Brush.Style := bsClear;
          Font.size := 7;
          Font.Name := 'Tahoma';
          DrawText(Handle, PChar(Cells[Acol,Arow]), -1, Rect, DT_LEFT or DT_VCENTER or DT_SINGLELINE);
        end;
        if (Arow = 1) And (ACol > 0) And (Cote=1) then
        Begin
          Degrader(TStringGrid(Sender).Canvas,Rect,clcream,clMoneyGreen);//$00DB9E5D,$00C98843);
          Brush.Style := bsClear;
        End;
    Merci pour votre aide

  2. #2
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    J'ai pas tres bien compris ce que tu voulais faire. Peut tu réexpliquer ? Avec des imprim écran par exemple ?

    Dans l'évenement OnDrawCell, tu peux retoucher n'importe quelle partie du Canvas de la grille, y compris en dehors de Rect. Le soucis, c'est que si tu modifie le canvas d'une case quelconque, et que l'évenement OnDrawCell de cette case est appelée après, le dessin va se faire au dessus du précédent dessin, et donc l'effacer.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.DrawGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
      if (ACol=3) and (ARow=3) then
      begin
        DrawGrid1.Canvas.Brush.Color:=clRed;
        DrawGrid1.Canvas.Rectangle(DrawGrid1.Canvas.ClipRect);
      end;
    end;
    Si tu testes ce code, tu verra certaines cellules rouges, et d'autres blanches. C'est parce que l'évenement OnDrawCell des cellules blanches est appelé apres celui de la cellule (3,3).

    J'ai l'impression que tu veux simplement un moyen d'avoir une donnée qui suit la souris. Le plus simple, je pense, est de supprimer les FixedCol, FixedRow, et de les remplacer par un ou plusieurs TPaintBox que tu dessinera toi même, et dans lequel tu mettra l'information que tu veux.

    Bonne chance

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut,

    Tu as raison ce n'est pa simple à illustrer.

    voici une page ecran en 3 phases



    Dans le premier cas le cercle (représentant la position de ma souris) permet d'afficher dans la barre verte 06:00 la évidement tout va bien.

    Dans le deuxième cas j'ai dans la barre verte de la deuxième colonne 13:00, si on regarde la souris est placé au centre de la colonne mais le 13:00 reste coller à gauche de la colonne, comment faire ?

    Dans le troisième cas un autre exemple cela m'affiche 18:30 mais encore une fois je n'arrive pas à positionner ce chiffre dans la même verticale que la souris.


    Quand on réfléchi il y a plusieur choses à gérer,
    1) déjà 18:30 prends 5 caractères et si on regarde on peux placer le centre sur le signe ":", maintenant si je vais vers 20:00 avec la souris la je risque de ne pas voir les 3 derniers caractères de 20:00 en effet cela va dépasser la colonne donc le centre cette fois si c'est le chiffre 0 de 20:30 (le dernier) donc la position des heures dépens à la fois de l'endroit où se trouve la souris mais aussi un déplacement de l'affichage vers la gauche dépendant de la posssibilité d'afficher entièrement l'heure dans la colonne !!
    Ou alors on affiche 18:00 par exemple superposé ? mais alors là je vois pas comment faire !!!

    2) De plus cela s'adapte par rapport à la colonne où l'on se trouve, là sa va je sais faire mais il faut y penser.
    3) Pour compliquer le calcul la taille des colonnes n'est pas fixe !!! donc je ne peux pas forcer une position.


    Par contre je connais à l'avance la taille des colonnes (avant l'affichage), je connais le "pas" qui permet de passer de 06:00 à 06:30 et ainsi de suite.

    Est-ce qu'on pourrais imaginer un tableau de positionnement en pixel de chaque heure et ensuite faire le positionnement ? comment devrais-je faire ?

    Merci à vous.

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Ouf...

    C'est bon j'ai trouvé...

    Je suis passé par une variable global ou j'ajoute au Rect.left ce qu'il faut pour tombé juste.

    Merci à tous.

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 729
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 729
    Points : 15 132
    Points
    15 132
    Par défaut
    Salut,

    d'un strict point de vue ergonomie de l'ihm, je trouve contre-productif d'être obligé de faire sans cesse des va-et-vient du regard entre la position de la souris (le gros rond noir) et le titre de la colonne, surtout si le texte est sensé se balader de gauche à droite en fonction de l'heure, donc obligé de le « chercher » du regard à chaque mouvement...
    C'est peut-être pour ça que tu ne trouves pas de solution,
    ÀMHA, il serait beaucoup plus confortable pour l'utilisateur (et beaucoup plus facile à coder pour toi) de faire simplement une information qui suive la position de la souris (infobulle, form personnalisée, etc.).

    PS : en bonne typographie française, l'abréviation de « Monsieur », c'est « M. » ; « Mr » c'est en typographie anglo-saxonne. Ça serait cool de respecter ce point de culture, , nous ne sommes pas que des « bêtes à coder »

    [EDIT] Ah, tu as trouvé et posté pendant que je rédigeais ce qui précède ! Bon, je ne retire rien à ce que j'ai dit, sauf huit mots que je barre. [/EDIT]
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Ok, je vois a peu près le truc.

    Le plus simple est d'avoir une variable qui stocke la position en X de ta souris. Ensuite, il te suffit d'appeler l'évenement OnDrawCell pour la cellule qui t'interresse.

    Donc, en gros, voila :
    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
    procedure TForm1.StringGrid1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    begin
      FPosSourisX:=X;
      StringGrid1DrawCell(StringGrid1,2,0,StringGrid1.CellRect(2,0),[]);
    end;
     
    procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
      Rect: TRect; State: TGridDrawState);
    begin
        StringGrid1.Blabla
        //Dessin de ta case
     
        StringGrid1.Canvas.TextRect(Rect,XPos,2,TonTexte);
        //XPos est la distance en pixel de ton texte au bord gauche du canvas.
        //Tu l'obtient grace a FPosSourisX et a ton "pas"
    end;
    J'ai testé, tu obtiens un texte qui suit ton curseur quand tu déplaces la souris. Si ton texte dépasse de la case, a toi de calculer la valeur maximale de XPos pour ne pas faire dépasser ton texte (Canvas.TextWidth ...).

    Edit : Waaa ! bien doublé la !

    Pour info, tu n'es pas obligé de modifier ta variable Rect dans le OnDrawCell : Il te suffit, pour afficher ton texte, d'utiliser Canvas.TextRect(Rect : TRect; X, Y : integer; Text : String); et de faire varier ton X.

  7. #7
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Salut,

    PS : en bonne typographie française, l'abréviation de « Monsieur », c'est « M. » ; « Mr » c'est en typographie anglo-saxonne. Ça serait cool de respecter ce point de culture, , nous ne sommes pas que des « bêtes à coder »
    Mdr... l'hopital qui se f** de la charité....lol

    En fait c'est une base exemple et quand je forme mes clients j'arrête pas de leur dire la même chose...
    M. = Monsieur
    Mr = Mister

    On moins on est d'accord sur un point

    Autre chose, la barre bleu que tu voit en dessous qui est actuellement vide sert justement la regle d'heure... ainsi je gere les deux utilisateurs celui qui préfére une graduation suivie par la souris et un autre qui préférea un pré repérage.

    L'ihm est trés important trop moi.


    a+

  8. #8
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par mick605 Voir le message
    ...

    Edit : Waaa ! bien doublé la !

    Pour info, tu n'es pas obligé de modifier ta variable Rect dans le OnDrawCell : Il te suffit, pour afficher ton texte, d'utiliser Canvas.TextRect(Rect : TRect; X, Y : integer; Text : String); et de faire varier ton X.
    Je peux pas car j'utilis eun dégradé avant voilà ce que j'ai fais en fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        // Heures EN MOUVEMENT
        if (Arow = 1) And (ACol > 0) And (Cote=0) then
        Begin
          Degrader(TStringGrid(Sender).Canvas,Rect,clcream,clMoneyGreen);
          Brush.Style := bsClear;
          Font.size := TailleFontSize;
          Font.Name := 'Tahoma';
          yRect.Left := Rect.Left + PosMouseHeure;
          yRect.Top  := Rect.Top;
          yRect.Right  := Rect.Right;
          yRect.Bottom := Rect.Bottom;
     
          DrawText(Handle, PChar(Cells[Acol,Arow]), -1, yRect, DT_VCENTER);
        end;
    Je me suis fait avoir au début a cause du DT_CENTER que j'vais mi.

    Merci à toi.

  9. #9
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Je peux pas car j'utilis eun dégradé avant voilà ce que j'ai fais en fait :
    Non, la différence est juste que tu utilises la procedure DrawText pour dessiner ton texte, alors que moi, c'est juste un TextRect. Les deux solutions sont presques équivalentes, et donc doivent marcher toutes les deux.

    Enfin bref, l'essentiel c'est que le probleme soit résolu !

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

Discussions similaires

  1. Comment améliorer l'affichage des icones
    Par pierrot67 dans le forum Delphi
    Réponses: 2
    Dernier message: 30/10/2006, 10h31
  2. [c#,Delphi] composante d'affichage (stringgrid)
    Par zidenne dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/09/2006, 09h47
  3. [JList] Améliorer l'affichage
    Par netr dans le forum Composants
    Réponses: 7
    Dernier message: 20/06/2006, 19h13
  4. [Tableaux] Temps de traitement ... affichage de page
    Par mathieu77186 dans le forum Langage
    Réponses: 37
    Dernier message: 25/10/2005, 17h45

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