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

 Delphi Discussion :

Problème de performance avec remplissages d'une StringGrid ?


Sujet :

Delphi

  1. #1
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Par défaut Problème de performance avec remplissages d'une StringGrid ?
    La stringgird ce remplie grâce a une demande de produit
    La demande et une suit de chiffres comme un code barre
    Chaque code barre nous donne " nom + type + nombre de type + code "
    Avec le nombre de type on a le nombre de Line de la stringgird + la line fixe des label

    La cellule 1 affiche le nom la 2eme affiche le type la 4eme affiche le code grâce a une base de donné externe " pour chaque Line "

    Moi je doit remplir les cellules 5 et 6 de chaque Line ,5 va contenir le nom du fournisseur et la 6 la mark du produit "un produit a plusieurs mark " le fournisseur peut fournir le même produit a différent mark
    Le nombre de fournisseur et fixe y a 5 fournisseurs
    Jusqu’à ce point tout marche très bien pour moi
    Le problème c avec les mark
    y a beaucoup de teste qui réduit les performance de l'application on plus je n’ai pas droit d’utilisé une autre base de donné

    Je me trouve avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    for i:=0 to MAX_CA_SYSTEMS-1 do
     if copy(MainForm.CA_SYSTEMS.Cells[3,i+1],1,6)='code du produit' then
     begin
     MainForm.CA_SYSTEMS.Cells[4,i+1]:='fourniseur X';
    if MainForm.CA_SYSTEMS.Cells[0,i+1]='nom de produit'then MainForm.CA_SYSTEMS.Cells[5,i+1]:='mark1/mark2...ets' else
    if MainForm.CA_SYSTEMS.Cells[0,i+1]='nom de produit'then MainForm.CA_SYSTEMS.Cells[5,i+1]:='fourniseur X' else
    .
    .
    .
    .
    .
    .
    .
    je me trouve avec une vingtaine de Line comme ça
    ça marche mais coté performance c'est nulle
    y a t il pas un autre moyenne que le if ... else a chaque fois ??

    merci d'avance je suis sur delphi 7

  2. #2
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 236
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 236
    Par défaut
    Une Requête + Utiliser une DbGrid serait quand même beaucoup plus simple
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  3. #3
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Une Requête + Utiliser une DbGrid serait quand même beaucoup plus simple
    je croie que tu ne ma pas bien compris l'ami il ne s’agit pas de base de donné

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    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 093
    Par défaut
    Utilise la propriété Objects[] pour stocker les informations utiles lors du remplissage de la TStringGrid

    Pour éviter surtout des comparer des chaines mais plutôt des enums ou constantes entièrement typant la donnée, cela peut même se faire par polymorphisme avec TWolfObjectForStringGrid comme ancêtre, ensuite, tu as des TWolfCodeProduitForStringGrid, chaque colonne peut-être pré-typé pour gagner du temps dans les tests

    Ces Objects[] pouvant contenir des liens entre-eux

    Sinon if copy(...,1,6)='code du produit' then sera toujours faux une chaine de 6 caractères ne peut pas être égala à ta constante

    Pour des coordonnées des Cells[], utilise aussi des constantes genre COL_PRODUIT = 3 cela facilitera la maintenance !
    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 confirmé
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Utilise la propriété Objects[] pour stocker les informations utiles lors du remplissage de la TStringGrid

    Pour éviter surtout des comparer des chaines mais plutôt des enums ou constantes entièrement typant la donnée, cela peut même se faire par polymorphisme avec TWolfObjectForStringGrid comme ancêtre, ensuite, tu as des TWolfCodeProduitForStringGrid, chaque colonne peut-être pré-typé pour gagner du temps dans les tests

    Ces Objects[] pouvant contenir des liens entre-eux

    Sinon if copy(...,1,6)='code du produit' then sera toujours faux une chaine de 6 caractères ne peut pas être égala à ta constante

    Pour des coordonnées des Cells[], utilise aussi des constantes genre COL_PRODUIT = 3 cela facilitera la maintenance !
    quand j'ecrie if copy(...,1,6)='code du produit'j'ai mit 'code produit' juste pour dire que c'est le code c'est un HEX
    comme pour fournisseur X nom produit mark
    c'est juste un exemple dans le vrais code il y a le vrais nom du fournisseur le vrais nom de la mark le code produit c'est un hex les 6 premier donne toujour le code fournisseur

  6. #6
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    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 093
    Par défaut
    Du Hexa dans une TStringGrid ?
    Tu caches ces colonnes à l'utilisateur ? sinon le pauvre, je le plains !
    tu compare Hexa comme une chaine ?
    CA_SYSTEMS est-elle une TStringGrid cachée qui contient les données pour une autre TStringGrid affiché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

  7. #7
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Du Hexa dans une TStringGrid ?
    Tu caches ces colonnes à l'utilisateur ? sinon le pauvre, je le plains !
    tu compare Hexa comme une chaine ?
    CA_SYSTEMS est-elle une TStringGrid cachée qui contient les données pour une autre TStringGrid affichée ?
    justement oui le pauvre c'est a cause de ça "ce hex" qu'on ma confier de complété le code pour simplifier au utilisateur le traitement

    je ne sai pas peut être je me suis mal exprimé je vois qu on ne me comprend pas !!!

    je simplifie les chose

    bon on a un stinggird disons 5 colonnes et 5 line
    la premier procédure elle remplie les cellules de chaque line grâce a une base de donné externe mais pas tout les cellule ,elle remplie les cell de 1 a 5 ou 0 a 4 les 2 dernier c'est a moi de les remplir la 5 et 6

    bon on lance l'application on rentre une demande on valide

    le tstringgird ce remplie
    La cellule 1 affiche le nom la 2eme affiche le type la 4eme affiche le code

    la 5 et 6 reste vide ,,jusque ici aucun problème

    on ma donné la tache d'ajouter le code qui remplie la cell 5 et 6

    la 5 contiendra le nom du fournisseur on a que 5 fournisseur et la 6 contiendra la mark
    la c'est très simple pour le fournisseur biensur

    dans la boucle qui parcoure la stringdird je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     if copy(MainForm.CA_SYSTEMS.Cells[3,i+1],1,6)='0A01CB' 
     
               then MainForm.CA_SYSTEMS.Cells[4,i+1]:='Eurl Sarl' else 
     
               if copy(MainForm.CA_SYSTEMS.Cells[3,i+1],1,6)='0A02CB' 
     
               then MainForm.CA_SYSTEMS.Cells[4,i+1]:='Eurl Biostar' else
    .
    .
    .
    .
    .
    on teste le hex et on affiche dans la stringgird le nom du fournisseurs

    jusque la il n y a aucun problème

    il me reste la dernier cell la 6 " tout mon problème et la " je m'explique
    on doit affiché la mark dans la cell 6,,il faut savoir que pour un seul produit le fournisseur peut fournir plusieurs mark l'affichage dans la stringgird sera comme suit mark1/mark2/....

    bon je prend le premier code que j'ai fait pour affiché le fournisseur et je lui ajoute l'affichage de la mark puis que on a le produit le nom du fournisseur on sait déjà les mark qu'il a on a qu a affiché ces mark comme suit:

    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
     if copy(MainForm.CA_SYSTEMS.Cells[3,i+1],1,6)='0A01CB' 
     
               then  begin 
               MainForm.CA_SYSTEMS.Cells[4,i+1]:='Eurl Sarl' else 
               if MainForm.CA_SYSTEMS.Cells[0,i+1]='nom de produit' then      
               MainForm.CA_SYSTEMS.Cells[5,i+1]:='mark1/mark2...ets' else
               if MainForm.CA_SYSTEMS.Cells[0,i+1]='nom de produit' then
               MainForm.CA_SYSTEMS.Cells[5,i+1]:='mark6/mark7...ets' else
    .
    .
    .
    .
    .
    .
    .
               //la meme chose pour chaque fourniseur qui suit
               if copy(MainForm.CA_SYSTEMS.Cells[3,i+1],1,6)='0A02CB' 
               then MainForm.CA_SYSTEMS.Cells[4,i+1]:='Eurl Biostar' else
               if MainForm.CA_SYSTEMS.Cells[0,i+1]='nom de produit' then      
               MainForm.CA_SYSTEMS.Cells[5,i+1]:='mark1/mark2...ets' else
               if MainForm.CA_SYSTEMS.Cells[0,i+1]='nom de produit' then
               MainForm.CA_SYSTEMS.Cells[5,i+1]:='mark6/mark7...ets' else
    .
    .
    .
    .
    je me trouve avec une vingtaine de Line pour chaque fournisseur
    ça marche ça affiche bien tout ce que je veut
    mais coté performance c'est nulle quand il y a que 7 ou 8 line c bon
    quand ça dépasse les 10 line la ça ce vois bien ,dans l'exemple j'ai dit on prend un stringgird de 6 col et 5 line juste pour l'exemple dans le vrais code les line=nombre de produit dans la commande

    moi je cherche une alternative plus rapide que les else if else if a chaque fois
    j’espère que c'est claire maintenant

    pour info je cache rien il y a une seul stringgird la CA_SYSTEMS

  8. #8
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    bonjour,

    alors déjà pour des raisons de maintenance, j'éviterais des if imbriqués comme ça, surtout qu'il y a des tas de constantes.

    un première idée (mais je n'ai pas une vision globale du problème) serait d'avoir un TStringList qui contient
    0A01CB=Eurl Sarl
    0A02CB=Eurl Biostar
    
    de là StringList.Values['0A01CB'] donne 'Eurl Sarl'

    de la même façon on peut associer un TStringList à chaque fournisseur
    nom de produit=mark1/mark2...ets
    
    Selon la quantité de données ça peut s'envisager dans un format INI
    [0A01CB]
    *=Eurl Sarl
    nom de produit=mark1/mark2...ets
    [0A02CB]
    *=Eurl Biostart
    nom de produit=mark1/mark2...ets
    
    le tout chargé dans TMemIniFile

    Mais je suis surpris que ces informations ne figurent pas dans la BDD qui alimente la grille.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    Citation Envoyé par Night_Wolf1619 Voir le message
    bon on a un stinggird disons 5 colonnes et 5 line
    la premier procédure elle remplie les cellules de chaque line grâce a une base de donné externe mais pas tout les cellule ,elle remplie les cell de 1 a 5 ou 0 a 4 les 2 dernier c'est a moi de les remplir la 5 et 6
    a la fin il y a une base non
    Citation Envoyé par Rayek Voir le message
    Une Requête + Utiliser une DbGrid serait quand même beaucoup plus simple
    +1, et on utilisant des champs calculer

  10. #10
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    bonjour,

    alors déjà pour des raisons de maintenance, j'éviterais des if imbriqués comme ça, surtout qu'il y a des tas de constantes.

    un première idée (mais je n'ai pas une vision globale du problème) serait d'avoir un TStringList qui contient
    0A01CB=Eurl Sarl
    0A02CB=Eurl Biostar
    
    de là StringList.Values['0A01CB'] donne 'Eurl Sarl'

    de la même façon on peut associer un TStringList à chaque fournisseur
    nom de produit=mark1/mark2...ets
    
    Selon la quantité de données ça peut s'envisager dans un format INI
    [0A01CB]
    *=Eurl Sarl
    nom de produit=mark1/mark2...ets
    [0A02CB]
    *=Eurl Biostart
    nom de produit=mark1/mark2...ets
    
    le tout chargé dans TMemIniFile
    Merci oui une bonne solution et j'ai déjà pensé a ça le problème c'est que l'utilisateur peut modifier le fichier INI

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mais je suis surpris que ces informations ne figurent pas dans la BDD qui alimente la grille.
    par ce que au départ il n y a avait qu'un seul fournisseur

  11. #11
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Par défaut
    Citation Envoyé par edam Voir le message
    a la fin il y a une base non

    +1, et on utilisant des champs calculer
    oui il y a une base de donné comme je précis externe elle n’est pas sur mon pc elle est en lecture seule et j’ai pas le droit de la modifier

    sinon ça sera plus facile avec 2 champ en plus dans la base + une requête
    merci comme même

  12. #12
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    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 093
    Par défaut
    Ah, tu ajoutes du traitement !
    Après une saisie de l'utilisateur, tu exploites les données pour remplir d'autres colonnes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     if copy(MainForm.CA_SYSTEMS.Cells[3,i+1],1,6)='0A01CB' 
     
               then MainForm.CA_SYSTEMS.Cells[4,i+1]:='Eurl Sarl' else 
     
               if copy(MainForm.CA_SYSTEMS.Cells[3,i+1],1,6)='0A02CB' 
     
               then MainForm.CA_SYSTEMS.Cells[4,i+1]:='Eurl Biostar' else
    .
    peut être décomposé ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MainForm.CA_SYSTEMS.Cells[4,i+1]:= GetFournisseurLibelleFromHexaCode(copy(MainForm.CA_SYSTEMS.Cells[3,i+1], 1, 6);
    déjà le Copy n'est fait plus qu'une fois, gain de perf mais c'est peu significatif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function TForm1.GetFournisseurLibelleFromHexaCode(const HexaCode: string): string;
    begin
      if HexaCode = '0A01CB' then
        Result := 'Eurl Sarl' 
      else if HexaCode = '0A02CB' then
        Result := 'Eurl Biostar' 
      else if HexaCode = '...' then
        Result := '...'
      else
        Result := DefaultValue; 
    end;
    Sans être mieux, le code étant isolé est plus lisible
    De plus, ce n'es plus dépendant de la Grille juste de String à String, au lieu que cela soit dans TForm1, tu peux faire une classe qui te gère une collection de Fournisseur

    tu peux aussi écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function TForm1.GetFournisseurLibelleFromHexaCode(const HexaCode: string): string;
    begin
      case StrToInt('$' + HexaCode) of
        $0A01CB : Result := 'Eurl Sarl' ;
        $0A02CB : Result := 'Eurl Biostar' ;
        $... : Result := '...';
      else
        Result := DefaultValue; 
    end;
    Tu peux aussi faire un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function TForm1.GetFournisseurLibelleFromHexaCode(const HexaCode: string): string;
    type
      TFournisseurEnum = (feNone = -1, feEurlSarl, feEurlBiostar); // pour le -1 dans une énum, faudra vérifier
    const
      HEXA: array[TFournisseurEnum] of string = ('', '0A01CB', '0A02CB');
      LIB: array[TFournisseurEnum] of string = (DefaultValue, 'Eurl Sarl', 'Eurl Biostar');
    begin
      Result := LIB[StrUtils.IndexText(HexaCode, HEXA)];
    end;
    Tu vois qu'il existe plein de façon d'écrire ce code de façon plus courte et plus modulable !
    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

  13. #13
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    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 093
    Par défaut
    Je sépare cette réponse de la 1re car le code qui suit est une approche totalement différente du code ci-dessus, ne pas mélanger les deux évidemment !

    oubli les codes en dur comme ci-dessus, je considère que tu utilises l'approche Ini de Paul Toth

    Pour moi, il te faut ajouter lors du remplissage de la Col 5 un TFournisseurObjectForStringGrid qui contient l'identifiant du Fournisseur (Hexa, nom, ID numérique ce que tu veux)

    Voici une variante Objects[]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FournisseurObj := GetFournisseurObjectFromHexaCode(copy(MainForm.CA_SYSTEMS.Cells[3,i+1], 1, 6);
     
    MainForm.CA_SYSTEMS.Cells[4,i+1]:= FournisseurObj.Libelle;
    MainForm.CA_SYSTEMS.Objects[4,i+1]:= FournisseurObj;
    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
    function TForm1.GetFournisseurObjectFromHexaCode(const HexaCode: string): TFournisseurObjectForStringGrid;
    var
      idx : integer;
    // Rappel  Result : TFournisseurObjectForStringGrid; 
    begin
      // FFournisseurList est un membre privé de TForm1 ou d'un objet plus générale ...
      if not Assigned(FFournisseurList) then
      begin
        FFournisseurList := TStringList.Create(); // Free dans TForm1.OnDestroy
        FFournisseurList.Duplicates := dupIgnore;
        FFournisseurList.Sorted := true;
      end;
     
      idx := FFournisseurList.IndexOf(HexaCode);
      if idx < 0 then
      begin
        Result := TFournisseurObjectForStringGrid.Create(HexaCode); // Gére un Fournisseur 'par défaut' en cas de HexaCode pas prévu dans le Ini
        Result.LoadFromIni(); // Voir approche de Paul TOTH
        FFournisseurList.Add(Result);
      end
      else
        Result := TFournisseurObjectForStringGrid(FFournisseurList.Objects[idx]);
    end;
    TStringList évidemment pour D7 avec un Delphi récent un Map<String, TFournisseurObjectForStringGrid>, Map c'est en C++, Dictionnary en Delphi ???
    Ne pas oublier que chaque Create correspond à un Free, note que les objets sont partagés, si plusieurs cellules ont le même fournisseur, elles partegeront le même object

    TFournisseurObjectForStringGrid contient une TStringList qui associe de la même façon String et TProduitObjectForStringGrid !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // FournisseurObj := GetFournisseurObjectFromHexaCode(copy(MainForm.CA_SYSTEMS.Cells[3,i+1], 1, 6);
    // ou directement
    FournisseurObj := TFournisseurObjectForStringGrid( MainForm.CA_SYSTEMS.Objects[4,i+1]);
    ProduitObj := FournisseurObj.GetProduitObjectFromMarque(MainForm.CA_SYSTEMS.Cells[0,i+1]);
    MainForm.CA_SYSTEMS.Cells[5,i+1] := ProduitObj.Mark;
    MainForm.CA_SYSTEMS.Objects[5,i+1] := ProduitObj;
    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
    function TFournisseurObjectForStringGrid.GetProduitObjectFromMarque(const NomProduit: string): TProduitObjectForStringGrid;
    var
      idx : integer;
    // Rappel  Result : TProduitObjectForStringGrid; 
    begin
      // FProduitList est un membre privé de TFournisseurObjectForStringGrid
      if not Assigned(FProduitList) then
      begin
        FProduitList := TStringList.Create(); // Free dans TFournisseurObjectForStringGrid.Destroy
        FProduitList.Duplicates := dupIgnore;
        FProduitList.Sorted := true;
      end;
     
      idx := FProduitList.IndexOf(NomProduit);
      if idx < 0 then
      begin
        Result := TProduitObjectForStringGrid.Create(NomProduit); // Gére un produit 'par défaut' en cas de NomProduit pas prévu dans le Ini
        Result.LoadFromIni(); // Voir approche de Paul TOTH
        FProduitList.Add(Result);
      end
      else
        Result := TProduitObjectForStringGrid(FProduitList.Objects[idx]);
    end;
    Je n'ai fait que du Lazy-loading pour te montrer les Create, évidemment, un peux aussi procéder à une lecture globale du fichier ini et créer tout d'un coup !
    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

  14. #14
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    ou une table(s) xml avec TClientDataset, comme si tu travail en mode déconécter

  15. #15
    Membre confirmé
    Inscrit en
    Août 2007
    Messages
    159
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 159
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function TForm1.GetFournisseurLibelleFromHexaCode(const HexaCode: string): string;
    type
      TFournisseurEnum = (feNone = -1, feEurlSarl, feEurlBiostar); // pour le -1 dans une énum, faudra vérifier
    const
      HEXA: array[TFournisseurEnum] of string = ('', '0A01CB', '0A02CB');
      LIB: array[TFournisseurEnum] of string = (DefaultValue, 'Eurl Sarl', 'Eurl Biostar');
    begin
      Result := LIB[StrUtils.IndexText(HexaCode, HEXA)];
    end;
    Merci ShaiLeTroll celle la et intéressante je vais faire des test par contre toi tu te base sur le fournisseur alors que mon problème c'est les mark

    Citation Envoyé par edam Voir le message
    ou une table(s) xml avec TClientDataset, comme si tu travail en mode déconécter
    edam tu veut bien développé svp, j'ai pas eu l’occasion de travailler sur des tables xml merci

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 938
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function TForm1.GetFournisseurLibelleFromHexaCode(const HexaCode: string): string;
    type
      TFournisseurEnum = (feNone = -1, feEurlSarl, feEurlBiostar); // pour le -1 dans une énum, faudra vérifier
    const
      HEXA: array[TFournisseurEnum] of string = ('', '0A01CB', '0A02CB');
      LIB: array[TFournisseurEnum] of string = (DefaultValue, 'Eurl Sarl', 'Eurl Biostar');
    begin
      Result := LIB[StrUtils.IndexText(HexaCode, HEXA)];
    end;
    Un premier indice négatif ne pose pas de problème. Par contre ce code ne peut pas fonctionner ainsi.
    Outre LIB qui attend un index de type TFournisseurEnum et non un entier, la procédure IndexText reçoit en paramètre un tableau ouvert, donc à base... zéro. Il y aura un décalage de un élément

    A modifier donc ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Result := LIB[TFournisseurEnum(StrUtils.IndexText(HexaCode, HEXA) +ord(feNone))];

  17. #17
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 093
    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 093
    Par défaut
    Citation Envoyé par Night_Wolf1619 Voir le message
    Merci ShaiLeTroll celle la et intéressante je vais faire des test par contre toi tu te base sur le fournisseur alors que mon problème c'est les mark
    la variante en dure, tu pouvais faire un array[TFournisseurEnum] of array[TProduitEnum] of string, un peu lourd en mémoire peut-être mais en bidouillant comme dans Tableau Dynamique pointant sur Tableau Statiques, tu pourrais avoir un tableau plus léger, je l'ai fait récemment en C++Builder, un tableau de pointer pointant sur des tableaux constants de longueur variable, très pratique, d'ailleurs assez similaire à ta problématique d'association code<->lib


    Tu n'as pas lu toute ma seconde réponse qui apporte une solution POO au problème, une fois avoir le bon TFournisseurObjectForStringGrid, tu as un accès à une collection (TStringList) de TProduitObjectForStringGrid

    Avec le fichier ini, très facile de faire un object TContextForStringGrid qui contient une collection (TStringList) de TFournisseurObjectForStringGrid et d'enchainer la suite

    le code d'utilisation des objets fourni devrait te donner les méthodes que du dois coder, principal LoadFromIni ainsi que les déclarations de classes, lances-toi tu verras qu'il n'y a qu'une heure de travail à peine !

    Citation Envoyé par Andnotor Voir le message
    Il y aura un décalage de un élément
    Pire si IndexText ne trouve pas ça ferai -1-1 donc -2, on est jamais assez prudent !
    Dans ce cas, c'est inutilement complexe cette bidouille de -1, je préfère un code plus explicite et plus direct

    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
    function TForm1.GetFournisseurLibelleFromHexaCode(const HexaCode: string): string;
    type
      TFournisseurEnum = (feEurlSarl, feEurlBiostar);
    const
      HEXA: array[TFournisseurEnum] of string = ('0A01CB', '0A02CB');
      LIB: array[TFournisseurEnum] of string = ('Eurl Sarl', 'Eurl Biostar');
    var
      Idx: Integer;
    begin
      Idx := StrUtils.IndexText(HexaCode, HEXA);
      if Idx >= 0 then
        Result := LIB[TFournisseurEnum(Idx)];
      else
        Result := DefaultValue;
    end;
    Evidemment, l'approche POO à base de TStringList + Ini est bien meilleure qu'un code en dur comme celui ci
    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

  18. #18
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    paul taut peut te dire plus sur les composant TClientdataset
    voir aussi: http://www.jcolibri.com/articles/bdd...taset_xml.html

Discussions similaires

  1. Problème de performance avec une variable
    Par Proxy dans le forum PL/SQL
    Réponses: 9
    Dernier message: 26/11/2012, 14h29
  2. Problème avec remplissage d'une matrice
    Par zimamouche1 dans le forum Général Java
    Réponses: 7
    Dernier message: 26/06/2012, 14h22
  3. Problème de performance avec une regexp
    Par NicoV dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 21/02/2008, 18h46
  4. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17
  5. [C#] Probléme de performance avec IsDbNull
    Par jab dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/04/2005, 11h39

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