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 :

For + Case en une instruction.


Sujet :

Delphi

  1. #1
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut For + Case en une instruction.
    Bonjour à tous,

    Pour mon apllication j'ai dû créer de grands tableaux contenant les textes (potentiellement) ajoutable à un treeview en fonction de certaines données que l'utilisateur à rentrer.
    Et j'aimerais pouvoir parcourir ce tableau de manière non séquentiel(par exemple lire les indice de 4 à 8, le 15ième et de 57 à 89). Actuellement je fais des trucs de ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For I:=0 to length(tableau)-1 do
    Begin
     Case I of 4..8,9,57..89:
               Begin
    ....
    Mais je commence à trouver ça un peu lourd (et un peu lent) à la longue...N'existerait-il pas un moyen de réaliser ça plus simplement (avec un IN par exemple), ou suis-je obligé de continuer dans ma voie ?

    Merci pour vos éclairsissements,

    A+.

  2. #2
    Membre confirmé Avatar de host22
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Mars 2007
    Messages : 222
    Par défaut
    Si t'utilise se truc pour la recherche je te conseil de creee une fonction qui te renvoi la position mais il faut la cree selon ta conception exemple:
    si on recherche fred qui est en position 10 tu fais
    f(red) elle e renvois 10en fin sa s'appele H coding? j'éspère que je t'es compris?

  3. #3
    Membre Expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 568
    Par défaut
    salut

    si le tableau n'est pas trop grand (< 255 élément), tu peux essayer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      i : byte;
     
    For I:=0 to length(tableau)-1 do
    Begin
      if I in [4..8,9,57..89] then
      begin
    ....
    Mais je trouve que cela n'apporte pas grand chose, en définitive, sinon une contrainte supplémentaire en maintenance.

    une autre solution consiste à aller chercher directement les élément indicés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      tableau[4]...
      tableau[5]...
      tableau[6]...
      tableau[7]...
      tableau[8]..
    ....
    Place le code de traitement dans une procédure pour éviter les redondances et passes-y tes éléments de tableaux.

    >> plus besoin de for ni de case, mais cela suppose que
    - l'on ne s'intéresse qu'aux dites lignes
    - elles soient toujours présentes (taille de ton tableau >= 89) sinon ilm faut faire des test de limites.

    En faisant abstraction de l'appel de procédure, le fait de dérouler une boucle amène en général un gain de vitesse (c'est une technique d'optimisation, notamment dans les jeux). Mais il faut rester raisonnable....

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  4. #4
    Membre Expert Avatar de philnext
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 553
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 553
    Par défaut
    Disons que ton besoin n'est pas très clair.
    C'est vrai que tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if I in [4..8,9,57..89] then
    mais bon...
    SI tu nous dis à quoi ça sert on aura + d'idées (peut être !)

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Février 2006
    Messages
    624
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 624
    Par défaut
    Bonjour


    Pour mon apllication j'ai dû créer de grands tableaux contenant les textes (potentiellement) ajoutable à un treeview en fonction de certaines données que l'utilisateur à rentrer.
    Et j'aimerais pouvoir parcourir ce tableau de manière non séquentiel(par exemple lire les indice de 4 à 8, le 15ième et de 57 à 89).
    Un tableau de textes...ok. une liste de chaines ne serait elle pas mieux adaptée.
    Avec une stringlist tu bénéficies de toutes les méthodes de la classe TStringList notamment le parcours d'éléments, l'accés direct, ajout supression etc..


    @+

  6. #6
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 491
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 491
    Par défaut
    salut

    si j'ai tout compris actuellement selon les action tu genere un numero
    qui te permettra d'aller chercher certaine ligne de ton tableau
    en fait il serait plus simple de creer une liste d'indice selon les action realisée

    de plus le case est limite a 255 tout comme les ensemble donc le in.
    De plus le in est une fontion lentes.
    Je serait toi je reverrai un peut ma logique

    tu pourrait par exemple utiliser des arbres
    et a chaque changement d'unite le chiffre correspond au noeud a atteindre en partant de plus haut au plus pas

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     233
    []--[](01)
    []--[](11)
    []--[](21)
         [](22)
         []--[](231)
              [](232)
              [] (233)<= ici la cellule contenant le texte
    @+ Phil

  7. #7
    Expert confirmé

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Par défaut
    Citation Envoyé par anapurna
    de plus le case est limite a 255 tout comme les ensemble donc le in.
    De plus le in est une fontion lentes.
    Le in est très rapide : il s'agit d'une simple instruction bt (bit test) en assembleur.

    Il existe aussi une version condensée du for in depuis Delphi... 2005 je crois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for Indice in [4..8, 9, 57..89] do
    Il y a des chances pour le compilateur optimise ça du mieux qu'il peut
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    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 089
    Par défaut
    Et la propriété Node.Data ? en lui mettant des Objets tu ne pourrais pas remplacer ton Tableau ?

    En fait, ta méthode du tableau doit peut-être simplifiée ! si tu disais ton objectif réel, on pourrait te trouver une solution que l'on a déjà pu mettre en place !
    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 émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Merci pour toutes ces idées,
    mais effectivement pour que les réponses soient efficaces, il faut que la question soit posé correctement.

    Donc voici ce que je souhaite faire exactement:
    j'ai un TTreeview qui me permet (avec des cases à cocher) de faire un tri sur une longue liste de variables que l'utilisateur peut afficher (je développe un logiciel de simulation électrique) :Tension, courant, puissance... et en fonction des éléments posés par ce même utilisateur, certains noeuds de tri n'existent pas (exemple si on a pas de générateur alternatif, inutile d'afficher la donnée Cos(phi) comme choix de tri possible).

    Une donnée physique peut appartenir à plusieurs éléments à afficher (Tension appartient à voltmètre, à générateur...). Donc j'ai créé deux tableaux, un de string contenant mes données physiques, un autre contenant des booleans (false par défaut), ensuite je parcours mes tables d'entrée, et lorsqu'il existe un élément d'un certain type,je place les booléans correspondant à cet élément à true. Pour finir je parcours mon tableau de booléan et je crée mon TreeView en affichant les données physiques associées à un true...

    Et donc "utiliser" un élément revient à agir sur une certaine liste d'indice de ces 2 tableaux(exemple Volmètre: 4..8, 9, 57..89). Et je cherchais un moyen plus simple de faire ça.

    A+.

  10. #10
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    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 089
    Par défaut
    Ton mécanisme de tableau semble être un "scénarii de comportement", ça me semble la bonne méthode, maintenant, le mélange For et Case est peut-être maladroit ...

    tu devrais peut-être hiérachisé tes données par des tableaux de tableaux, des tableaux de structures constants ... tu peux ainsi faire des pointeurs sur procédures pour assouplir ton code, ... il faut plus revoir le système de stockage de tes modèles ...

    une exemple de code qui pourrait te donner une inspiration sur le genre de code "dynamique" que l'on peut écrire ...

    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
    type
      TBiduleArrayItem = record
        Entier: Integer;
        Chaine: string;
        Ex: Word;
        Getter: Pointer;
      end;
      TBiduleGetter = function(const Item: TBiduleArrayItem): string;
     
    function DefaultGetter(const Item: TBiduleArrayItem): string;
    begin
      Result := Item.Chaine + ' = ' + IntToStr(Item.Entier)
    end;
     
    function SecondGetter(const Item: TBiduleArrayItem): string;
    begin
      Result := Item.Chaine + ' = ' + IntToStr(Item.Entier) + ' [' + IntToStr(Item.Ex) + ']';
    end;
     
    const
      BIDULES : array[0..2] of TBiduleArrayItem =
      (
        (Entier: 10; Chaine: 'Dix'; Getter: @DefaultGetter),
        (Entier: 20; Chaine: 'Vingt'; Getter: @SecondGetter),
        (Entier: 300;Chaine: 'Trente'; Ex: 333; Getter : @SecondGetter)
      );
     
    procedure TFrmTestMemory.BtnArrayStructClick(Sender: TObject);
    var
      i: Integer;
    begin
      for i := Low(BIDULES) to High(BIDULES) do
        ShowMessage(TBiduleGetter(BIDULES[i].Getter)(BIDULES[i]));
    end;

    Jaffa ! Kri !
    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

  11. #11
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Ok, donc si je comprend bien mon problème viens de ma façon de stocker mes données...Et c'est clair que c'était un peu le foutoir.
    Je vais tenter de remettre de l'ordre en essayant si possible d'appliquer ton idée (même si j'avoue qu'au départ j'ai eu un peu de mal à comprendre )...L'essentielle du problème réside surtout dans la façon dont elles sont arrangées (un seul bloc de 89 varaibles c'est peut-être un peu trop...)

    Mais bon, quelque soit la difficulté du Delphi, je n'aurais qu'une chose à dire,
    Shal kek nem ron !

    Merci encore pour votre aide,

    A+.

  12. #12
    Membre émérite Avatar de PadawanDuDelphi
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2006
    Messages
    678
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Bâtiment

    Informations forums :
    Inscription : Août 2006
    Messages : 678
    Par défaut
    Bon j'ai organiser mes tableaux de façons beaucoup plus clair, mais dans certain cas j'ai été obligé de garder ma stucture For + Case.

    Il existe aussi une version condensée du for in depuis Delphi... 2005 je crois :
    Code :

    for Indice in [4..8, 9, 57..89] do
    Begin

    End;

    Il y a des chances pour le compilateur optimise ça du mieux qu'il peut
    J'ai testé ça...Mais ça me fait du n'importe quoi: des indices qui sautent notamment (c.a.d Indice est bien incrémenté de 4 à 89, sauf qu'il ne rentre pas dans le Begin End; pour Indice=9 par exemple). Enfin plein de chose bizarre qui font que j'ai laisser tomber cette écriture.

    Merci pour votre aide, je considère ce problème comme résolu.

    A+.

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

Discussions similaires

  1. blocage sur une instruction For Next et Exit For
    Par valérieF dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/05/2015, 16h54
  2. Une instruction s'execute qd on appuie sur entree
    Par nbutin dans le forum C++Builder
    Réponses: 1
    Dernier message: 17/08/2004, 00h48
  3. Réponses: 3
    Dernier message: 06/07/2004, 10h21
  4. Problème avec une instruction OUTER /Postgres
    Par Volcomix dans le forum Langage SQL
    Réponses: 14
    Dernier message: 21/04/2004, 16h56
  5. Passer de la zone d'édition vers une instruction sql
    Par tripper.dim dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 14h44

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