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 :

[D7] Explication de code


Sujet :

Langage Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 16
    Points : 11
    Points
    11
    Par défaut [D7] Explication de code
    Je débute avec Delphi 7 et je rencontre un problème sur le code suivant
    destiné supprimer les lignes d'un TValueListEditor (nommé TVLE dans 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
     
    var
      i:integer;
      Tot:integer;
    begin
      // Remplissage du TValueListEditor 
      for i:=1 to 5 do 
        TVLE.InsertRow('Ligne',IntToStr(i),true)
     
      // Suppression de toutes les lignes
      Tot:=TVLE.RowCount;
      while Tot>1 do begin {Ignore la ligne des titres }
        TVLE.DeleteRow(Tot-1);
        Tot:=TVLE.RowCount;
      end;
    La suppression génére une exception, avec un problème d'indice. En fait en débugant, quand RowCount renvoie 2, la supression est faite, mais la boucle continue, RowCount renvoie toujours 2, et la suppression suivante fait tout planter.

    Je ne comprend pas ce qui cloche !!!!
    Existe-t-il une méthode pour vider totalement le contenu d'un TValueListEditor (mes recherches à ce sujet n'ont rien données)

    Merci d'avance pour votre aide

  2. #2
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Tot:=TVLE.RowCount;
    while Tot>1 do begin {Ignore la ligne des titres }
    Vu que le nombre d'iteration est connu a l'avance (RowCount) j'opterais plutot pour une boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i := 1 to TVLE.RowCount-1 do
    On part de 1 pour eviter la ligne 0 si j'ai bien compris (ligne des titres) et on termine a RowCount-1 car pour N Lignes les indices vont de 0 a N-1

    [EDIT] Par contre dans ce genre de cas ou la taille du tableau a parcourir diminue en cours de boucle je te conseile de faire au sein de la boucle
    ou bien de faire une boucle for decrementale (For ... Downto ... do)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    TVLE.DeleteRow(Tot-1);
    Tot:=TVLE.RowCount;
    La est ton erreur : Tu delete bien Tot-1 car Tot est initialisé a RowCont et TVLE possede pour dernier incide RowCount-1 donc Tot-1
    Personnelement j'aurais plutot placé uen variable ID a RowCont-1 et delete la ligne ID ... C'est plus clair a la lecture

    Par contre la ligne suivante reaffecte RowCount a Tot, ce qui parrait normal vu que RowCount devrais maintenant renvoyer une ligne de moins ... mais il semblerais que le systeme de gestion des suppression de ton objet ne l'entende pas de cette maniere. Donc tu conserve un rowcount a 2 et quand tu tente d'acceder a Tot-1, c'est a dire au RowCount original-1 tu tente en fait d'acceder a la ligne que tu viens de supprimer.
    D'ou ton erreur.

    Je lui prefere le code suivant, plus sur :
    Pour l'explication je ne sais pas .... ca parrait etrange en effet.
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  3. #3
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    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 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Mouais, enfin, sous D6 c'est pareil, un prob de propriétés que nous confondons certainement entre le nb de lignes "physiques" et celui des items...

    Le code suivant marche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     Tot:=TVLE.Strings.Count;
      while Tot>1 do begin {Ignore la ligne des titres }
        TVLE.DeleteRow(Tot-1);
        Tot:=TVLE.Strings.Count;
      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 expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    Question code dans des cas pareils je préfère la boucle For elle est faite pour ça


    je pense que c'est plus propre comme ça.


  5. #5
    Membre chevronné
    Avatar de Clorish
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 474
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 474
    Points : 2 158
    Points
    2 158
    Par défaut
    Citation Envoyé par qi130 Voir le message
    Mouais, enfin, sous D6 c'est pareil, un prob de propriétés que nous confondons certainement entre le nb de lignes "physiques" et celui des items...
    Je ne connait pas ce composant ... masi c'est fort possible en effet
    J'ai connu ca sous d'autres compos

    Citation Envoyé par aityahia Voir le message
    je pense que c'est plus propre comme ça.
    Bien vu
    On passe du temps a vous repondre, alors soyez sympas, passez du temps ..... a vous relire !
    --
    Pourquoi tant de haine pour cette pauvre aide Delphi ????
    Aiiimezzz laaaaa .... Si-Non-Cham-Pi-Gnon !!!
    --
    Pour plus de Renseignements : Venez me rejoindre sur Msn .... Promis je mords pas

  6. #6
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    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 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Citation Envoyé par aityahia Voir le message
    je pense que c'est plus propre comme ça.



    car la ligne de titre disparait aussi...
    Citation Envoyé par Skywalker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while Tot>1 do begin {Ignore la ligne des titres }
    Citation Envoyé par Clorish Voir le message
    Je ne connait pas ce composant ... masi c'est fort possible en effet
    J'ai connu ca sous d'autres compos
    J'ai pas le source sous les yeux, mais peut-être que le DeleteRow "oublie" de supprimer l'item de String correspondant, ou alors un bug sur le compteur ?
    "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

  7. #7
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    Citation Envoyé par qi130 Voir le message


    car la ligne de titre disparait aussi...
    est vous sur ?

    je viens de faire le test, les titres sont stocké dans TitleCaptions.

  8. #8
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 903
    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 903
    Points : 6 027
    Points
    6 027
    Par défaut
    Citation Envoyé par aityahia Voir le message
    est vous sur ? .
    En positionnant la propriété doColumnTitles à false, la ligne de titre "build-in" n'apparait plus.
    Dans cette configuration le titre est à l'initiative du programmeur...

    Cependant, il semble plus sage de profiter des capacités offertes par ce composant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TVLE.TitleCaptions.Strings[0]:='Entête 1ère colonne';
    "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

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 460
    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 460
    Points : 24 874
    Points
    24 874
    Par défaut
    L'auteur à écrit donc écrit une boucle qui commence par la fin via un while (l'effacement d'une liste se fait souvent à l'envers pour éviter le chevauchement d'index et pour réduire les move dans le tableau de pointeur), mais cela peut se faire plus simplement avec un for

    // Suppression de toutes les lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for i := TVLE.RowCount - 1 downto 1 do // 1 ou 0 selon les Titres
      TVLE.DeleteRow(i);
    sinon le TValueListStrings.Clear(), libère ses objets internes et efface la liste ...
    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

  10. #10
    Membre expert
    Avatar de aityahia
    Homme Profil pro
    CIEPTAL CARS SPA
    Inscrit en
    Mars 2006
    Messages
    1 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Algérie

    Informations professionnelles :
    Activité : CIEPTAL CARS SPA
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 938
    Points : 3 329
    Points
    3 329
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    L'auteur à écrit donc écrit une boucle qui commence par la fin via un while (l'effacement d'une liste se fait souvent à l'envers pour éviter le chevauchement d'index et pour réduire les move dans le tableau de pointeur), mais cela peut se faire plus simplement avec un for
    ...
    +1 pour shai

Discussions similaires

  1. Explication de code
    Par sacco dans le forum C
    Réponses: 2
    Dernier message: 12/04/2006, 23h13
  2. Explication de code
    Par claralavraie dans le forum Linux
    Réponses: 1
    Dernier message: 20/03/2006, 09h58
  3. Shell - Explication de code
    Par claralavraie dans le forum Linux
    Réponses: 13
    Dernier message: 13/01/2006, 16h03
  4. Explication de code - RE
    Par deedoo dans le forum Général Python
    Réponses: 23
    Dernier message: 29/07/2005, 14h00
  5. Explication de code simple
    Par Clad3 dans le forum OpenGL
    Réponses: 3
    Dernier message: 20/03/2005, 11h31

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