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

Langage Delphi Discussion :

[Delphi XE8] Générer des tableaux.


Sujet :

Langage Delphi

  1. #1
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut [Delphi XE8] Générer des tableaux.
    Bonjour à tous,

    Je voulais demander à une âme charitable un petit exemple de code ou bien des indices afin de coder des tableaux à proprement parler (pas des tab[], etc) je veux dessiner des tableaux afin d'afficher des tables de ma BDD. DOnc des colones, des lignes, et si possible quelque chose de générique style :

    Tab.Create(nbLigne, nbColone);

    Et bim, sa génère ! Le problème c'est que je ne vois pas du tout comment m'y prendre. J'ai essayé de multiple façon et j'n'ai pas réussis à en venir à bout. On m'a dit par ailleurs que l'on pouvait faire des tableaux à l'aide d'élément TPanel.

    En vous remerciant d'avance,
    Bien Cordialement,

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour et je pense Bienvenue,

    si par tableau il ne s'agit pas de tableau excel, et s'il s'agit de VCL alors le composant TDBGrid est là pour ça
    s'il s'agit de FMX le composant TGrid est AMHA un peu trop limité et la solution de TMS (TMSGrid) est nettement plus aboutie
    à moins qu'il s'agisse de tableau en mémoire ?
    la demande n'est pas très claire merci de préciser
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  3. #3
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Merci et bonjour !

    C'est exactement cela, j'ai essayé d'avancer ce matin malheureusement, la mâtiné s'achève déjà et je n'ai pas réussis à finaliser mon début de projet.
    Citation Envoyé par SergioMaster Voir le message
    si par tableau il ne s'agit pas de tableau excel, et s'il s'agit de VCL alors le composant TDBGrid est là pour ça [..]
    Le code :
    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
    unit Unit1;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.Grids, Vcl.DBGrids;
     
    type
      TForm3 = class(TForm)
      DBGrid1:                TDBGrid;
     
      procedure               OnCreate(Sender: TObject);
      procedure               OnResize(Sender: TObject);
     
      public
     
      private
     
        procedure             FixDBGridColumnsWidth(const DBGrid: TDBGrid);
     
      end;
     
    var
      Form3:                  TForm3;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm3.OnCreate(Sender: TObject);
    begin
      DBGrid1.DataSource.DataSet.FieldByName('FistName').Tag := 40;
      DBGrid1.DataSource.DataSet.FieldByName('LastName').Tag := 4 + Canvas.TextWidth(
      DBGrid1.DataSource.DataSet.FieldByName('LastName').DisplayName);
    end;
     
    procedure TForm3.OnResize(Sender: TObject);
    begin
      FixDBGridColumnsWidth(DBGrid1);
    end;
     
    procedure FixDBGridColumnsWidth(const DBGrid: TDBGrid);
    var
      i : integer;
      TotWidth : integer;
      VarWidth : integer;
      ResizableColumnCount : integer;
      AColumn : TColumn;
    begin
      TotWidth := 0;
      VarWidth := 0;
      ResizableColumnCount := 0;
     
      for i := 0 to -1 + DBGrid.Columns.Count do
      begin
        TotWidth := TotWidth + DBGrid.Columns[i].Width;
        if DBGrid.Columns[i].Field.Tag = 0 then
          Inc(ResizableColumnCount);
      end;
     
      if dgColLines in DBGrid.Options then
        TotWidth := TotWidth + DBGrid.Columns.Count;
     
      if dgIndicator in DBGrid.Options then
        TotWidth := TotWidth + IndicatorWidth;
     
      VarWidth :=  DBGrid.ClientWidth - TotWidth;
     
      if ResizableColumnCount > 0 then
        VarWidth := varWidth div ResizableColumnCount;
     
      for i := 0 to -1 + DBGrid.Columns.Count do
      begin
        AColumn := DBGrid.Columns[i];
        if AColumn.Field.Tag = 0 then
        begin
          AColumn.Width := AColumn.Width + VarWidth;
          if AColumn.Width.ToBoolean then
            AColumn.Width := AColumn.Field.Tag;
        end;
      end;
     
    end;
     
    end.
    Une seule erreur que je ne comprend pas du tout, j'ai trituré cette ligne dans tout les sens au niveau des arguments comme au niveau des forward/external/overload à ajouter en fin de ligne.
    La ligne qui bug:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure             FixDBGridColumnsWidth(const DBGrid: TDBGrid);
    (Msg debug: "Erreur fatale: Déclaration forward ou external non satisfaite")


    Donc, je reformule, en effet, je souhaite créer un tableau visuel à l'écran avec colonnes, titres de colones, lignes, etc. Afin d'afficher une table SQL à l'intérieur de mon programmme visible par le client.
    En vous remerciant ! (Je débute en Pascal, j'ai commencé ce langage lundi dernier..)

    Bonne journée,
    Bien Cordialement,
    M.L

    Edit: site sympa pour par exemple TDBGrid (http://helpcentral.componentone.com/...p/truedbgrid8/)

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    tout simplement

    En corrigeant implementation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure TForm3.FixDBGridColumnsWidth(const DBGrid: TDBGrid);
    FixDBGridColumnsWidth est déclaré en private de TForm3 dans la partie interface
    Dans la partie implementation, il faut conserver le lien qu'il y a entre FixDBGridColumnsWidth et TForm3 sous la forme procedure NomDeClasse.NomDeMethode.

    Une AUTRE approche

    En corrigeant interface

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private
     
        procedure             FixDBGridColumnsWidth(const DBGrid: TDBGrid);
     
      end;

    devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private
     
      end;
     
     
    procedure FixDBGridColumnsWidth(const DBGrid: TDBGrid);
    Cette fois ci FixDBGridColumnsWidth est après le end donc c'est en dehors de TForm3
    Ce n'est plus une méthode mais un simple procédure


    Cette fonction FixDBGridColumnsWidth n'est pas nécessaire,
    commence déjà par la base avant de jouer avec de ce genre de
    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

  5. #5
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Okay, c'est compris, je te remercie !


    Dernière chose, j'ai bien simplifié le code du coup et viré tout le useless, voilà se qu'il me reste, une fonction qui est appelé à la création de TForm.
    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
    begin
      DBGrid1.Columns.Add;
      DBGrid1.Columns.Add;
      DBGrid1.Columns.Add;
      DBGrid1.Columns.Add;
     
      DBGrid1.Columns[0].Width := 50;
      DBGrid1.Columns[1].Width := 50;
      DBGrid1.Columns[2].Width := 50;
      DBGrid1.Columns[3].Width := 50;
      DBGrid1.Columns[4].Width := 50;
     
      DBGrid1.Columns[0].FieldName := 'champ1';
      DBGrid1.Columns[1].FieldName := 'champ1';
      DBGrid1.Columns[2].FieldName := 'champ1';
      DBGrid1.Columns[3].FieldName := 'champ1';
      DBGrid1.Columns[4].FieldName := 'champ1';
     
      DBGrid1.Columns[0].Title.Alignment := taCenter;
      DBGrid1.Columns[1].Title.Alignment := taCenter;
      DBGrid1.Columns[2].Title.Alignment := taCenter;
      DBGrid1.Columns[3].Title.Alignment := taCenter;
      DBGrid1.Columns[4].Title.Alignment := taCenter;
     
      DBGrid1.Columns[0].Title.Font.Color := clGreen;
      DBGrid1.Columns[1].Title.Font.Color := clGreen;
      DBGrid1.Columns[2].Title.Font.Color := clGreen;
      DBGrid1.Columns[3].Title.Font.Color := clGreen;
      DBGrid1.Columns[4].Title.Font.Color := clGreen;
     
      { Grid1.Columns[0].PickList.Add('tem1'); }
    end;
    Je souhaiterais savoir si vous avez une idée pour ajouter des lignes et non pas des colonnes, puis je souhaiterais par la suite les remplir.

    Merci d'avance,

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    une DBGrid est normalement lié à un datasource (celui de la table)
    le remplissage se fait automatiquement (à partir du moment ou le datasource est lié)
    rajouter une ligne revient à faire une insertion d'un enregistrement

    en gros et rapidement voici ce qu'il faut pour afficher une table dans un "tableau" avec VCL
    (utilisation de FireDac/Firebird pour les données , pas une once de code)
    Nom : Capture.PNG
Affichages : 422
Taille : 36,4 Ko
    que tu retailles ensuite les colonnes, recolorise les entêtes n'est pas forcément une obligation si tu indiques tout cela dans les propriétés des colonnes : columns
    (quoique pour la taille des colonnes j'ai un doute .... trop tard j'ai pas sauvegardé)
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Merci Sergio au Top !

    Du coup, j'ai fais sans code, mais je préfère le faire 'en code' (plus rapidement modifiable et meilleur compréhension de ce que je fais !)
    Du coup ça me donne :

    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
    unit Unit4;
     
    interface
     
    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
      Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Data.Win.ADODB, Vcl.Grids,
      Vcl.DBGrids;
     
    type
      TForm4 = class(TForm)
     
        DBGrid1 : TDBGrid;
     
        procedure OnCreate(Sender : TObject);
     
      private
        DataSource : TDataSource;
        ADOTable : TADOTable;
     
      public
     
    end;
     
    var
      Form4 : TForm4;
     
    implementation
     
    {$R *.dfm}
     
     
    procedure TForm4.OnCreate(Sender : TObject);
    var
      Collection : TCollection;
      Column : TColumn;
      ColumnTitle : TColumnTitle;
      SelectQuery : TADOQuery;
    begin
      SelectQuery := TADOQuery.Create(nil);
      SelectQuery.ConnectionString := 'Provider=MSDASQL.1; Persist Security Info=False; Data Source=XXX';
      SelectQuery.DataSource := DataSource;
      SelectQuery.SQL.Text := 'SELECT Designation, Cle, Ville FROM XXX WHERE (Cle >= 9910000 AND Cle <= 9910005);';
     
      DataSource := TDataSource.Create(nil);
      DataSource.Name := 'DataSource';
      Datasource.DataSet := SelectQuery;
     
      DBGrid1.Columns.Add;
      DBGrid1.Columns[0].FieldName := 'Designation';
      DBGrid1.Columns[0].Title.Caption := 'Designation';
      DBGrid1.Columns[0].Width := 120;
     
      DBGrid1.Columns.Add;
      DBGrid1.Columns[1].FieldName := 'Cle';
      DBGrid1.Columns[1].Title.Caption := 'Cle';
      DBGrid1.Columns[1].Width := 50;
     
      DBGrid1.Columns.Add;
      DBGrid1.Columns[2].FieldName := 'Ville';
      DBGrid1.Columns[2].Title.Caption := 'Ville';
      DBGrid1.Columns[2].Width := 95;
     
      DBGrid1.DataSource := DataSource;
      DataSource.DataSet.Active := True;
    end;
     
    end.
    Le code marche au top, pour le coup, seul problème, je souhaiterais bloquer le redimensionnement des colonnes et leur donné un width en automatique. En gros, si je prend ma colonne 'Designation' qui est de type TEXT dans Paradox9, bah, je veux que la taille de la colonne ce fixe sur la plus grande chaîne de caractère. J'espère me faire comprendre

    Voiloutss, sa sera tout et sinon vous avez répondu tous à toutes mes questions, je vous remercies !

    Sur ce,
    Bonne fin de soirée et bon code !

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    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 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Retire dgColumnResize des Options de la Grille
    Laisse 64 comme Width, c'est la taille par défaut qui du coup provoque un redimensionnement en fonction du titre ou de la donnée
    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

  9. #9
    Membre éprouvé
    Avatar de Aooka
    Homme Profil pro
    Scripting Powershell & Wlangage
    Inscrit en
    Juillet 2015
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Scripting Powershell & Wlangage

    Informations forums :
    Inscription : Juillet 2015
    Messages : 227
    Points : 1 095
    Points
    1 095
    Par défaut
    Merci, sujet résolu du coup !

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

Discussions similaires

  1. [1.x] Plug-in pour générer des tableaux
    Par colimasson dans le forum Symfony
    Réponses: 1
    Dernier message: 28/11/2010, 14h58
  2. [Lazarus] Création d'une unité pour générer des tableaux statiques
    Par Ndjicki dans le forum Lazarus
    Réponses: 0
    Dernier message: 15/03/2010, 13h07
  3. comment générer des tableaux en perl
    Par manuche59 dans le forum Langage
    Réponses: 10
    Dernier message: 23/09/2009, 11h49
  4. [Excel] Générer des tableaux
    Par ayanami dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 07/01/2009, 15h16
  5. [Delphi 2006.net] Générer des reports?
    Par delph1978 dans le forum Delphi .NET
    Réponses: 3
    Dernier message: 06/04/2007, 22h59

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