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

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 437
    Points : 7 442
    Points
    7 442

    Par défaut Fonctionnement aléatoire, erratique et incompréhensible d'une TScrollBox



    Soit un TPanel aligné à alLeft sur une fiche, et un autre TPanel aligné à alClient.
    Soit une TScrollbox posée sur ce second panel, alignée à alClient aussi.
    Soit un TPanel posé sur cette scrollbox, aligné à alNone et dont la taille s'adapte au TImage qu'il contient.

    Jusque là vous suivez ?
    Code text : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Fiche
     |_PanelLeft  |_PanelClient
                         |_ScrollBox
                               |_Panel4Images
                                      |_TImage

    Je m'attends à ce que la scrollbox fasse apparaître ses scrollbars si je charge une grande image, ce qui est le cas si je lui ai défini AutoSize à True et Align à alClient, ça tombe bien c'est le cas.

    Mais comment expliquer, alors, que le Panel4Images reste obstinément tanqué à 0,0 (propriétés définies dans l'inspecteur d'objet) puisque j'ai attaché ça à 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
    procedure TForm1.scbxResize(Sender: TObject);
    begin
      // 2 lignes utiles si autoSize à False
      scbx.Left := (pnlCenter.Width  - pnl4Images.Width)  div 2;
      scbx.Top  := (pnlCenter.Height - pnl4Images.Height) div 2;
     
      pnl4images.Left := (scbx.Width - pnl4images.Width)  div 2;
      pnl4images.Top  := (scbx.Height- pnl4images.Height) div 2;
     
      memo.lines.Add(Format('%4d %4d',[pnl4images.Width,pnl4images.Height])); //
      memo.lines.Add(Format('%4d %4d',[scbx.Width,scbx.Height])); //
      memo.lines.Add(Format('%4d %4d',[scbx.ClientWidth,scbx.ClientHeight])); //
      memo.lines.Add(''); //
      // ouverture 800x600 et resize form + grande que scrollbox --> 800 600 - 840 680 - 840 680
      // mais le pnl4images reste à 0 0 -- comment c'est possible ?
    end;
    parce que chez moi, (840 - 800) div 2 ça fait 20, pour la largeur...

    Car oui, j'aurais aimé que ce Panel4Images soir centré gauche-droite et haut-bas quand il est plus petit que son container, mais makache walou...

    Et ça fait 4 heures que je suis là-dessus, à essayer dans tous les sens les options d'alignement et d'autosize de la scrollbox, avec et sans le PanelClient, en forçant les dimensions dans le code ou pas, bref, encore un truc de malade, je sens.

    À moins que quelqu'un ait une idée (0 pointé pour google sur ce coup-là) ? Elle mérite bien ça, Lena,

    Un dernier mot : en passant l'AutoSize de la scrollbox à False, ça centre le pnl4Images avec les petites images, cool, mais c'est un gros pâté avec les grandes :
    Nom : défaut_centrage.png
Affichages : 41
Taille : 91,6 Ko

    On voit bien que les ascenseurs ne permettront pas de parcourir toute l'image : parties gauche et supérieure hors d'atteinte
    Que faire pour y arriver ?
    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

  2. #2
    Membre chevronné

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

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : février 2014
    Messages : 413
    Points : 1 811
    Points
    1 811

    Par défaut

    Salut JP.

    Puisque l'alignement de ton scrollbox = alclient, cela ne sert à rien de modifier scbx.Left et scbx.top, ces propriétés resteront toujours = 0;

    En ce qui concerne le centrage de pnl4images, il ne faut le faire que si sa taille est inférieure à la taille du scrollbox. Sinon ses coordonnées left et/ou top sont = 0;

    Amicalement
    Thierry

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 437
    Points : 7 442
    Points
    7 442

    Par défaut

    Okay,

    merci d'avoir insisté, du coup je me suis engrainé et au final je m'en sors comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    procedure TMainForm.FormResize(Sender: TObject);
    begin
      // mettre la scrollbox à la taille du panneau d'affichage, si cette taille est inférieure à celle de pnlCenter
      if (pnl4images.Width < pnlCenter.Width) or (pnl4images.Height < pnlCenter.Height) then begin
        scbx.Width  := pnl4images.Width;
        scbx.Height := pnl4images.Height;
      end else begin
        scbx.Width  := pnlCenter.Width;
        scbx.Height := pnlCenter.Height;
      end;
    end;
    EDIT du lendemain après des tests plus poussés (je barre tout et je vire les images) :
    Voilà, bien joué Thierry (ai viré alClient de la scrollbar)
    Je l'ai remis, cf. post suivant.

    Plus qu'à attendre que les gens de Lazarus corrigent ce bug : malgré AutoSize à True (
    Citation Envoyé par help_lazarus
    Allows to show ScrollBars only if needed (when True).
    ), si on ne modifie que dans une direction, pas de scrollbar :

    Faut modifier dans les deux directions en utilisant le grip pour les avoir :

    EDIT : ce défaut est très nul car il fonctionne également dans l'autre sens : si j'ai les 2 scrollbars, et que je chope le grip pour agrandir, dès qu'une des deux dimensions est supérieure à la taille de l'objet, hop, les deux scrollbars disparaissent, alors qu'en toute logique on a encore besoin de celle correspondant à la taille encore inférieure...

    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

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 5 437
    Points : 7 442
    Points
    7 442

    Par défaut

    Salut,

    y a que ceux qui font rien qui ne se trompent pas, lol !
    Citation Envoyé par Jipété Voir le message
    EDIT du lendemain après des tests plus poussés :
    Suis reparti d'un vieux projet de test où il n'y avait rien d'autre qu'une scrollbox sur une fiche et une grande image dans la scrollbox, et il en ressort ça :
    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
    // modif image1.Align passé de alClient à alNone
    // scrollbox reste alClient et AutoSize à False
    procedure TForm1.FormResize(Sender: TObject);
    begin
      // le faire en 2 étapes séparées sinon flicker
      if image1.Width < scrollbox1.ClientWidth then
        image1.Left:= (scrollbox1.ClientWidth  - image1.Width ) div 2
      else
        image1.Left:= 0;
     
      if image1.Height < scrollbox1.ClientHeight then
        image1.Top := (scrollbox1.ClientHeight - image1.Height) div 2
      else
        image1.Top := 0;
    end;
    Et donc, dans le projet final, je modifie également ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // affichage : le panel containeur prend la taille de l'image qu'il va porter
    if imgDisplay.Width  <> pnl4images.Width  then pnl4images.Width  := imgDisplay.Width;
    if imgDisplay.Height <> pnl4images.Height then pnl4images.Height := absimgDisplay.Height;
    FormResize(nil);
    Bon week-end,
    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

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/08/2016, 15h02
  2. [XL-2016] Fonctionnement aléatoire d'une collection alimentant une combobox
    Par Serge_BDD dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 03/08/2016, 22h58
  3. Réponses: 3
    Dernier message: 31/03/2006, 13h40
  4. Réponses: 3
    Dernier message: 05/10/2005, 18h33
  5. Incompréhension d'une requête...
    Par tonf dans le forum Requêtes
    Réponses: 5
    Dernier message: 07/01/2005, 18h05

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