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 :

Organisation d'une Form


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Organisation d'une Form
    Bonjour,

    j'ai posé la question en FireMonkey, mais je remets au gout du jour une Form VCL. Et je ne m'en sors pas mieux +


    On reste donc en VCL.
    Je voudrais que le panel central paCT soit centré dans la Form lors des resize de celle-ci... Déjà on fait cela comment sur un TPanel vide ?

    Pour réaliser le TPanel centré, j'ai pris le composant le plus sophistiqué un gridPanel... J'ai un problème de programmation de ce composant pour définir les hauteurs et largeurs de ces cellules comme dans FMX d'ailleurs.

    Je veux que les TLabels laLOGIN et laPASSWORD soient autosize. Une fois ceci fait, je veux qu'il y ait un espace de 8 pixels entre le bord droit de laPASSORD, en réalité max(laLOGIN.width, laPASSWORD.width), et le bord gauche des 2 TEdits, edLOGIN et edPASSWORD (edLOGIN.Left) sachant que edLOGIN et edPASSWORD ont une taille définie et identique. Une fois ceci fait je veux que le paCT soit autosize puis centré dans la Form. Je le fais mais avec des calculs et un TPanel (pas un Gridpanel qui refuse obstinément de faire ce que je veux). Je fais exactement la même chose sans aucun calcul en Lazarus : ce sont les ancrages qui font le travail.

    Pour la partie Right-Bottom (le TPanel paRB), c'est le délire complet. Les btQUIT et btVALID ont une taille définie. Je les veux l'un à gauche de l'autre sur une même ligne horizontale. Mais un paRB autosize les place verticalement l'un au dessus de l'autre ?!

    Les Delphiens font comment avec cette approche que je n'assimile pas et qui me semble pour l'instant limitée ?

    Alors je sais cela semble anecdotique. En réalité je ne trouve pas que cela le soit. Voici de copie d'écran du même programme (là c'était en FMX avec un TGridpanelLayout) sur 2 windows, un XP et un 7.
    Le problème se trouve au niveau du label "Votre mot de passe"... Plus près en 7, il était mangé en XP... Visiblement la gestion dynamique est "moyenne". Je n'ai jamais rencontré ce problème en lazarus et pourtant les polices Win/Nux ne sont pas identiques... Peut-être est-ce la raison pour laquelle les ancrages sont si bien pensés en Lazarus.
    Dernière modification par Invité ; 24/10/2014 à 17h35.

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 125
    Par défaut
    tu le pose au centre en Design Time
    Tu définis Anchors sur [] (oui oui rien du tout, faut RETIRER Top Left)
    Et cela restera au centre et ce peut importe la taille, il calcul de lui même le centrage
    En fait le Anchors par défaut sur [Top, Left] est le moins couteux car ne nécessite aucun calcul
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    OK pour la première question... Mais pour le reste qui est quand même plus important ?

    La gestion de l'autosize des champs et de leur position relative ? Le "Votre mot de passe en XP" qui va rentrer dans le TEdit alors qu'en 7 (IDE utilisé sur cet OS), il est correct ? Je pratique comment ?

    En VCL c'est peu important. Ce qui m'inquiète plus, c'est que j'ai posé la question 2 fois déjà. Une fois en FMX Desktop et une fois en FMX mobile... Et pour les 2 je m'en suis sorti avec du calcul. A la rigueur ce n'est pas difficile sauf qu'il faut que j'automatise l'approche... Heureusement que je n'ai pas encore porté le programme en Mac OS X. Mais c'est apparenté à Nux (un maintenant lointain cousin).... Je ne vais pas refaire l'interface graphique à chaque fois, d'autant que ce sera en aveugle !

  4. #4
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 705
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 705
    Par défaut
    Citation Envoyé par selzig Voir le message
    La gestion de l'autosize des champs et de leur position relative ?
    Moi j'utiliserais un TLabeledEdit avec un LabelSpacing à 8 et LabelPosition à lpLeft.
    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 125
    Par défaut
    Citation Envoyé par selzig Voir le message
    OK pour la première question... Mais pour le reste qui est quand même plus important ?
    Laisse donc le temps de répondre !
    tu as modifié ta question, donc j'allais modifié ma réponse !


    Citation Envoyé par selzig Voir le message
    Pour réaliser le TPanel centré, j'ai pris le composant le plus sophistiqué un gridPanel... J'ai un problème de programmation de ce composant pour définir les hauteurs et largeurs de ces cellules comme dans FMX d'ailleurs.
    Un peu comme un Java avec du swing et ses Layout (Flow, Grid)

    Citation Envoyé par selzig Voir le message
    Je veux que les TLabels laLOGIN et laPASSWORD soient autosize. Une fois ceci fait, je veux qu'il y ait un espace de 8 pixels entre le bord droit de laPASSORD, en réalité max(laLOGIN.width, laPASSWORD.width), et le bord gauche des 2 TEdits, edLOGIN et edPASSWORD (edLOGIN.Left) sachant que edLOGIN et edPASSWORD ont une taille définie et identique. Une fois ceci fait je veux que le paCT soit autosize puis centré dans la Form. Je le fais mais avec des calculs et un TPanel (pas un Gridpanel qui refuse obstinément de faire ce que je veux). Je fais exactement la même chose sans aucun calcul en Lazarus : ce sont les ancrages qui font le travail.
    J'aurais aussi pensé au TLabeledEdit mais il ne va pas gérer le plus grand label des deux !

    Copie directement cet extrait de DFM sur un TForm vide
    le copier-coller d'un texte DFM va créer les objets dans le PAS et le DFM
    Tu peux modifier les libellés cela va décaler les Edit

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    object pnlLabelEdit: TPanel
      Left = 114
      Top = 87
      Width = 334
      Height = 64
      Anchors = []
      BevelOuter = bvNone
      Caption = 'pnlLabelEdit'
      Color = clAqua
      ParentBackground = False
      TabOrder = 0
      ExplicitLeft = 113
      ExplicitTop = 84
      object pnlLabels: TPanel
        Left = 0
        Top = 0
        Width = 79
        Height = 64
        Align = alLeft
        AutoSize = True
        BevelOuter = bvNone
        Caption = 'pnlLabels'
        Color = 15699509
        ParentBackground = False
        ShowCaption = False
        TabOrder = 0
        ExplicitHeight = 42
        object lbl1: TLabel
          AlignWithMargins = True
          Left = 9
          Top = 11
          Width = 32
          Height = 13
          Margins.Left = 8
          Margins.Top = 0
          Margins.Right = 0
          Margins.Bottom = 0
          Caption = 'login : '
        end
        object lbl2: TLabel
          AlignWithMargins = True
          Left = 8
          Top = 38
          Width = 71
          Height = 13
          Margins.Left = 8
          Margins.Top = 0
          Margins.Right = 0
          Margins.Bottom = 0
          Caption = 'mot de passe :'
        end
      end
      object pnlEdits: TPanel
        AlignWithMargins = True
        Left = 87
        Top = 8
        Width = 239
        Height = 48
        Margins.Left = 8
        Margins.Top = 8
        Margins.Right = 8
        Margins.Bottom = 8
        Align = alClient
        AutoSize = True
        BevelOuter = bvNone
        Caption = 'pnlEdits'
        Color = 9685681
        ParentBackground = False
        TabOrder = 1
        ExplicitHeight = 73
        object ed2: TEdit
          Left = 0
          Top = 27
          Width = 164
          Height = 21
          TabOrder = 0
          Text = 'ed2'
        end
        object ed1: TEdit
          Left = 0
          Top = 0
          Width = 164
          Height = 21
          TabOrder = 1
          Text = 'ed1'
        end
      end
    end




    Citation Envoyé par selzig Voir le message
    Pour la partie Right-Bottom (le TPanel paRB), c'est le délire complet. Les btQUIT et btVALID ont une taille définie. Je les veux l'un à gauche de l'autre sur une même ligne horizontale. Mais un paRB autosize les place verticalement l'un au dessus de l'autre ?!
    Pas compris le besoin ni le problème
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Un peu comme un Java avec du swing et ses Layout (Flow, Grid)
    Je ne pense pas être aller aussi loin en Java... surtout en swing. Aucun souvenir.


    Citation Envoyé par ShaiLeTroll Voir le message
    Si tu veux repasser en TPanel au lieu de TGridPanel
    Je n'en sais rien. Je cherche une approche cohérente. A terme ce ne sera que du FireMonkey. Les outils FireMonkey sont plus compliqués. J'ai peu de points de repère. Pour comprendre la philosophie Delphi, je pars du VCL. Je sais que ce n'est pas nécessairement une bonne méthode... Mais faute de mieux, cela permet de cogiter.

    Mais je sais 2 choses.
    1. J'ai déjà travaillé sur le transfert FMX Win Desktop vers FMX Androîd (mobile). Je n'en tire aucune conclusion à ce niveau de l'organisation des Forms. Des univers totalement différents, donc je n'attendais rien de particulier. Mais Delphi m'ouvre des horizons "inespérés" compte tenu de mon niveau de "mobile".
    2. Par contre pour le portage Win/Mac OS X/Linux alors là j'ai déjà donné (Lazarus/Qt...). J'ai un niveau d'exigence. Et je sais que le Designer et ses outils sont d'une importance capitale. D'autant plus qu'avec Delphi, on joue en aveugle. En Qt et Lazarus, on dispose du Designer dans l'OS cible. Donc compte tenu de cette caractéristique de Delphi, mes outils doivent être performants c'est-à dire la manière dont j'emploie les outils qui sont à ma disposition dans Delphi ou les méthodes de substitution qu'il va me falloir développer. J'en suis au stade de ne pas savoir si c'est moi qui n'arrive pas à m'adapter à ces Panels/Layouts ou si conceptuellement, ils sont "faiblards" et mal adaptés à mes approches du développement Desktop multi-plateforme. Et compte tenu de ce que je vois dans l'IO de ces objets, je pose des questions... faiblards par rapport à d'autres approches évidemment : si pour obtenir, un affichage "portable" (i.e. sans défaut en mac OS X), il me faut pour centrer mes champs 15 layouts emboîtés les uns dans les autres, ce n'est pas jouable. Il vaut mieux gérer le problème autrement. Donc comme je l'ai écrit dans le forum FMX autant automatisé l'approche et même créer un composant si nécessaire... Quiqu'en FMX, la création de composant semble bien différer de celle en Lazarus (ou probablement de VCL).

    Citation Envoyé par ShaiLeTroll Voir le message
    Pas compris le besoin ni le problème
    Peu important. Je voulais aligner horizontalement en bas à droite de ma Form, une série de boutons espacés régulièrement et corrigée (la série affichée) si certains boutons sont invisibles. Je fais cela usuellement en Lazarus/Qt sans aucun code particulier.

    J'oubliais pour l'Autosize. Pour moi, il est indispensable (y compris pour les boutons). Toutes mes productions au lycée sont bilingues. Vous imaginez le problème avec des champs de longueurs (width) fixes ? Cela m'évoque d'ailleurs une discussion avec Paul... On a déjà parlé de cela... Et je ne me rappelle plus de ce qu'il a proposé. Je fouille.

    [addendum 17:40]
    OK, j'ai retrouvé la discussion. Elle n'était pas avec Paul mais avec... ShaiLeTroll (tiens, tiens...) >> http://www.developpez.net/forums/d12...sation-projet/ et une autre justement sur ce problème que j'avais évoqué lors de l'essai d'une version trial sur le même sujet qui n'était pas prépondérant à l'époque... et qui est enterrée au fond de ma mémoire. A l'époque je ne pensais pas développer un jour "prochain" avec Delphi... Comme quoi. >> http://www.developpez.net/forums/d13...ancrer-objets/
    Dernière modification par Invité ; 24/10/2014 à 18h46.

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 125
    Par défaut
    Une variante qui correspond parfaitement à tes images
    En utilisant une Constraints sur le Panel des Edits
    Ainsi le Panel LabelEdit doit s'agrandir pour que le Panel Edit conserve sa Constrainte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TZooVCLTestAlignForm.ed2Change(Sender: TObject);
    begin
      lbl2.Caption := ed2.Text;
    end;
    Code dfm : 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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    object pnlLabelEdit: TPanel
      Left = 122
      Top = 62
      Width = 266
      Height = 64
      Anchors = []
      AutoSize = True
      BevelOuter = bvNone
      Caption = 'pnlLabelEdit'
      Color = clAqua
      ParentBackground = False
      TabOrder = 0
      object pnlLabels: TPanel
        Left = 0
        Top = 0
        Width = 79
        Height = 64
        Align = alLeft
        AutoSize = True
        BevelOuter = bvNone
        Caption = 'pnlLabels'
        Color = 15699509
        ParentBackground = False
        ShowCaption = False
        TabOrder = 0
        object lbl1: TLabel
          AlignWithMargins = True
          Left = 9
          Top = 11
          Width = 32
          Height = 13
          Margins.Left = 8
          Margins.Top = 0
          Margins.Right = 0
          Margins.Bottom = 0
          Caption = 'login : '
        end
        object lbl2: TLabel
          AlignWithMargins = True
          Left = 8
          Top = 38
          Width = 71
          Height = 13
          Margins.Left = 8
          Margins.Top = 0
          Margins.Right = 0
          Margins.Bottom = 0
          Caption = 'mot de passe :'
        end
      end
      object pnlEdits: TPanel
        AlignWithMargins = True
        Left = 87
        Top = 8
        Width = 171
        Height = 48
        Margins.Left = 8
        Margins.Top = 8
        Margins.Right = 8
        Margins.Bottom = 8
        Align = alClient
        AutoSize = True
        BevelOuter = bvNone
        Caption = 'pnlEdits'
        Color = 9685681
        Constraints.MinWidth = 170
        ParentBackground = False
        TabOrder = 1
        ExplicitWidth = 239
        object ed2: TEdit
          Left = 0
          Top = 27
          Width = 164
          Height = 21
          TabOrder = 0
          Text = 'ed2'
          OnChange = ed2Change
        end
        object ed1: TEdit
          Left = 0
          Top = 0
          Width = 164
          Height = 21
          TabOrder = 1
          Text = 'ed1'
        end
      end
    end
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Invité
    Invité(e)
    Par défaut
    OK et merci pour l'exemple que j'ai un petit peu analysé (le premier) faute de temps. Mais je reverrai demain.

    Cela fonctionne presque comme je veux (dans cet exemple) :
    • OK : si on modifie le caption d'un des TLabels, le TPanel varie automatiquement en largeur.
    • Moins bien : La largueur utile est trop importante : le pnLabelEdit et le pnEdit sont trop longs. Je voudrais qu'ils collent au contenu (aux TEdits) notamment à droite.



    PS : Modifier le dfm n'est pas suffisant. Il faut ajouter les uses nécessaires. Mais ceci fait, bien que le programme fonctionne, qu'il ne plante pas, un lbl2.caption=''; n'est pas reconnu. J'ai dû ajouter à la main dans le code de la TForm un lbl2: TLabel...

    Encore merci pour votre aide.

  9. #9
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par selzig Voir le message
    Le problème se trouve au niveau du label "Votre mot de passe"... Plus près en 7, il était mangé en XP... Visiblement la gestion dynamique est "moyenne". Je n'ai jamais rencontré ce problème en lazarus et pourtant les polices Win/Nux ne sont pas identiques... Peut-être est-ce la raison pour laquelle les ancrages sont si bien pensés en Lazarus.
    quelle est la police utilisé ? si elle n'existe pas sous XP Windows la remplace au pif et ça peu donner n'importe quoi.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  10. #10
    Invité
    Invité(e)
    Par défaut
    Bonjour Paul,

    En général en Lazarus (donc Win/Nux), je ne définis pas la police. Donc est utilisée celle retenue par l'OS par défaut . Je n'ai commencé à "imposer" des polices qu'avec Qt. C'est plus simple parce que je peux utiliser la même approche qu'en HTML (i.e. une liste de polices substituables en cas d'absence).

    Bonjour ShaiLeTroll,

    Cela fonctionne. Je suis en train de me construire un tuto. Une fois le principe et les approches définis, c'est effectivement gérable. Mais jusqu'à preuve du contraire, j'estime que c'est nettement plus compliqué que Qt et Lazarus... et même si je n'en ai pas la certitude, ni encore l'argumentation, disons moins adapté que ce que je pratique et veux obtenir en référence à Qt, Lazarus et Windev... Cela fait beaucoup quand même.

    Pour me faire la main, je reproduis cet exemple simple :
    Description Form1
    A gauche en haut : Button1 (ancré)
    A droite en haut : Button2 (ancré).
    Entre les 2TButton, TStringGrid1 dont les bords verticaux devront rester exactement à 24 pixels des bords opposés des boutons. Et le bord inférieur de la TStringGrid devra atteindre exactement la moitié de la hauteur de la Form.
    Sous les 2 bouttons : une Tlist qui devra rester exactement alignée sous les 2 boutons et devra descendre jusqu'à 24 px du bord inférieur de la Form. Enfin, si possible, les bords jaune aurant une épaisseur constante quelque soit la taille de la page. Je précise si c'est possieble parce que Delphi semble utiliser un ratio lorsqu'il calcule. Autrement dit si la distance séparant 2 objets est 12 pixels quand la Formx.width = 640, la distance devient 24 pixels quand Formx.width = 1280.

    Je vous fais le schema sans un seul TPanel ou TLayout en Lazarus (dfm dispo ci-dessous) avec les 11 points d'ancrage nécessaires. Le seul point non directement utilisable et le point de centrage de la Form (en rouge au milieu). par simplicité ici j'ai utilisé un TLabel sans caption.
    L'ancrage de la TStringGrid :

    Le résultat obtenu (La Form sous 2 tailles diffrentes et évidemment avec la même échelle de copie d'écran) :

    et le dfm (lfm)
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    object Form1: TForm1
      Left = 238
      Height = 232
      Top = 145
      Width = 852
      Caption = 'Form1'
      ClientHeight = 232
      ClientWidth = 852
      LCLVersion = '1.2.0.3'
      object Button1: TButton
        AnchorSideLeft.Control = Owner
        AnchorSideTop.Control = Owner
        Left = 18
        Height = 25
        Top = 12
        Width = 75
        BorderSpacing.Left = 18
        BorderSpacing.Top = 12
        Caption = 'Button1'
        TabOrder = 0
      end
      object Button2: TButton
        AnchorSideTop.Control = Button1
        AnchorSideRight.Control = Owner
        AnchorSideRight.Side = asrBottom
        Left = 759
        Height = 25
        Top = 12
        Width = 75
        Anchors = [akTop, akRight]
        BorderSpacing.Right = 18
        Caption = 'Button2'
        TabOrder = 1
      end
      object ListBox1: TListBox
        AnchorSideLeft.Control = Button1
        AnchorSideTop.Control = Button1
        AnchorSideTop.Side = asrBottom
        AnchorSideRight.Control = Button1
        AnchorSideRight.Side = asrBottom
        AnchorSideBottom.Control = Owner
        AnchorSideBottom.Side = asrBottom
        Left = 18
        Height = 171
        Top = 37
        Width = 75
        Anchors = [akTop, akLeft, akRight, akBottom]
        BorderSpacing.Bottom = 24
        ItemHeight = 0
        TabOrder = 2
      end
      object ListBox2: TListBox
        AnchorSideLeft.Control = Button2
        AnchorSideTop.Control = Button2
        AnchorSideTop.Side = asrBottom
        AnchorSideRight.Control = Button2
        AnchorSideRight.Side = asrBottom
        AnchorSideBottom.Control = Owner
        AnchorSideBottom.Side = asrBottom
        Left = 759
        Height = 171
        Top = 37
        Width = 75
        Anchors = [akTop, akLeft, akRight, akBottom]
        BorderSpacing.Bottom = 24
        ItemHeight = 0
        TabOrder = 3
      end
      object StringGrid1: TStringGrid
        AnchorSideLeft.Control = Button1
        AnchorSideLeft.Side = asrBottom
        AnchorSideTop.Control = Button1
        AnchorSideRight.Control = Button2
        AnchorSideBottom.Control = ptCenter
        Left = 117
        Height = 104
        Top = 12
        Width = 618
        Anchors = [akTop, akLeft, akRight, akBottom]
        BorderSpacing.Left = 24
        BorderSpacing.Right = 24
        TabOrder = 4
      end
      object ptCenter: TLabel
        AnchorSideLeft.Control = Owner
        AnchorSideLeft.Side = asrCenter
        AnchorSideTop.Control = Owner
        AnchorSideTop.Side = asrCenter
        Left = 426
        Height = 1
        Top = 116
        Width = 1
        ParentColor = False
      end
    end
    J'ai privilégié Lazarus pour le test parce qu'en Qt l'approche est plus compliquée disons mal aisée pour agrandir la Grid et la faire coller au 2 QPushButton. Le système Lazarus est conceptuellement le meilleur système que j'ai pu rencontrer : simple et puissant à la fois. Je ne dis pas (encore) que celui de Delphi ne permet pas de réaliser mon approche mais déjà, il faut remarquer que celui de Lazarus est centralisé sur une seule propriété de chaque objet à ancrer (enfin plusieurs regroupées en un même "lieu" cf la copie d'écran ci-dessus) alors que sous Delphi, il faut jouer avec des propriétés différentes (i.e. non regroupées) et des Layouts (donc couches supplémentaires)... Prise de tête en vue car je refuse de régresser à ce niveau... Toute aide est bienvenue pour me permettre de m'adapter.

    Don en Delphi, je place les mêmes éléments sur ma Form. J'enlève pour le recalcul les akLeft et akTop, qui comme vous l'indiquez empêche les recalculs et donc j'obtiens ceci.

    Si je réduis la taille de la Form ou l'augmente :

    Dernière modification par Invité ; 25/10/2014 à 12h25.

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 708
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    pour faire ce dernier écran , j'aurais procédé (vite fait) de la manière suivante :

    bouton1 et colonne1 dans un panel1 (aligné à gauche, avec marges)
    bouton2 et colonne2 idem dans un panel2 mais aligné à droite
    et enfin la grid alignée soit client avec peut être contrainte de taille max en hauteur , soit en haut (toujours avec marges)

    bon c'est vrai les panels sont peut être superflus et remplaçables par des ancrages mais dans ce cas , il faut alors ancrer également la grid

    en d7
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    object Form1: TForm1
      Left = 209
      Top = 102
      Width = 832
      Height = 328
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      DesignSize = (
        816
        289)
      PixelsPerInch = 96
      TextHeight = 13
      object Button1: TButton
        Left = 24
        Top = 24
        Width = 113
        Height = 25
        Caption = 'Button1'
        TabOrder = 0
      end
      object Memo1: TMemo
        Left = 24
        Top = 64
        Width = 113
        Height = 201
        Anchors = [akLeft, akTop, akBottom]
        Lines.Strings = (
          'Memo1')
        TabOrder = 1
      end
      object StringGrid1: TStringGrid
        Left = 152
        Top = 24
        Width = 504
        Height = 153
        Anchors = [akLeft, akTop, akRight]
        TabOrder = 2
      end
      object Button2: TButton
        Left = 672
        Top = 24
        Width = 113
        Height = 25
        Anchors = [akTop, akRight]
        Caption = 'Button2'
        TabOrder = 3
      end
      object Memo2: TMemo
        Left = 672
        Top = 64
        Width = 113
        Height = 201
        Anchors = [akTop, akRight, akBottom]
        Lines.Strings = (
          'Memo1')
        TabOrder = 4
      end
    end

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour Serge,

    Ce que je n'arrive pas à comprendre c'est la "ballade" des objets les uns par rapport aux autres... puisque tout est défini par rapport à la Form...

    Il y a un truc qui me laisse coi : Tu vois, je place mes 5 éléments. Je "laisse" calculer comme ci-dessus. Le résultat obtenu est significatif : il doit être corriger.

    Tu fais la même chose en Lazrus, d'abord il ne fait rien par défaut. Ensuite tu ajoutes tes contraintes, relativement objet par objet et prenant comme base l'objet de ton choix pour indiquer la référence du traitement à accomplir. Je ne peux pas faire cela en Delphi... Donc je dois trouver une approche différente.

    En Delphi, conceptuellement, il y a un truc qui m'échappe. Au départ, il ne se passe rien, tu n'as rien à corriger puisque akLeft et akTop sont sélectionnés. Ensuite...
    Maintenir la longueur d'un intervalle quelque soit la taille de la Form ? Je veux maintenir aucun espace entre le bord inférieur du bouton et le bord supérieur du ListBox. Je lui indique cela comment ? C'est quand même pas lui qui va décider ?
    Ensuite en supposant que j'utilise un TPanel, comment j'intègre mes 24 px entre le bord droit de mon bouton et le bord gauche de ma StringGrid ? Un autre TPanel ?
    Quel est intéret du TPanel ? Il n'est pas fixable autrement que les autres objets graphiques. Que je place mon TButton dans un TPanel qui lui est réservé qu'est-ce que cela apporte de plus ?

    J'ai par contre partiellement compris l'intérêt des TGridPanel et TGridPanelLayout sauf que leur RowSpan et le ColSpan n'en sont pas... mais permettent de placer sur les intersections... et que la gestion des width et height des col et row est bizarre... Enfin chez moi, elles ne répondent pas comme attendu.... mais j'attends peut-être l'impossible. Finement et à volonté du programmeur, c'est possible ?
    Dernière modification par Invité ; 25/10/2014 à 12h44.

  13. #13
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 708
    Billets dans le blog
    65
    Par défaut
    Gilles,

    je n'ai jamais vraiment adhéré au TGridPanel et TGridlayout (vieux delphiste habitué a peu )
    Quel est intéret du TPanel ? Il n'est pas fixable autrement que les autres objets graphiques. Que je place mon TButton dans un TPanel qui lui est réservé qu'est-ce que cela apporte de plus ?
    les panels sont gérés par les propriétés align (bien que tu puisses bien sur les ancrer) et les ancrages par contre sont par rapport au parent et non par rapport à la forme (toujours vieux delphiste quant on a pas on fait avec ce qu'on a ,d3 n'a même pas d'ancrages , d7 pas de margins )

    j'ai quelque peu modifié mon dernier post (pendant que toi aussi d'ailleurs ) et la proposition D7 (uniquement ancrage) n'a pas le comportement que tes dernières images écrans montre , mais bien le même que tes écrans lazarus

    [Edit] PS. idem avec XE4 , cependant il y a juste un truc concernant la grid , tu veux quelle soit extensible en hauteur/largeur ou juste en largeur ? ou ?...
    juste pour essai , j'ai mis une valeur maxheight pour la grid avec un ancrage haut+bas et là , je "tombe" sur un truc pas prévu , je ne peux plus agrandir au max la forme


    Serge

Discussions similaires

  1. [VB.NET]Comment Imprimer une form
    Par bernard06 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/10/2011, 18h43
  2. [VB6] [Excel] Feuille dans une form, sans excel installé
    Par ro2v dans le forum Installation, Déploiement et Sécurité
    Réponses: 3
    Dernier message: 05/05/2010, 13h45
  3. ouverture d'une form en fondu transparent
    Par nicholz dans le forum Composants VCL
    Réponses: 9
    Dernier message: 08/01/2003, 12h06
  4. [VB6] masquer la barre de titre d'une form
    Par tiboleo dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 09/12/2002, 18h54
  5. [VB6][Formulaire]Appliquer un Scrollbar a une Form
    Par Boil dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 09/11/2002, 04h51

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