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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 506
    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.

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

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 506
    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;

  3. #3
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    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 094
    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 : 503
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 expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Janvier 2017
    Messages : 506
    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;

+ 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