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 :

Pour connaisseur des TMEMO


Sujet :

Delphi

  1. #1
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Par défaut Pour connaisseur des TMEMO
    Bonjour à tous,
    me revoilà pour une nouvelle question relative au comportement des TMemos. Je les utilise souvent pour debugger entre autres, mais il y a une subtilité qui me gène encore et dont je n'arrive pas à trouver l'origine.. ( Je suis pour le moment un amateur débutant...)

    Le projet en cours est un quizz et je dois mélanger des questions, afin de les poser dans un nombre plus ou moins aléatoire. je dois donc mélanger les nombres de 1 à 10 pour commencer. pour cela, j’utilise la fonction Random pour des chiffres de 1 à 10, avec 100 tirages et je regarde le résultat dans un Tmemo, où les chiffres s'affichent sur les lignes qui correspondent. (C'est un peu bizarre, mais j'avais envie de voir le comportement de "random").
    le code est :
    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
      Form11: TForm11;
          z, max : integer;
     
     
    implementation
     
     
    {$R *.dfm}
     
    procedure TForm11.Button1Click(Sender: TObject);
      var i : integer;
    begin
     
             memo1.Clear;
     
          for i := 1 to 100 do
               begin
               z:= random(10);
               memo1.Lines[z] := memo1.Lines[z]+' '+ (z+1).ToString;
     
               end;
     
    end;
     
     
    procedure TForm11.FormActivate(Sender: TObject);
     var i : integer;
     
    begin
      max := 10;
     
              //randomize;
              for i := 1 to 100 do
               begin
               z:= random(10);
               memo1.Lines[z] := memo1.Lines[z]+' '+ (z+1).ToString;
     
               end;
     
     
    end;
     
    end.

    Un premier tirage à lieu à l'activation de la fiche, et ensuite quand je clique sur le bouton_1.

    Le comportement du TMemo qui me gène, c'est le fait de "réserver" au départ le nombre de ligne dans les propriétés, et de devoir y écrire quelque chose, juste pour ce ça fonctionne ensuite pour affiche mes valeurs :
    Nom : nb_lignes_meme.png
Affichages : 630
Taille : 5,7 Ko (dans mon cas j'ai juste fais entrer pour valider des lignes )

    Ca fonctionne bien et si je clique j'ajoute un tirage à chaque fois.
    Nom : memo_sans_clear.png
Affichages : 621
Taille : 2,8 Ko

    Cependant, si je veux voir un seul tirage à la fois, je mets le "Clear" qui est actuellement en commentaire et cela devient moins rigolo et donne :
    Nom : memo_avec_clear.png
Affichages : 612
Taille : 2,3 Ko
    Seule la ligne indexée "0" semble à présent s'afficher, même si moi, je mets des infos sur d'autres lignes, elles semblent carrément ignorées!

    J'en arrive à mes questions :

    Un Tmemo a-t-il uniquement la ligne 0 active par défaut? Si oui, comment "vérrouiller" un nombre minimum de lignes considérées?
    Pourquoi un TMemo n'affiche pas toujours la ligne désirée alors qu'on y envoie une valeur?
    Comment à la fois effacer le contenu des lignes actuellement affichées, tout en pouvant les remplir et les afficher à nouveau avec d'autres chaines en étant sur que l'affichage sera validé??


    Question subsidiaire pour le "random" mais non indispensable. J'ai fais des tests en activant ou pas la fonction conseillée "Randomize", mais j'ai rein constaté de plus. Est-ce vraiment utile??


    Voila pour le moment. Merci à tous ceux qui pourront m'éclairer sur ce comportement lunatique de mes Tmemos pour l'affichage!!

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    pour moi c'est le remplissage du mémo qui est source de problème, j'aurais écrit ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm11.Button1Click(Sender: TObject);
      var i : integer;
    begin
     
             memo1.Clear;
     
          for i := 1 to 100 do
               begin
               z:= random(10);
               memo1.Lines.Add((z+1).ToString);
           end;
     
    end;
    pour obtenir 100 lignes contenant chacune un chiffre

  3. #3
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Par défaut le point qui m'échappe
    Bonjour SergioMaster et merci pour ton message.

    En fait, si je ne passe pas par un "Clear", les tirages se succèdent et s'organisent sur les lignes. tout est OK.

    cependant si je veux un nouveau tirage unique de 100 nouvelles valeurs, alors je "Clear" le Tmemo, et c'est là qu'il ne me reste plus que la ligne_0 à l'affichage.
    Mais pourquoi?? Quelle est la logique??

    Y-a-t-il une commande ou une propriété, qui stipule au MEMO1 que je désire afficher 10 lignes au minimum, tout le temps, et même si je fais un "Clear", comme prévu à son initialisation??

    Pourquoi ne comprend-t-il plus après le "Clear" que je désire, par exemple, toujours afficher les lignes indexées de 1 à 10, alors que j'en fait la commande dans le code et qu'il ne m'indique pas d'erreur à la compilation?

    Dois-je à chaque fois, pour éviter de faire "Clear", ré-écrire une chaine vide sur chaque ligne, avant de commencer un nouveau traitement? plutôt lourd, non, les concepteurs ont bien dû penser à ça?

    Cet affichage "un coup oui, un coup non", me gène car il me manque un "quelque chose" pour maitriser vraiment et pouvoir compter sur tous les affichages que je souhaite dans les situations traitées?...








    Citation Envoyé par SergioMaster Voir le message
    Bonjour,

    pour moi c'est le remplissage du mémo qui est source de problème, j'aurais écrit ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm11.Button1Click(Sender: TObject);
      var i : integer;
    begin
     
             memo1.Clear;
     
          for i := 1 to 100 do
               begin
               z:= random(10);
               memo1.Lines.Add((z+1).ToString);
           end;
     
    end;
    pour obtenir 100 lignes contenant chacune un chiffre

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 910
    Billets dans le blog
    6
    Par défaut
    Dans la mesure où le Clear efface le Text du Memo, il n'y a plus de lignes : Count vaut 0).
    Il suffit de déclarer une variable affectée en concaténant 10 sLineBreak dans une boucle pour l'affecter à la propriété TMemo.Text au lieu de faire le Clear :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Button2Click(Sender: TObject);
    var
      i: integer;
      sDixLignesVides: string;
    begin
      Memo1.Lines.Clear; // équivalent à Memo1.Text := '';
      ShowMessage(Memo1.Lines.Count.ToString);
      for i:=1 to 10 do sDixLignesVides := sDixLignesVides+sLineBreak;
      Memo1.Text := sDixLignesVides;
      ShowMessage(Memo1.Lines.Count.ToString);
      for i:=1 to 10 do Memo1.Lines[i-1] := Memo1.Lines[i-1] + i.ToString;
    end;
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Par défaut OK, plus de Clear sur Tmemo
    Bonjour et merci pour vos réponses,

    je reste néanmoins sceptique sur le fait que le "Clear" rend le Tmemo pratiquement inopérant, alors qu'il est toujours existant.
    Si le "Clear" efface le texte, ce qui est son rôle, il ne me paraissait pas absurde que le simple fait de solliciter l'affichage de nouvelles chaines rende à nouveau le contrôle actif sur les lignes choisies...

    Ce n'est pas grave, je n'utiliserai plus le "CLEAR" qui me parait "piégeux", mais plutôt une ligne de texte vide pour "nettoyer" sans rendre inutilisable les lignes voulues :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i := 1 to 50 do  memo1.lines[i-1] := '';
    Merci encore et surement à bientôt pour de nouvelles interrogations!...

  6. #6
    Membre Expert Avatar de guillemouze
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    876
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2004
    Messages : 876
    Par défaut
    Citation Envoyé par patdu26 Voir le message
    Ce n'est pas grave, je n'utiliserai plus le "CLEAR" qui me parait "piégeux", mais plutôt une ligne de texte vide pour "nettoyer" sans rendre inutilisable les lignes voulues :
    Je crois que tu as une mauvaise interprétation du TMemo ... ce n'est rien qu'une liste de lignes.
    Démarre bloc-notes, appuie sur la fleche du bas ... il ne se passe rien, tu n'as pas de ligne supplémentaire. Si ton memo est _cleared_, il n'y a pas de lignes dedans.
    Ce que tu cherches peut etre, c'est une StringGrid, a laquelle tu définis un nombre de colonnes et de lignes, est quand tu clear, ce n'est que le contenu qui est effacé

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 569
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 569
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    lors de ma première réponse je n'avais pas vraiment compris le but.
    En fait vous utilisez TMemo d'un manière peu conventionnelle en considérant que Lines n'est pas un TStringList mais un tableau de chaine de taille fixe c.a.d un Array [1..50] of String

    vous auriez pu faire ceci

    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
     
      public
        { Déclarations publiques }
        tirage : Array [1..50] of String;
      end;
     
    var
      Form109: TForm109;
     
    implementation
     
    {$R *.dfm}
    // Remplir
    procedure TForm1.btnFillClick(Sender: TObject);
    var i : word;
        z : word;
    begin
    Memo1.Lines.Clear;
    for I := Low(tirage) to high(Tirage) do
      begin
        z:=Random(10)+1;
        Tirage[i]:=StringOfChar(Char(47+z),z);
    //    Tirage[i]:=StringOfChar(Char(Random(74)+48),z);   // plus de char (de 0 à z)
        Memo1.Lines.Add(Tirage[i]);
      end;
    end;
     
    // Changer une ligne
    procedure TForm1.Memo1DblClick(Sender: TObject);
    var indexdelaligne : integer;
        z : Word;
    begin
    indexdelaligne := SendMessage(Memo1.Handle, EM_LINEFROMCHAR, memo1.SelStart, 0);   // ligne en cours
    z:=Random(10)+1;
    Memo1.Lines[indexdelaligne]:=StringOfChar(Ch(47+z),z)           // StringOfChar(Char(Random(74)+48),z);
    end;
     
    end.
     
    end;
    Notez que j'ai utilisé StringOfChar qui fait la même chose que votre concaténation

  8. #8
    Membre confirmé

    Homme Profil pro
    Enseignant
    Inscrit en
    Février 2020
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Février 2020
    Messages : 178
    Par défaut Le Tmemo n'était peut-être pas approprié...
    Bonjour à tous et merci pour vos commentaires à nouveau.
    Je crois en effet que le choix d'un Tmemo n'était pas approprié pour mon cas. Je me suis obstiné avec cet objet alors qu'un tableau de String semble plus logique dans ce cas.
    Mon tirage au sort de nombre fonctionne à présent. Le but n'est d'ailleurs pas de visualiser le résultat dans un Tmemo mais simplement de tirer au sort quelques questions numérotées parmi un éventail pré-établi, afin que dans mon quizz (qui est le projet en cours), les questions posées soient assez souvent différentes et dans un ordre un peu aléatoire.

    Sans prétention, j'ai proposé dans la partie "source", le résultat de mon travail, en espérant qu'il pourra intéresser quelqu'un, qui sait.

    Encore merci à tous et à très bientôt certainement pour de nouvelles problématiques...

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

Discussions similaires

  1. quel langage pour créer des "applications" sur 1 s
    Par jaribu dans le forum Langages de programmation
    Réponses: 7
    Dernier message: 30/07/2003, 14h06
  2. configurer sql pour envoyer des mails
    Par arwen dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 29/07/2003, 15h28
  3. cherche module ou langage pour récupérer des données audio..
    Par Ry_Yo dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 12/05/2003, 17h44
  4. Script pour envoyer des info a mysql
    Par rhum1 dans le forum Linux
    Réponses: 6
    Dernier message: 15/04/2003, 16h19
  5. Réponses: 3
    Dernier message: 02/09/2002, 18h49

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