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 :

ScrollBars de la ScrollBox invisibles (avec un "s", c'est les sbr, pas la sbx) [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 126
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut ScrollBars de la ScrollBox invisibles (avec un "s", c'est les sbr, pas la sbx)
    Bonjour,

    après mes mésaventures de centrage de l'objet qu'elle contient, voilà qu'une ScrollBox refuse systématiquement d'afficher ses ScrollBars quand c'est nécessaire :
    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
    function its(i:integer):string; begin Result:=IntToStr(i);end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      PanelAuCentre.Parent := sb; // pour aligner le panel dans une scrollbox avec border à 0 et alClient
      sb.AutoScroll:=True; // voir commentaire + bas
    end;
     
    procedure TForm1.sbResize(Sender: TObject);
    begin
      // What I do now is set AutoScroll to False in the IDE, then set it to True in code
      // https://forum.lazarus.freepascal.org/index.php?topic=18040.0
      sb.HorzScrollBar.Visible := (sb.Width  < PanelAuCentre.Width);  // jamais vu
      sb.VertScrollBar.Visible := (sb.Height < PanelAuCentre.Height); // jamais vu
      caption := its(sb.Width)+' '+its(PanelAuCentre.Width)+' '+booltostr(sb.HorzScrollBar.Visible);
    end;
    Nom : centrerpanel.png
Affichages : 645
Taille : 10,2 Ko
    La scrollbox est verte, le panneau centré dedans est crème, le "-22" c'est son .Left, le "8" c'est son .Top et les deux autres la taille "client" de la scrollbox.

    Le "-1" dans la Caption de la fiche indique que la scrollbar horizontale est viible. Vous la voyez, vous ?

    En désespoir de cause j'ai essayé de forcer l'affichage avec un CheckBox, mais même ça est inopérant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.ckbxSBonoffChange(Sender: TObject);
    begin
      if ckbxSBonoff.Checked then begin
        sb.AutoScroll := True;
        sb.HorzScrollBar.Visible := True;//(sb.Width  < PanelAuCentre.Width);
        sb.VertScrollBar.Visible := True;//(sb.Height < PanelAuCentre.Height);
      end else begin
        sb.AutoScroll := False;
        sb.HorzScrollBar.Visible := False;//(sb.Width  < PanelAuCentre.Width);
        sb.VertScrollBar.Visible := False;//(sb.Height < PanelAuCentre.Height);
      end;
      caption := its(sb.Width)+' '+its(PanelAuCentre.Width)+' '+booltostr(sb.HorzScrollBar.Visible);
    end;
    La seule chose que je vois changer, c'est l'état du booléen, -1 > 0 > -1 etc.

    Une idée ?

  2. #2
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Salut JP.

    Avec AutoScroll = true, les scrollbars ne seront visibles que si nécessaire. (avec leur propriété visible = true).

    Pourquoi se prendre la tête avec cela ?

    Ton problème vient de l'alignement alClient de ton PanelAuCentre. Comme sa taille sera toujours égale à la taille du scrollbox, forcément il n'y aura jamais besoin de scrollbars.

    Amicalement
    Thierry

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Salut salut, Thierry
    Citation Envoyé par ThWilliam Voir le message
    Avec AutoScroll = true, les scrollbars ne seront visibles que si nécessaire. (avec leur propriété visible = true).
    Yes I know, cependant tu as dû lire cette ligne (plus le lien que j'ai donné) où la gars a miséré comme pas possible avec un truc aussi simple que ça...
    Et tu l'as lu dans le FormCreate où il est là suite à ce commentaire, justement.

    Par ailleurs, j'ai même rajouté une case à cocher pour essayer de forcer à la mano mais ça résiste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.ckbxSBonoffChange(Sender: TObject);
    begin
      if ckbxSBonoff.Checked then begin
        sb.AutoScroll:=True;
        sb.HorzScrollBar.Visible := True;
        sb.VertScrollBar.Visible := True;
      end else begin
        sb.AutoScroll:=False;
        sb.HorzScrollBar.Visible := False;
        sb.VertScrollBar.Visible := False;
      end;
    end;
    Et dans ce bout de code on peut voir deux lignes d'autoscroll sur lesquelles j'ai tout essayé : les deux à true, les deux à false, et true-false et false-true, résultats rien rien rien et rien...

    Citation Envoyé par ThWilliam Voir le message
    Ton problème vient de l'alignement alClient de ton PanelAuCentre. Comme sa taille sera toujours égale à la taille du scrollbox, forcément il n'y aura jamais besoin de scrollbars.
    Mais où as-tu vu ça ?
    Parce que bon, ch'suis neuneu d'accord mais, quand même, y a des limites

    Regarde bien l'image, le panel en question c'est le machin de couleur crème dont la caption affiche des nombres : s'il était alClient tu ne verrais pas dessous la couleur verte de la scrollbox !
    Et tu ne vois pas ses côtés gauche et droit parce que j'ai réduit la taille de la scrollbox à l'exécution, justement pour bien montrer qu'il n'est pas alClient et que j'attends la scrollbar horizontale, qui ne veut rien savoir, la garce !

    Une autre idée (oui je sais, c'est ardu, et c'est bien pour ça que j'ai pos[t]é ma question) ?

    et c't'aprème je suis pas là, soyez sages !

  4. #4
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Désolé, c'est ce j'avais cru comprendre de par ton commentaire dans la procedure TForm1.Create.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      PanelAuCentre.Parent := sb; // pour aligner le panel dans une scrollbox avec border à 0 et alClient
      sb.AutoScroll:=True; // voir commentaire + bas
    end;

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Citation Envoyé par ThWilliam Voir le message
    Désolé, c'est ce j'avais cru comprendre de par ton commentaire dans la procedure TForm1.Create.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // pour aligner le panel dans une scrollbox (avec border à 0 et alClient)
    C'est la sb qui est alClient sur la form (Panel1 est alLeft), désolé de m'être mal exprimé.

    Bah, t'as gagné le droit de rejouer,


  6. #6
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut, j'ai fais un petit test. Avec la 1.8rc4 dans l'EDI pour que les scrollbars apparaissent, j'ai du décoché/coché la propriété "AutoScroll"
    De plus j'ai remarqué que si le "Panel1" (a gauche) à ses positions left<0 et top<0 alors les positions de départ du scroll horizontal et verticale ne sont pas bonnes. Il faut dont bien aligné les contrôles dans la ScroolBox en partant de 0,0.
    Ensuite dans les propriétés HorzScrollBar etVertScrollBar il y a les propriétés "Range" et "Page" as tu essayés de jouer avec, pour voir ?

    Sinon pas d'autres idées.

    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Allez, un dernier mot :

    voilà ce que je vais utiliser, parce qu'avec ClientWidth ou Height, l'apparition d'une ScrollBar fait bouger le panneau centré, et c'est désagréable à l'œil.
    Donc :
    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
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    //  PanelAuCentre.Parent := sb; // fait dans l'EDI
    //  sb.AutoScroll:=True; // fait dans l'EDI, plus besoin ici, tout comme ça :
    // What I do now is set AutoScroll to False in the IDE, then set it to True in code
    // https://forum.lazarus.freepascal.org/index.php?topic=18040.0
    end;
     
    procedure TForm1.sbResize(Sender: TObject);
     
      procedure CenterPanel(p: TPanel);
      var
        L, T: integer;
      begin
        with p do begin
          L:= (Parent.Width -Width ) div 2;
          if L < 0 then L:= 0;
          Left:= L;
          T:= (Parent.Height-Height) div 2;
          if T < 0 then T:= 0;
          Top := T;
        end;
      end;
     
    begin
      CenterPanel(PanelAuCentre);
      // avec ces deux lignes, le ascenseurs sont centrés eux aussi (j'aime bien à l'usage)
      if sb.HorzScrollBar.Visible then
        sb.HorzScrollBar.Position := (PanelAuCentre.Width -sb.Width)  div 2;
      if sb.VertScrollBar.Visible then
        sb.VertScrollBar.Position := (PanelAuCentre.Height-sb.Height) div 2;
    end;
    Encore un gros merci, Thierry, de m'avoir sorti de cette ornière où je me suis fourvoyé à vouloir trop bien faire.


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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Allez, un dernier mot
    C'était bien mal me connaître que de croire que ça serait vrai,

    Mais trêve de plaisanteries, si je me suis embarqué dans cette (sale) histoire, c'est que je suis tombé sur un drôle de truc dans le projet fini où ces scrollbars doivent être utilisées, et là je reste sans voix ; ça vient du projet, les noms des objets sont ceux de la fiche, mais le code c'est le même que dans le post précédent, j'ai juste rajouté deux lignes pour logguer et une ligne de test pour valider une checkbox :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      CenterPanel(pnl4image);
      with ScrollBox4Panel do begin
        if HorzScrollBar.Visible then begin
          HorzScrollBar.Position := (pnl4image.Width -Width)  div 2;
          memo1.lines.add('HorzScrollBar.Visible ');
        end;
        if VertScrollBar.Visible then begin
          VertScrollBar.Position := (pnl4image.Height-Height) div 2;
          memo1.lines.add('VertScrollBar.Visible ');
        end;
    //pourri    ckbxAdaptImage.Enabled := (HorzScrollBar.Visible or VertScrollBar.Visible);
        ckbxAdaptImage.Enabled := (pnl4image.Width > ScrollBox4Panel.ClientWidth) or (pnl4image.Height > ScrollBox4Panel.ClientHeight);
      end;
    Et pourquoi je vous mets ça là ?
    Parce que même quand on ne les voit pas, les tests remontent qu'elles sont visibles, d'où le commentaire //pourri devant la ligne de test, inséré quand je me suis rendu compte que ça n'allait pas comme ça devait (j'ai mis les logs après), et la bidouille dessous, qui, elle, fonctionne.

    Nan mais c'est quoi ce délire ??????????????????????

    Et ça veut dire que les tests sur la position des ascenseurs ne sont pas bons non plus, aaaaaaarghhhhhh

    Truc de ouf'

  9. #9
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Salut juste une petite question bête mais que cherches tu à faire exactement ? Je comprend pas bien a part que tu veuilles un panel centrer dans une scrollbox avec les Scrollbar de visible.
    Est ce pour afficher une image en fonction de sa taille ? ou ai je raté quelque chose ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  10. #10
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Un petit truc que je pige pas c'est ça VertScrollBar.Position := (pnl4image.Height-Height) div 2; ne serait ce pas plutôt VertScrollBar.Position:=(Height div 2)-(pnl4image.Height div 2) ?

    Laisse tombé je pensais à autre chose, mais non

    Du coup je pense à ton ckbxAdaptImage.Enabled

    et je pense que ton "pnl4image" aura la taille de ton image. Si je pige bien tu souhaiterai que celui sois centrer si les dimension son inférieures au scrollbox (Width et Height) sinon affichage normal.
    Et que suivant si ckbxAdaptImage est cochée ton pnl4image s'adapte en fonction de la largeur ou la hauteur c'est ça ?
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 126
    Par défaut
    Citation Envoyé par BeanzMaster Voir le message
    Salut juste une petite question bête mais que cherches-tu à faire exactement ? Je comprends pas bien à part que tu veuilles un panel centré dans une scrollbox avec les Scrollbars visibles.
    Est-ce pour afficher une image en fonction de sa taille ? ou ai-je raté quelque chose ?
    Yes, bien vu !

    un panel centré dans une scrollbox avec les Scrollbars visibles si le panel (contenant un TImage alClient pour l'affichage) est plus grand que la zone client de la scrollbox qui le contient.

    Nom : stretched.png
Affichages : 459
Taille : 181,4 Ko

    Nom : not_stretched.png
Affichages : 399
Taille : 181,1 Ko

  12. #12
    Membre Expert
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    Septembre 2015
    Messages
    1 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Septembre 2015
    Messages : 1 899
    Billets dans le blog
    2
    Par défaut
    Essayes comme ça plutôt et laisse la propriété autoscroll à true :

    Normalement les scrollbars devraient s'afficher uniquement si la largeur ou la hauteur sont plus grande. Et l'image devrait être centré si elle est plus petite
    et si ton image est plus grande et que adaptimage est à TRUE cela devrai centrer le bouzin dans la scrollbox


    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
       procedure CenterPanel(p: TPanel);
        var
            L, T: integer;
        begin
            with p do
            begin
              if Width<Parent.ClientWidth then L:= (Parent.ClientWidth -Width ) div 2
              else L:=0;
              if Height<Parent.ClientHeight then T:= (Parent.ClientHeight-Height) div 2
              else T:=0;
              Left:= L;
              Top:= T;
              if cbAdapt.Checked then
              begin
                 if Height>Parent.ClientHeight then TScrollBox(Parent).VertScrollBar.Position :=Abs( (TScrollBox(Parent).VertScrollBar.page div 2) - (Height div 2));
                 if Width>Parent.ClientWidth then TScrollBox(Parent).HorzScrollBar.Position := Abs((TScrollBox(Parent).HorzScrollBar.Page div 2) - (Width div 2));
              end;
              Caption := its(Left)+' '+its(top)+' '+its( TScrollBox(Parent).HorzScrollBar.Position )+' '+its(TScrollBox(Parent).VertScrollBar.Position);
            end;
        end;
    nb: Page = Width ou Height de la scrollbox

    REEDIT : je suis gaucher, j'ai pris ton problème dans le sens inverse ! mdr mais bon ça devrai aller
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/02/2013, 14h19
  2. Réponses: 4
    Dernier message: 04/09/2006, 12h41

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