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 :

Ajouter une fonction à ma classe.


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut Ajouter une fonction à ma classe.
    Bonjour à tous,

    j'utilisais jusqu'à présent dans ma class TPatentList une propriété de type TList dans laquelle je stocke des objets de type TPatentClass (très simple 1 entier "ID", 1 string "NUMBER", 1 bool "DOWNLOADED")
    Note: Number prend par exemple la valeur "FR123456A1" et est unique.

    Pour des raisons de gain de vitesse, on m'a proposé d'utiliser une unité ICS OverbyteIcsAvlTrees ayant un type TAvlObjTree.

    Première constatation c'est vraiment plus rapide pour le Add mais voilà mon problème c'est que j'utilise un Index avec ma TList maintenant je ne peux plus le faire.

    Je cherche donc un peu d'aide pour ma fonction FindByNumber. Avant je parcourais les Items un à un dans une boucle FOR mais là je ne sais pas comment faire ?

    J'ai mis en attach mon tout petit prog exemple,

    Est-ce que quelqu'un pourrait m'aider à écrire ma fonction TPatentList.FindByNumber(Num : String):TPatentClass;

    qui permet de rechercher parmi tous mes objets de TPatentList celui qui correspond au numéro qu'on lui passe en paramètre.
    par ex.:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    MyList : TPatentList;
    MyObj : TPatentClass;
     
    MyObj := MyList.FindByNumber('FR12346A1');
    D'avance merci pour votre aide,
    Amicalement,
    Bruno

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Tu dois pouvoir itérer la liste avec une méthode First, Next ... je ne connais pas cette objet, mais en général, les objets tree sont conçus comme ça (le mien l'est en tout cas )

    EDIT, c'est une liste chaine, tu commence par First sur l'objet Tree, puis sur les items tu fais Left ou Right

    Par contre tu perds toute notion d'ordre !
    L'ordre qui sera fourni sera celui du stockage, pas celui de l'insertion !

    Sinon en changeant Capacity sur une TList, tu pouvais gagner aussi en performance (si tu peux prévoir le nombre d'élément à insérer)
    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

  3. #3
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Celui qui ta fourni le code pourra certainement te répondre en deux coups de cuillère à pot .

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Concernant la TList et sa capacité, je n'ai aucun moyen de le connaître à l'avance, cela peut être 1, 2, jusqu'à 20 000 éléments. D'où l'intérêt ici d'une autre méthode.

    concernant le parcours de l'arbre, justement c'est sur ce point que j'ai des problèmes car niveau prog-info je suis pas top.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    @Andnotor: hélas, nous étions avec François parti sur un dev. payant mais il s'avère que cela dépasse ce que mon boss voulait mettre ou du moins pour faire les modifs dont j'avais besoin. Alors j'ose plus trop demander directement.

    j'y suis pour rien hélas, mon boss regarde que son portefeuille....

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Bon je me résigne à poster le message dans le forum où François a l'habitude d'aller... désolé pour le multi-post.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    humm vraiment pas simple,

    je n'ai pas de Next, ni Prev, (ou Left, Right ici)

    j'ai essayé un truc pour voir si au moins j'arrive à récupérer un objet en prenant juste le premier élément (sans tenir compte de Number):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function TPatentList.FindByNumber(const Number: string): TPatentClass;
    Var
      P : TAvlTreeNode;
    begin
      P := FItemsTree.First;
     
      If Assigned(P) Then
        Result:=TPatentClass(P)
      Else
        Result:=nil;
    end; {* func .FindByNumber *}
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TForm1.btn2Click(Sender: TObject);
    Var
      PR : TPatentClass;
    begin
      PR:=Patents.FindbyNumber('ssss');
     
      Showmessage(PR.Number);
    end;
    La compil passe bien mais le résultat est vide, ch'uis vraiment une bille en prog moi

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    @Shell: tu parles du tiens d'objet, y-a-t-il un moyen de le voir ? de l'utiliser ?

  9. #9
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Le mien utilise une chaine comme clé d'entrée, ce n'est pas un arbre d'objet ... cherche sur le forum "HashList" et ShaiLeTroll sur le forum ...

    Sinon, tu peux le coder facilement avec une liste chainée ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    PObjChain = TObjChain;
    TObjArbre = record
      Obj: TObject;
      Next: PObjChain;
    end;
     
    var 
      Root: TObjChain;
    begin
      New(Root.Next); // penser à faire le dispose  
      Root.Next.Obj := Item1;  
      Root.Next.Next.Obj := Item2;  
      ...




    Mais avoir autant d'objet c'est peut-être le modèle qui est faux, développer un lazy loading serait plus pertinent !
    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 habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    ok bon ben

  11. #11
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 452
    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 452
    Points : 24 863
    Points
    24 863
    Par défaut
    Surtout que je ne l'ai jamais testé à très grand volume pour un projet en prod
    juste pour du test à 500 000 items

    voir le code de TTreeHashingObjectList
    Il n'est pas itérable dans l'état, en général, j'ai une table ou une autre liste contenant les codes, dont je ne parcours jamais cet objet directement

    j'essayerais de te trouver la version itérable, j'en avais bricolé une, le code était très très moche ...

    pour insérer un objet, voici le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Tree['FR12346A1'] := Obj;
    tu peux étudier ce sujet tableau associatif (avec insertion, suppression..) en O(1)
    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

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    624
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 624
    Points : 199
    Points
    199
    Par défaut
    Re- Shell,

    Pour ce qui est du Hash, je ne pense pas que cela fasse l'affaire.

    Je laisse tombé pour l'instant...un peu deg' je l'avoue

Discussions similaires

  1. [PHP 5.4] Ajouter une fonction dans une classe
    Par soksabai dans le forum Langage
    Réponses: 2
    Dernier message: 06/03/2015, 07h57
  2. Réponses: 3
    Dernier message: 18/02/2009, 22h06
  3. [C++ STL] rediriger un signal dans une fonction de class
    Par tux84000 dans le forum SL & STL
    Réponses: 2
    Dernier message: 14/05/2007, 18h28
  4. Réponses: 7
    Dernier message: 24/01/2007, 10h01
  5. Réponses: 6
    Dernier message: 08/01/2007, 14h13

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