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

Composants VCL Delphi Discussion :

Alignement de composants dynamiques dans une ScrollBox


Sujet :

Composants VCL Delphi

  1. #1
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 260
    Points : 171
    Points
    171
    Par défaut Alignement de composants dynamiques dans une ScrollBox
    Bonjour,

    J'ai une petit souci d'alignement lors de la création de composants dynamiques sur une "ScrollBox"

    Première ouverture du formulaire :
    - l'ordre de création des composants est dans le sens des colonnes du "DBGrid", ça c'est OK "for I := 0 to DbGrid.Columns.Count -1 Do"
    - "ScrollBox" Barre verticale visible.

    Pièce jointe 237619

    Seconde ouverture du formulaire :
    - Les premiers composants créés se retrouvent en bas de la "ScrollBox".
    - "ScrollBox" Barre verticale invisible.

    Pièce jointe 237623

    Merci pour votre aide.
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  2. #2
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 260
    Points : 171
    Points
    171
    Par défaut
    J'ai testé en inversent ma boucle for
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for I := DbGrid.Columns.Count -1 downto 0 Do
    Toujours le mémé problème mes a l'inverse, lors de la seconde ouverture du formulaire le sens des composants sons inversé.

    Première & Seconde ouverture du formulaire:
    "ScrollBox" Barre verticale visible.

    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
    procedure TForm1.BtnFormulaireClick(Sender: TObject);
    var
      I: Integer;
    begin
      for I := DbGrid.Columns.Count -1 downto 0 Do
       begin
     
         case DbGrid.Columns[I].Field.DataType of
     
           ftString, ftInteger, ftFloat, ftAutoInc:
            begin
              with TDbEdit.Create(FFormulaire) do
                begin
                  Parent := FFormulaire.ScrollBox;
                  Align := alTop;
                  AlignWithMargins := True;
                  DataSource := Form1.DataSource;
                  DataField := DbGrid.Columns[I].Title.Caption;
     
                  if DbGrid.Columns[I].Field.DataType = ftAutoInc then
                   ReadOnly := True else ReadOnly := False;
                end;
            end;
     
           ftMemo:
            begin
              with TDbMemo.Create(FFormulaire) do
                begin
                  Parent := FFormulaire.ScrollBox;
                  Align := alTop;
                  AlignWithMargins := True;
                  Height := 400;
                  ScrollBars := ssBoth;
                  DataSource := Form1.DataSource;
                  DataField := DbGrid.Columns[I].Title.Caption;
                end;
            end;
         end;
       end;
     
      ClientDataSet.Edit;
      FFormulaire.ShowModal;
      ClientDataSet.Post;
     
      with FFormulaire do
       begin
        for I := ComponentCount -1 downto 0 Do
         begin
           if (Components[I] is TDbEdit) or (Components[I] is TDbCheckBox) or
           (Components[I] is TDbMemo) then Components[I].Free;
         end;
       end;
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu n'aurais pas des problèmes de libération-allocation ?
    FFormulaire, tu ne devrais pas garder une instance globale, tu te gères manuellement la libération, c'est inutile, laisse le Owner\Parent de le faire en libération la fenêtre hote !

    Align alTop, tous les controles sont créés en Top 0, c'est la VCL qui décide de l'ordre, c'est maladroit, genre manuellement la position Y et utilise les Anchors


    Avec ce code, en XE2, aucun problème lié au style

    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
    //------------------------------------------------------------------------------
    procedure TSLTBrowserOracleQueryForm.ShowEdits(ADBGrid: TDBGrid);
    var
      Form: TForm;
      ScrollBox: TScrollBox;
      I, Y: Integer;
      FieldLabel: TLabel;
      FieldEdit: TDBEdit;
      AllFields: TDBGrid;
    begin
      Form := TForm.Create(nil);
      try
        Form.Position := poMainFormCenter;
        Form.Width := Screen.WorkAreaWidth div 2;
        Form.Height := Screen.WorkAreaHeight div 2;
     
        ScrollBox := TScrollBox.Create(Form);
        ScrollBox.Parent := Form;
        ScrollBox.Align := alClient;
     
        Y := 8;
        for I := 0 to ADBGrid.Columns.Count - 1 do
        begin
          FieldLabel := TLabel.Create(Form);
          FieldLabel.Parent := ScrollBox;
          FieldLabel.Caption := Format('%s [%s]', [ADBGrid.Columns.Items[I].Title.Caption, ADBGrid.Columns.Items[I].FieldName]);
          FieldLabel.Top := Y;
          FieldLabel.Left := 8;
          FieldLabel.Width := ScrollBox.ClientWidth - 16;
          FieldLabel.Anchors := [akLeft, akTop, akRight];
          Inc(Y, FieldLabel.Height + 4);
     
          FieldEdit := TDBEdit.Create(Form);
          FieldEdit.Parent := ScrollBox;
          FieldEdit.DataSource := ADBGrid.DataSource;
          FieldEdit.DataField := ADBGrid.Columns.Items[I].FieldName;
          FieldEdit.Top := Y;
          FieldEdit.Left := 8;
          FieldEdit.Width := ScrollBox.ClientWidth - 16;
          FieldEdit.Anchors := [akLeft, akTop, akRight];
          Inc(Y, FieldEdit.Height + 4);
        end;
     
        AllFields := TDBGrid.Create(Form);
        AllFields.Parent := ScrollBox;
        AllFields.DataSource := ADBGrid.DataSource;
        AllFields.Top := Y;
        AllFields.Left := 8;
        AllFields.Width := ScrollBox.ClientWidth - 16;
        AllFields.Anchors := [akLeft, akTop, akRight];
        Inc(Y, AllFields.Height + 4);
     
        ScrollBox.VertScrollBar.Range := Y;
        ScrollBox.HorzScrollBar.Visible := False;
        ScrollBox.HorzScrollBar.Range := 0;
     
        Form.ShowModal();
      finally
        Form.Free();
      end;
    Nom : ScrollBox DBEdit.png
Affichages : 431
Taille : 61,6 Ko
    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

  4. #4
    Membre habitué Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Janvier 2017
    Messages : 260
    Points : 171
    Points
    171
    Par défaut
    Je vais créer directement le "Form & ScrollBox" dynamiquement, je pense que sa devrait résoudre mon problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure DBTitre(Formulaire: TForm; LblParent: TScrollBox; LblCaption: String);
    begin
      with TPanel.Create(Formulaire) do
       begin
         Parent := LblParent;
         Align := alTop;
         AlignWithMargins := True;
         Alignment := taLeftJustify;
         BevelOuter := bvNone;
         Height := 20;
         Caption := '- ' + LblCaption + ' :';
       end;
    end;
    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
    procedure TForm1.BtnFormulaireClick(Sender: TObject);
    var
      I: Integer;
      Formulaire: TForm;
      ScrollBox: TScrollBox;
    begin
      Formulaire := TForm.Create(nil);
      with Formulaire do
       begin
         Font.Size := 10;
         Font.Name := 'Segoe UI';
         Position := poMainFormCenter;
         Width := 500;
         Height := Width;
       end;
     
      ScrollBox := TScrollBox.Create(Formulaire);
      with ScrollBox do
       begin
         Parent := Formulaire;
         Align := alClient;
         BorderStyle := bsNone;
         VertScrollBar.Tracking := True;
       end;
     
      for I := 0 To DbGrid.Columns.Count -1  do
       begin
         case DbGrid.Columns[I].Field.DataType of
     
           ftString, ftInteger, ftFloat, ftAutoInc:
            begin
              DBTitre(Formulaire, ScrollBox, DbGrid.Columns[I].Title.Caption);
              with TDbEdit.Create(Formulaire) do
                begin
                  Parent := ScrollBox;
                  Align := alTop;
                  AlignWithMargins := True;
                  DataSource := Form1.DataSource;
                  DataField := DbGrid.Columns[I].Title.Caption;
     
                  if DbGrid.Columns[I].Field.DataType = ftAutoInc then
                   ReadOnly := True else ReadOnly := False;
                end;
            end;
     
           ftMemo:
            begin
              DBTitre(Formulaire, ScrollBox, DbGrid.Columns[I].Title.Caption);
              with TDbMemo.Create(Formulaire) do
                begin
                  Parent := ScrollBox;
                  Align := alTop;
                  AlignWithMargins := True;
                  Height := 400;
                  ScrollBars := ssBoth;
                  DataSource := Form1.DataSource;
                  DataField := DbGrid.Columns[I].Title.Caption;
                end;
            end;
         end;
       end;
     
      ClientDataSet.Edit;
      Formulaire.ShowModal;
      ClientDataSet.Post;
      Formulaire.Free;
    end;
    Vous ne pouvez pas faire confiance à un code que vous n'avez pas totalement rédigé vous-même.

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

Discussions similaires

  1. Composant dynamique
    Par leycho dans le forum Composants VCL
    Réponses: 1
    Dernier message: 29/12/2005, 16h14
  2. problème de destruction de composants dynamique
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 23/08/2005, 10h39
  3. [FLASH MX] Nom de composant dynamique
    Par bobgeldof7 dans le forum Flash
    Réponses: 2
    Dernier message: 12/11/2004, 23h07
  4. [THandle][DLL] Composant dynamique et THandle
    Par el_diablos dans le forum Langage
    Réponses: 10
    Dernier message: 01/07/2004, 15h01
  5. [JTabbedPane] Accès à des composants dynamiques
    Par SamRay1024 dans le forum Composants
    Réponses: 8
    Dernier message: 26/05/2004, 13h04

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