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 :

TForm & AutoScroll [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre régulier Avatar de TheFreeBerga
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 63
    Points : 77
    Points
    77
    Par défaut TForm & AutoScroll
    Bonjour @ toutes & tous,

    J'ai un problème que je ne saurai même pas exposé tellement je n'y comprends rien...
    Le contexte est le suivant, un TForm encapsulé dans l'application principale avec un alignement = alClient et la propriété AutoScroll = True.
    Je dessine des TShape un peu partout et surtout au delà de la surface visible.
    Je comptais sur la propriété AutoScoll pour pouvoir me balader partout et voir ainsi tous les objets.
    Dans l'absolue, ça fonctionne mais...et c'est là que j'arrête les explications et que je vous propose d'utiliser mon projet de test; observez ce qui se passe lors du déplacement de l'objet rectangulaire (clic gauche enfoncé) après avoir scrollé verticalement pour voir totalement l'objet triangle.

    Test1.zip

    Toutes suggestions, pistes et autres conseils sont les bienvenues parce que là, je ne sais même pas par quel bout attaquer le problème...

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Bonjour ! Ma contribution pour le moment sera très modeste parce que chez moi (Windows 8.1) le programme plante dès que j'appuie sur l'un des deux boutons.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Si je fais la modification suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      //Form2.Parent := Self;
      Form2.Parent := nil;;
    le programme fonctionne bien. L'effet obtenu est même assez amusant. Il y a juste un problème avec le trait reliant les deux figures : il ne se redessine pas comme il faut.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Membre régulier Avatar de TheFreeBerga
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    Bonjour Roland & merci de t'intéresser à mon problème.

    Petite aparté, je trouve très inquiétant qu'un petit projet de test comme celui-ci plante sous W$8.1 ...

    Concernant mon problème, tout d'abord, ne pas jouer avec le bouton "Print" sous peine de mettre le feu à la maison, trucider le chat, etc...
    Ensuite, si Form2 n'a plus de parent, elle devient une fenêtre indépendante et ce n'est pas le but du jeu, comment résoudre ça sous W$8.1 ?
    De plus, quelles que soient les circonstances, le trait de liaison se dessine toujours correctement chez moi. C'est l'objet rectangulaire qui pose problème lors de son déplacement une fois la fenêtre totalement défilée vers le bas.

    Dernier point visuel qui doit sûrement être intimement lié au précédent (ou vice versa), c'est le fond de la fenêtre qui ne reprend la couleur prédéfinie dans la zone "scrollé". Cette même zone où si l'on déplace l'objet dedans, on obtient tout un tas de déformations visuelles et la non interception de l'événement MouseUp (le rectangle reste jaune avec une bordure rouge).

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par TheFreeBerga Voir le message
    Bonjour Roland & merci de t'intéresser à mon problème.
    Pas de quoi. Malheureusement je crains de ne pas t'apporter une aide très efficace, n'étant pas du tout expert de ce genre de problème.

    Citation Envoyé par TheFreeBerga Voir le message
    Petite aparté, je trouve très inquiétant qu'un petit projet de test comme celui-ci plante sous W$8.1 ...

    Concernant mon problème, tout d'abord, ne pas jouer avec le bouton "Print" sous peine de mettre le feu à la maison, trucider le chat, etc...
    Ensuite, si Form2 n'a plus de parent, elle devient une fenêtre indépendante et ce n'est pas le but du jeu, comment résoudre ça sous W$8.1 ?
    Je ne sais pas si ça peut t'aider mais voici le code qui déclenche l'exception (c'est dans "wincontrol.inc") :

    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
    procedure TWinControl.WMSize(var Message: TLMSize);
    var
      NewLeft, NewTop: integer;
      NewBoundsRealized: TRect;
      TopParent: TControl;
      OldClientSize: TSize;
      NewClientSize: TSize;
     
      procedure RaiseLoop;
      var
        s: String;
      begin
        s:='TWinControl.WMSize loop detected, the widgetset does not like the LCL bounds or sends unneeded wmsize messages: '+DbgSName(Self)+' BoundsRealized='+dbgs(FBoundsRealized)+' NewBoundsRealized='+dbgs(NewBoundsRealized);
        if (OldClientSize.cx<>NewClientSize.cx)
          or (OldClientSize.cy<>NewClientSize.cy)
        then
          s:=s+' OldClientSize='+dbgs(OldClientSize)+' NewClientSize='+dbgs(NewClientSize);
        raise Exception.Create(s);
      end;
    Maintenant, si je comprends bien, ton code crée une fenêtre avec barres de défilement, en lui donnant comme parent une fenêtre plus petite et sans barres de défilement. On pouvait s'attendre à ce que cela ne fonctionne pas très bien, non ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Membre régulier Avatar de TheFreeBerga
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    Maintenant, si je comprends bien, ton code crée une fenêtre avec barres de défilement, en lui donnant comme parent une fenêtre plus petite et sans barres de défilement(1). On pouvait s'attendre à ce que cela ne fonctionne pas très bien, non(2) ?
    Oui(1) et Non(2). La fenêtre cliente possède un alignement alClient pour remplir toute la surface de fenêtre parent hormis le GroupBox du haut qui contient les boutons d'actions et de fait, je ne vois pas en quoi le design originale (taille) de la fenêtre cliente poserait problème ?

    D'ailleurs, à ce sujet, sous linux, si je fais comme toi, Parent := nil, la fenêtre devient indépendante, ce qui n'est absolument pas le but du jeu.
    Et sous W$8.1, comment ça réagit ? La fenêtre est toujours encapsulée dans l'application principale ou flottante ?

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par TheFreeBerga Voir le message
    La fenêtre cliente possède un alignement alClient pour remplir toute la surface de fenêtre parent hormis le GroupBox du haut qui contient les boutons d'actions et de fait, je ne vois pas en quoi le design originale (taille) de la fenêtre cliente poserait problème ?
    Tu as sûrement raison. Je dis ça sans trop savoir (mais je commence à voir un peu mieux ce que tu veux faire).

    Citation Envoyé par TheFreeBerga Voir le message
    D'ailleurs, à ce sujet, sous linux, si je fais comme toi, Parent := nil, la fenêtre devient indépendante, ce qui n'est absolument pas le but du jeu.
    Et sous W$8.1, comment ça réagit ? La fenêtre est toujours encapsulée dans l'application principale ou flottante ?
    Le comportement est le même que celui que tu décris : la fenêtre est indépendante.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Membre régulier Avatar de TheFreeBerga
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    Donc, si j'ai bien compris, mon application explose sous W$8.1 ?!?!!

    Je crois me souvenir d'avoir lu ici et là que les "anciennes" applications pouvaient ne pas fonctionner sous W$8.1 mais à ce point...

  9. #9
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par TheFreeBerga Voir le message
    Donc, si j'ai bien compris, mon application explose sous W$8.1 ?!?!!

    Je crois me souvenir d'avoir lu ici et là que les "anciennes" applications pouvaient ne pas fonctionner sous W$8.1 mais à ce point...
    Non, l'application telle que fournie plante quelque soit le système d'exploitation (Windows 2000, Windows XP voire Windows 8.1)

    Et c'est logique (si je puis dire) quand je regarde le code de création de Form2 et plus particulièrement cette ligne : Form2.Parent := Self; !

    Petit rappel, la propriété Parent sert à désigner quel contrôle est responsable du dessin d'un autre contrôle imbriqué. Cela désigne le contrôle au sein du lequel est affiché l'autre contrôle.
    Or votre fiche Form2 est autonome du moins pour l'affichage vis à vis de Form1. Elle s'affiche sur le bureau de windows et elle n'a donc pas besoin de parent pour se dessiner.

    En supprimant cette ligne, votre application ne plantera plus...
    Philippe.

  10. #10
    Membre régulier Avatar de TheFreeBerga
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    Bonsoir et merci pour ces explications.
    Une chose m'échappe cependant, d'une part ce code fonctionne correctement sous Linux et d'autre part, si je n'assigne pas Form1 comme parent de Form2, elle devient autonome et ce n'est pas le but du jeu.
    Dans ces conditions, comment faire pour obtenir le résultat voulu, à savoir une Form encapsulée dans l'application principale ?

  11. #11
    Membre régulier Avatar de TheFreeBerga
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    Bon, comme cette histoire me titille et m'inquiète, j'ai fait le changement suivant et ça fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      Form2 := TForm2.Create( {Self} nil );
      Form2.Parent := Self;
    Et sous W$ ?

  12. #12
    Membre régulier Avatar de TheFreeBerga
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    Je suis passé sous w$7 en virtualisation avec une version précédente de Lazarus mais fpc est en 2.6.4.
    Résultat, j'ai bien le crash annoncé.
    J'ai donc tracé le programme pas à pas et j'ai découvert que c'est la propriété Align := alClient qui met le changaï.
    Au final, on peut tout à fait encapsuler une Form dans une autre avec un alignement alClient moyennement quelques ajustements comme définir la Form sans bordure ni icone et le code suivant pour son alignement alClient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      Form2 := TForm2.Create(Self);
      Form2.Parent := Self;
      Form2.AutoScroll := False;
      Form2.DoubleBuffered := True;
      Form2.Visible := True;
      Form2.Left:=0; Form2.Top := GroupBox1.Top+GroupBox1.Height;
      Form2.Width:=ClientWidth; Form2.Height:=ClientHeight-Form2.Top;
      Form2.Anchors := [akLeft,akTop,akRight,akBottom];
    Me voilà rassuré, je peux aller dormir en paix !

  13. #13
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par TheFreeBerga Voir le message
    Une chose m'échappe cependant, d'une part ce code fonctionne correctement sous Linux et d'autre part, si je n'assigne pas Form1 comme parent de Form2, elle devient autonome et ce n'est pas le but du jeu.
    Dans ces conditions, comment faire pour obtenir le résultat voulu, à savoir une Form encapsulée dans l'application principale ?
    La "fiche encapsulée" doit être un cadre (type TFrame) et non une fiche (type TForm)...
    Philippe.

  14. #14
    Membre régulier Avatar de TheFreeBerga
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    63
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 63
    Points : 77
    Points
    77
    Par défaut
    Merci Philippe !
    Je me suis laisser embarquer petit à petit vers cette mauvaise voie qu'est la TForm comme conteneur de mon composant...

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/09/2003, 09h36
  2. Taille d'un TForm à l'état Maximized
    Par Altau dans le forum C++Builder
    Réponses: 2
    Dernier message: 13/06/2003, 12h57
  3. [TForm] Ne pas autoriser l'ouverture d'un form
    Par sbeu dans le forum Composants VCL
    Réponses: 6
    Dernier message: 11/10/2002, 11h20
  4. Probleme d'impression avec la méthode TForm->Print()
    Par Kid Icarus dans le forum C++Builder
    Réponses: 13
    Dernier message: 31/07/2002, 14h26

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