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

Bases de données Delphi Discussion :

Requete créant des Labels Dynamiquement et les placent dans l'ordre


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Points : 96
    Points
    96
    Par défaut Requete créant des Labels Dynamiquement et les placent dans l'ordre
    Bonjour!!!!!

    Voilà j'ai une idée que j'ai à peu pres comprise en cherchant sur le forum et un autre (vive la concurrence )

    J'ai une requete qui me donne des pas avec à chaque nom de pas , une valeur (en km)

    (code en entier pour mieux comprendre le programme)
    (partie en gras est celle qui nous intéresse)

    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
    WITH DataModule1.QAfficheMaterielRoulant2 DO
    BEGIN
    SQL.Clear;
    x:=0;
    SQL.add('SELECT * FROM ID_Materiel_Roulant M ');
    SQL.Add('         INNER JOIN Param_LCC L        ON M.ID_Engin = L.ID_Engin_FK1');
    SQL.Add('         INNER JOIN ID_M I             ON M.ID_Engin = I.ID_Engin_FK2');
    SQL.Add('         INNER JOIN Operational_Unit O ON L.Operational_Def = O.Unite_Operationnelle');
    SQL.Add('         INNER JOIN Currency C         ON L.Currency_Name = C.Currency_Name');
    SQL.Add('         INNER JOIN Energy_Unit E      ON L.Definition_Energie_FK1 = E.Definition_Energie');
    SQL.Add('WHERE M.ID_Engin = '+ QuotedStr(ComboBox1.Items[ComboBox1.ItemIndex]));
    SQL.Add('AND Niveau_M <> 6 ');
    SQL.Add('ORDER BY I.Pas_nominal ASC');
    Open;
    First;
    WHILE NOT DataModule1.QAfficheMaterielRoulant2.eof DO
    BEGIN
    Responsable_Label.Caption := combobox1.Items[combobox1.ItemIndex];
    ListBoxMP.Items.Add(FieldByName('Nom_Pas').AsString);
    NumProj_Edit.Text := FieldByName('ID_Projet').AsString;
    NomProj_Edit.Text := FieldByName('Nom_Projet').AsString;
    IDLoco_Edit.Text := FieldByName('ID_Engin').AsString;
    NbLocoParc_Edit.Text := FieldByName('Nb_Loco_Parc').Value;
    TypeMaterielRoulant_ComboBox.Text := FieldByName('ID_MaterielRoulant').AsString;
    PeriodeLCC_Edit.Text := FieldByName('Periode_LCC').Value;
    //NbKmAn_Edit.Text := FormatFloat('###,###,###,00',FieldByName('Nb_Km_Annuel').AsFloat);
    NbKmAn_Edit.Text := FieldByName('Nb_Km_Annuel').Value;
    EnergyDescription_ComboBox.Text:= FieldByName('Definition_Energie').Value;
    DateLCC_Edit.Text := FieldByName('Date_Depart_LCC').Value;
    CmoyEnergie_Edit.Text := FieldByName('Cout_Energie').Value;
    CurName_Combo.Text := FieldByName('Currency_Name').AsString;
    CurValue_Edit.Text := FieldByName('Currency_ValueEuro').Value;
    CurUnit_Edit.Text := FieldByName('Currency_Unit').AsString;
    AbbEnergie_Edit.Text := FieldByName('Unite_Energie').AsString;
    ValeurRefEnergie_Edit.Text := FieldByName('ValeurRef').Value;
    Operational_ComboBox.Text := FieldByName('Unite_Operationnelle').AsString;
    OpAcr_Edit.Text := FieldByName('Operational_Acronym').AsString;
    MoeCh_Edit.Text := FieldByName('MOE_CostHour').Value;
    MoeUh_Edit.Text := FieldByName('Currency_Unit').AsString;
    Responsable_Edit.Text := FieldByName('Responsable_CIM').AsString;
    RCA_Edit.Text := FieldByName('RCA').AsString;
    RespMaint_Edit.Text := FieldByName('Responsable_Maintenance').AsString;
    Next;
    END;
    END;
    Donc dans ce listbox il ya des noms de pas.
    (et dans une table db il y a une valeur par pas en KM)

    - Dans un premier temps, je souhaiterais créer le meme nombre de label qu'il y a de pas dans le ListBox. Je sais que je dois utiliser la Classe TLabel avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    constructor  create (Aowner....)
    Mais je ne sais pas à quel moment je dois l'appeler.... et comment lui dire de prendre le nom du pas ......



    - Dans un deuxieme temps (qui n'a rien a voir avec les base de données quoi que peut etre) , je souhaiterais que ces labels soient placés par ordre croissant suivant une rêgle paramétré (je ne sais pas comment faire pour faire le lien entre les pixels de la Form et l'intervalle kilométrique).


    Bref j'essaie d'avancer mais c'est assez dur pour le moment, car je ne sais vraiment pas ou mettre le constructor....

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Points : 96
    Points
    96
    Par défaut
    J'ai commencé par définir mes instructions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      TPasLabel = class(TLabel)
     
      public
     
          constructor Create(AOwner: TComponent); Override ;
     
      end;

    Ensuite j'ai défini cette "procédure" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    constructor TPasLabel.Create(AOwner: TComponent);
    begin
      inherited;
      Name := 'TestPas'+ IntToStr(NbPas+1);
    end;

    Puis j'ai mis l'appel à cette procedure lorsque l'on sait le nombre de pas qu'il y a dansle ListBoxMP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BEGIN
    NbPas := 1;
    WHILE NbPas < ListBoxMP.Items.Count DO
    BEGIN
    PasLabel := TPasLabel.Create(Self);
    NbPas := NbPas + 1 ;
    end;

    Mais il me dit qu'il ne connait pas PasLabel......

    bizarre....

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 894
    Points : 6 023
    Points
    6 023
    Par défaut
    As-tu vraiment besoin de ton TPasLabel ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    With TLabel.Create(Self) Do begin
                  Parent:=Proprio;             // propriétaire :ta fiche ?
                  Left:=15;                      // position
                  Top:=23+offset;
                  Height:=39;                   // dimension
                  Width:=159;
                  Autosize:=false;
                  Layout:=tlCenter;
                  WordWrap:=True;
                  Name:='TestPas'+ IntToStr(NbPas+1);       // le nom pour pouvoir utiliser FindComponent
                  Caption:=ListBoxMP.Items[i-1];     // Attention le 1er item a le rang 0
               end;
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Points : 96
    Points
    96
    Par défaut
    désolé pour la duplication, j'ai perdu la boule, je ne me rappelais pas si javais tout expliqué etc... et comme ça fait 4,5 jours, désolé vraiment....

    Par contre, offset cela prend quoi comme valeur???

  5. #5
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 894
    Points : 6 023
    Points
    6 023
    Par défaut
    Offset = déplacement "relatif" devra être réglé initialement à 0.
    Le 1er label sera créé à 23 pixel du haut de son parent Puis, après chaque création, il faut augmenter "offset" au minimum de la dimension du composant TLabel sinon les labels vont se chevaucher.
    Admettons qu'on augmente de 30, le 2nd label sera placé à 53 pixels du haut de son parent, etc...
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Points : 96
    Points
    96
    Par défaut
    juste une derniere question:

    j'incrémente comment?

    je fais au début de la boucle

    offset := offset + 30

    et je mets

    top := 30 + offset ???

  7. #7
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 894
    Points : 6 023
    Points
    6 023
    Par défaut
    Oui, très bien comme ça...

    Notes bien que si tu incrémentes en début de boucle, le 1er label sera à 53, pas à 23...
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Points : 96
    Points
    96
    Par défaut
    et j'ai mis dans un autre listbox des valeurs de type float correspondant aux données de la listbox1.
    Le but étant de faire varier le Left de chaque label selon sa valeur dans le listbox2.

    Donc j'ai défini ma rêgle au point 0 avec un Left= 30 une regle de fin Left= 630.

    Donc je fais une truc du type :

    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
    Offset := 0;
    NbPas := 0;
    X:= 0.000315*StrToFloat(ListBoxPN.Items[NbPas]);
    WHILE NbPas < ListboxMP.Count DO
    BEGIN
    With TLabel.Create(Self) Do begin
                  Parent:=Form1.TabSheet7;             // propriétaire :ta fiche ?
                  Left:= X;                      // position
                  Top:=25+Offset;
                  Height:=13;                   // dimension
                  Width:=100;
                  Autosize:=false;
                  Layout:=tlCenter;
                  WordWrap:=True;
                  Name:='TestPas'+ IntToStr(NbPas+1);       // le nom pour pouvoir utiliser FindComponent
                  Caption:= ListBoxMP.Items[NbPas]+ ':' + ListBoxPN.Items[NbPas];
                  NbPas := NbPas+1;
                  Offset := Offset + 16;     // Attention le 1er item a le rang 0
                  END;
                  end;
    Le hic c'est qu'il me met sur la ligne en gras, type incompatibles extended et integer... alors que dans le listbox c des float (selon ma table).


    Autre question: est-il judicieux d'utiliser le Left du Label sachant que je voudrais faire des Drag&Drop après pour les manipuler...

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Points : 96
    Points
    96
    Par défaut
    pour les Extended je pense avoir trouver mais il reste :

    Avez vous une méthode pour manipuler des label ( si c'est avec Left etc.... )

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Points : 96
    Points
    96
    Par défaut
    mais le truc c'est qu'après je veux faire des drag & drop avec ces labels. Alors je suis bien obligé de passer par le truc constructor sinon les procedures mousemove et moousedown je ne pourrais m'en servir

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Points : 96
    Points
    96
    Par défaut
    Maintenant je souhaite lier une 2e serie de label à la 1ere :

    c'est la meme chose mais seulement comment savoir quelle est le bon :

    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
    Offset2 := 0;
    NbPas2 := 0;
    WHILE NbPas2 < ListboxPN.Count DO
    BEGIN
    With TLabel.Create(Self) Do begin
                  Parent:=Form1.PasLabel.......;             // propriétaire :ta fiche ?
                  Left:= 0;
                  Font.Color := ClWhite ;
                  Font.Style := [fsBold];
                  Color := ClNavy ;                      // position
                  Top:=25+Offset2;
                  Height:=13;                   // dimension
                  Width:=25;
                  Autosize:=false;
                  Layout:=tlCenter;
                  WordWrap:=True;
                  Name:='Valeur'+ IntToStr(NbPas2+1);       // le nom pour pouvoir utiliser FindComponent
                  Caption:= ListBoxPN.Items[NbPas2];
                  NbPas2 := NbPas2+1;
                  Offset2 := Offset2 + 16;     // Attention le 1er item a le rang 0
                  //OnMouseMove :=  DeplacerLabel;
                  END;
                  end;
    mhmhm?

    je dois peut etre faire une boucle imbriqué plutot non?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 166
    Points : 96
    Points
    96
    Par défaut
    voilà mon 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
    Offset := 0;
    NbPas := 0;
    Offset2 := 0;
    NbPas2 := 0;
    
    
    WHILE NbPas2 < ListboxPN.Count DO
    BEGIN
    
         WHILE NbPas < ListboxMP.Count DO
         BEGIN
              WITH TLabel.Create(Self) DO
                  BEGIN
                  Parent:= TabSheet7;
                  Left:= 30;
                  Font.Color := ClWhite ;
                  Font.Style := [fsBold];
                  Color := ClNavy ;
                  Top:=25+Offset;
                  Height:=13;
                  Width:=100;
                  Autosize:=false;
                  Layout:=tlCenter;
                  WordWrap:=True;
                  Name:='TestPas'+ IntToStr(NbPas+1);
                  Caption:= ListBoxMP.Items[NbPas]+ ' : ' ;
                  NbPas := NbPas+1;
                  Offset := Offset + 16;
                  OnMouseMove :=  DeplacerLabel;
                  END;
         END;
    
      WITH TLabel.Create(Self) DO
      BEGIN
      Parent := TabSheet7;
      FocusControl.Name :=  TLabel(FindComponent('TestPas'+ IntToStr(NbPas+1)));  Left:= 130;
      Font.Color := ClWhite ;
      Font.Style := [fsBold];
      Color := ClNavy ;
      Top:=25+Offset2;
      Height:=13;
      Width:=50;
      Autosize:=false;
      Layout:=tlCenter;
      WordWrap:=True;
      Name:='Valeur'+ IntToStr(NbPas2+1);
      Caption:= ListBoxPN.Items[NbPas2];
      NbPas2 := NbPas2+1;
      Offset2 := Offset2 + 16;
                  //OnMouseMove :=  DeplacerLabel;
      END;
    END;
    J'essaie comme cela mais je ne sais pas

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/06/2011, 11h33
  2. créer des labels dynamiquement
    Par kika10 dans le forum VB.NET
    Réponses: 11
    Dernier message: 15/12/2010, 10h56
  3. [XL-2007] Définir des références dynamiques pour les formules internes d'un tableau
    Par SilkyRoad dans le forum Contribuez
    Réponses: 0
    Dernier message: 10/05/2009, 14h05
  4. Problème pour charger des font dynamiquement et les utiliser (marche à moitié)
    Par rigolman dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 31/03/2009, 09h29
  5. Réponses: 4
    Dernier message: 02/02/2009, 10h45

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