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

Lazarus Pascal Discussion :

StringGrid.RowCount = 10 mais n'en affiche que 9 [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut StringGrid.RowCount = 10 mais n'en affiche que 9
    Bonjour,

    piqué une bricolette chez les voisins de Delphi, il y a juste une bête et simple boucle et déjà ça part en sucette :

    Nom : stringgrid9lignes.png
Affichages : 202
Taille : 26,5 Ko
    Design à gauche avec les params W et H volontairement en-dessous des valeurs prévues (pour voir si ça s'adapte), Runtime à droite avec une vérif des valeurs dans la caption, qui sont ok.
    Comme je ne voulais pas y passer trop de temps, j'ai commenté une ligne (trucs introuvables) et modifié deux calculs dans la proc FormCreate :
    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
    {delphi    DefaultRowHeight := MulDiv(DefaultSizeCell, CurrentPPI,
          USER_DEFAULT_SCREEN_DPI);
     
        DefaultColWidth := MulDiv(DefaultSizeCell, CurrentPPI,
          USER_DEFAULT_SCREEN_DPI);      }
     
    //    Form1.Height := (DefaultRowHeight * RowCount) + DefaultRowHeight +
    // + GetSystemMetrics(SM_CYCAPTION);
        Form1.ClientHeight := (DefaultRowHeight * RowCount) + DefaultRowHeight;
    // ligne dessus peut être remplacée par 
        Form1.ClientHeight := (DefaultRowHeight * (RowCount+1));
    // mais ça ne change rien, toujours rien que 9 lignes affichées, même si la place pour la dixième est présente
     
    //    Form1.Width  := (DefaultColWidth * ColCount) + DefaultColWidth;
        Form1.ClientWidth  := (DefaultColWidth  * ColCount);
    Quelqu'un aura une idée ? J'ai utilisé ClientWidth et Height mais sans c'est pareil, de toute façon je n'ai jamais vu de différence entre avec et sans "Client", un autre mystère, ça....
    Laz 2.2.6 et FPC 3.2 dans une Debian 11.7 64bits.
    Ah, pour Lazarus, pensez à rajouter LCLIntf, LCLType, dans la section uses (c'est quand qu'ils vont le mettre par défaut, cet ajout de + en + nécessaire ?)

    Merci pour les retours éclairés,

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 931
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 931
    Billets dans le blog
    6
    Par défaut
    Bonsoir Jean-Pierre,
    Ce que tu fais est un tantinet différent : le code d'origine déduit la hauteur de cellule nécessaire pour que ça tienne dans la fiche, alors que tu essayes de modifier la hauteur de fiche pour que ta grille tienne dedans.
    Il me semble que le Create n'est pas le meilleur endroit pour modifier la hauteur d'une fiche, mais je n'ai pas le temps de chercher la référence dans l'aide de Lazarus... Ou alors de ses composants, pas forcément encore créés ?
    Que se passe-t-il si tu mets ton code dans un bouton ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    Et qu'est-ce que ça donne avec Align := alClient

    Sinon pas lieu de faire +DefaultRowHeight.

    Les différences que je constate avec Delphi est que la largeur de cellule inclus les lignes de séparation, en Delphi il faut les ajouter.
    Et effectivement les fonctions ClientXXX sont dans les choux, font appel à GetClientRect qui retourne juste 0 à Width / 0 à Height (donc un pixel de trop) sans déduire les bordures.

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Bonsoir les copains !

    Citation Envoyé par Andnotor Voir le message
    Et qu'est-ce que ça donne avec Align := alClient
    C'est beaucoup mieux, mais
    Citation Envoyé par Andnotor Voir le message
    Sinon pas lieu de faire +DefaultRowHeight.
    obligatoire de le rajouter pour avoir 10 lignes,
    Et j'ai un affreux scrollbar horizontal inutile !

    Citation Envoyé par tourlourou Voir le message
    Que se passe-t-il si tu mets ton code dans un bouton ?
    C'est pire !
    Nom : img_pire.png
Affichages : 148
Taille : 24,3 Ko

    C'est quand même incroyable qu'un truc aussi simple que ça ne puisse pas être rendu correctement !

  5. #5
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    Citation Envoyé par Jipété Voir le message
    obligatoire de le rajouter pour avoir 10 lignes
    Non, c'est juste pour (plus ou moins) compenser la taille d'une scrollbar.

    Le problème que je constate est vraiment la zone cliente qui n'est pas calculée correctement ; la bordure n'est pas prise en compte et le composant se retrouve systématiquement trop petit de deux fois sa taille (2x 2 pixels), d'où les scrollbars.
    En supprimant la bordure (BorderStyle := bsNone), pas de barre de défilement et un rendu correct.

    Nom : 2023-10-04 08_34_42-win7-32 - Connexion Bureau à distance.jpg
Affichages : 137
Taille : 165,1 Ko

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Bonjour,

    Citation Envoyé par Andnotor Voir le message
    En supprimant la bordure (BorderStyle := bsNone), pas de barre de défilement et un rendu correct.
    Mais toi tu es sous Windows, c'est ça ?

    Parce que moi, je cumule les emm...es, sous Linux :

    Nom : sigsegv.png
Affichages : 130
Taille : 70,1 Ko

    Bon, ce n'ai pas très beau, c'est du test, mais tu y retrouveras exactement ce que tu as publié ici, et si rien ne s'affiche dans la fenêtre du ShowMessage, c'est parce que c'est comme ça et pas autrement, la copie d'écran est laborieuse et mal rafraichie.
    Mais je peux te dire ce qu'il y avait d'écrit : "pause 157" parce qu'après, la boucle essaie d'accéder à l'adresse 158, et paf dans les dents !
    Un truc de malade...

    Et si je tente ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    begin
      Show;
      Application.ProcessMessages;
     
      with StringGrid1 do
      begin
        for y := 0 to RowCount - 1 do
          for x := 0 to ColCount - 1 do begin
            Cells[x, y] := TabStrSp1[y * ColCount + x];
            Form1.Caption:=IntToStr(y * ColCount + x);
            Application.ProcessMessages;
    //        ShowMessage('pause '+IntToStr(y * ColCount + x));
          end;
    1) je ne vois pas la fiche s'afficher ;
    2) je me prends le message d'erreur sans avoir vu la Caption de la fiche...

    Pour savoir où ça plante, il faut y aller en pas-à-pas et se taper 157 fois F8, une horreur...

  7. #7
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 934
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 934
    Par défaut
    C'est sûr que le tableau devrait contenir 160 entrées (0..159) et bizarrement ça ne plante pas chez moi.
    Sinon ajouter un test de validité if y *ColCount +x > high(TabStrSpl) then Break;

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 132
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 132
    Par défaut
    Bon, sous Linux, j'enlève l'AutoSize de la fiche, et je rajoute 2 lignes dans le Create :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
        Width  := DefaultColWidth  * ColCount + GridLineWidth;
        Height := DefaultRowHeight * RowCount + GridLineWidth;
        Form1.Width  := Width  + BorderSpacing.Around; // new
        Form1.Height := Height + BorderSpacing.Around; // new
      end;
    Et je suis passé à 160 caractères :
    Nom : CaptureRC.png
Affichages : 126
Taille : 31,1 Ko

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/05/2014, 12h44
  2. [Eclipse 3.0.1] Image qui n'affiche que son path
    Par thehpman dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 16/03/2005, 11h28
  3. base vide mais champs toujours affichés
    Par trotters213 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/03/2005, 09h08
  4. n'afficher que les "print" dans query annalyser
    Par sky_perrinos dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/12/2004, 10h58
  5. [XML] n'afficher que les 3 premiers!
    Par Little Sloth dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 01/06/2004, 10h59

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