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 :

faire un affichage RDS


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut faire un affichage RDS
    Hello.

    Je cherche à faire un rendu style "RDS" (radio) avec Delphi.

    Il faudrait que toutes les 3 secondes je mette à jour un Caption avec maximum 8 caractères d'une ligne complète..

    Exemple : Si j'ai "Nolween Leroy - Nolween Ohwo"
    cela devrait donner :

    Nolween (3sec)
    Leroy (3sec)
    - (3sec)
    Nolween (3sec)
    Ohwo (3sec)

    J'ai mon timer ok, mais comment gérer ça?

    Merci de vos bonnes idées..

  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
    Dans un timer

    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
     
    var
      lst : TStringList;
    begin
      lst := TStringList.create;
      try
        lst.text := 'Nolween Leroy - Nolween Ohwo';
        // on mets les mots sur des lignes séparées dans la liste en remplacant les espaces
        // par des CRLF
        lst.text := StringReplace(lst.text, ' ' , #13#10,[rfReplaceAll]); 
     
        // on affiche dans le label
        MonLabel.caption := lst.Strings[Timer(Sender).Tag];
        Application.ProcessMessage;
     
        // on augemente le tag du timer pour qu'au prochain passage on passe
        // à la ligne suivante dans la liste.
        Timer(Sender).tag := Timer(Sender).tag + 1;
        if Timer(Sender).tag > lst.count then
          Timer(Sender).tag := 0; 
      finally
        lst.Free;
      end;
    end;
    Code non testé et surement à modifier pour qu'il soit compatible avec ton programme.
    Modérateur Delphi

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

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Par défaut
    La réponse de Malatar est pas mal sauf que les mots de plus de 8 caractères ne sont pas découpés...

    Je propose donc ce code... Fortelent inspiré du post précédent!

    Tout d'abord, la fonction qui découpe la chaine en mots d'au plus 8 caractères
    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
    var
      chaine_depart: string;  // Variable uniquement pour les tests
      wordlist : TStringList;   // StringList contenant le résultat
      currentword: string;     // Variable intermédiare contenant le mot (d'au plus 8 caractères) à insérer dans la liste de résultat
      i,j: integer;                // Variables internes
    begin
      wordlist := TStringList.create;
      try
        // On rempli la chaine de test avec des valeurs bidons
        chaine_depart := 'Nolween Leroy - Testgrandmot - Nolween Ohwolulio';
     
        // On ajoute un espace à la fin de la chaine à manipuler. Si on ne le fait pas, on risque de ne pas prendre en compte le dernier mot!
        chaine_depart := chaine_depart + ' ';
     
        j := 1;
     
        // Boucle qui va scruter la chaine à découper
        repeat
          // i représente la position du prochain caractère espace trouvé
          // j représente la position du dernier caractère traité
          // PosEx va chercher, à partir de j (initialisé à 1, début de la chaine au départ) la position du prochain caractère espace
          i := PosEx(' ', chaine_depart, j);
     
          // Si i - j est supérieur à 8, on est tombé sur un mot de plus de 8 caractères
          if ((i - j) > 8) then
          begin
            // Dans ce cas, on copie les 8 premiers caractères uniquement (on tronque le mot)
            currentword := copy(chaine_depart, j, 8);
            // Et on incrément notre variable j pour indiquer, à la prochaine boucle, où il faut reprendre le traitement
            j := j + 8;
          end
          else  // Sinon, on est tombé sur un mot de 8 caractères ou moins
          begin
            // Dans ce cas, on copie les caractères jusqu'à la position de notre espace, soit à partir de j jusque (i - j)
            currentword := copy(chaine_depart, j, (i - j));
     
            // Enfin, on incrémente j pour 'sauter' le caractère espace qui ne nous intéresse plus pour traiter la suite de la chaine
            j := i + 1;
          end;
     
          // Enfin, on peut insérer dans notre liste 'résultat' le mot / groupe de caractères trouvé!
          wordlist.Add(currentword);
     
        until (i = 0); // Si PosEx renvoie 0, c'est que la recherche fut infructueuse! C'est en partie pour ça qu'il faut ajouter un espace à la fin de la chaine de test pour traiter le dernier mot
    Enfin, le reste du code pour afficher le résultat dans un label...
    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
     
        // on affiche dans le label
        Label1.caption := wordlist.Strings[Tag];
     
        // on augemente le tag du timer pour qu'au prochain passage on 
        // affiche le mot suivant
        tag := tag + 1;
     
        // Ne pas oublier le -1 sur count, sinon on va sortir des bornes de l'objet StringList
        if tag > wordlist.count - 1 then
          tag := 0;
      finally
        wordlist.Free;
      end;
    end;
    Informations importantes: le code situé ci-dessus à été tester dans l'événement d'un timer... J'ai juste découpé le code pour comprendre les différentes étapes! Donc pas d'inquiétude sur les begin / end qui passent d'un bloc de code à un autre!

    L'idéal serait de couper ces deux codes. En effet, sur l'exemple, le découpage de la chaine se fait à chaque appel du timer... bref, on fait 50.000 fois la même chose, ce qui est inutile!!!

    Il faudrait donc, dans l'idéal, une fonction qui coupe la chaine, puis une autre pour afficher un élément...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut
    Merci Gaadek !!
    Ton code est super !!

    Un tout grand merci

    PS: Il faut loader l'unit StrUtils pour avoir accès à PosEx()

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    213
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 213
    Par défaut
    Ahhhhhhh y'a un bug.
    Parfois je reçois des "Indice de liste hors limite (11)" ou un truc du genre..

    Why ?

  6. #6
    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
    Fait voir ton code, c'est plus simple pour nous pour t'aider à débuger ^^
    Modérateur Delphi

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

Discussions similaires

  1. [XSLT] faire un affichage par groupe
    Par amen_1919 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 10/01/2009, 14h56
  2. [Spip] Faire un affichage en colonne avec 7 articles
    Par guy2004 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 19/07/2008, 18h23
  3. Réponses: 1
    Dernier message: 20/04/2007, 09h35
  4. Faire un affichage graphique
    Par Seifer dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 08/12/2006, 08h48
  5. Réponses: 4
    Dernier message: 14/11/2006, 10h50

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