Copier des lignes d'un memo vers un autre automatiquement [Résolu]

Signaler
Messages postés
43
Date d'inscription
samedi 3 août 2013
Statut
Membre
Dernière intervention
17 décembre 2019
-
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
-
Bonjour, je li un port com en permance et affiche sur un memo. Je souhaite recopier certaines lignes sur un aure memo automatiquement.
Avec ce code:

for i := 0 to Memo.Lines.Count-1 do
  if (pos('ALM', uppercase(Memo.Lines[i])) <> 0) or 
     (pos('ACK', uppercase(Memo.Lines[i])) <> 0) or
     (pos('RTN', uppercase(Memo.Lines[i])) <> 0) then
       Memo1.Lines.Add(Memo.Lines[i]);


J'y parviens lorsque l'on appui sur un bouton. mais dès que je met ce code de le memo à copier voici ce que j'obtiens: pour une ligne ecrite :

06 Ao- 2013 02:31:11 ALM DISC 2-06-2-17 DEFAUT INTERRING ON

et voici ce que j'obtiens sur le deuxieme memo :

06 Ao- 2013 02:31:11 ALM DIS
06 Ao- 2013 02:31:11 ALM DISC 2-06-2-17 DE
06 Ao- 2013 02:31:11 ALM DISC 2-06-2-17 DEFAUT INTERRING
06 Ao- 2013 02:31:11 ALM DISC 2-06-2-17 DEFAUT INTERRING
06 Ao- 2013 02:31:11 ALM DISC 2-06-2-17 DEFAUT INTERRING
06 Ao- 2013 02:31:11 ALM DISC 2-06-2-17 DEFAUT INTERRING ON


Pourriez vous m'éclairer svp...

Le marin

3 réponses

Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
A quel moment fais tu ta copie ? Tu utilises un timer ?
A mon avis, dans ton "if", il faut que tu ajoutes une condition sur la validité d'une ligne. C'est à dire que tu dois ignorer les lignes incomplètes...

Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
37
Déjà, utilise des TListBox, les mémo ne se prêtent pas trop à ce genre de jeux, notamment a cause du WordWrap et pleins d'autre nuances qui peuvent vite t'embeter.

voici comment je procèderais :

ListBoxRecept -> remplace Memo
ListBoxLog -> remplace Memo1

(prend l'habitude de nommer correctement tes objets pour te repèrer plus vite dans tes programmes !)

on ne fait pas 3 fois le même traitement sur la même donnée, contrairement à PHP, Delphi n'a pas forcement de système de Cache pour les resultat de fonction identique. Donc utilisation d'une Variable Locale qui contiendra la Donnée traitée.

procedure TFormX.updateLine;
var S: string;
    N: integer;
begin
  ListBoxLog.Items.BeginUpdate;
  try
    for N := 0 to ListBoxRecept.Count - 1 do
    begin
      S := UpperCase(ListBoxRecept.Items[N]);
      if (pos(' ALM ', S) + pos(' ACK ', S) + pos(' RTM ', S)) <> 0 then
        if ListBoxLog.Items.IndexOf(S) = -1 then
          ListBoxLog.Items.Add(S);
    end;
  finally
    ListBoxLog.Items.EndUpdate;
  end;
end;



Oui, des pos + pos + pos ça raccourcis un peu le nombre d'instructions dans la condition.


________________________________________________________
[ besoin de câbles audio, vidèo, informatique pas cher ?]
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
10
Bonsoir,
ton code est correct. Oui ile est bon de l'améliorer avec un string et un seul uppcase (f0xi), mais tes tests sont corrects. A mon avis l'erreur est ailleurs. Soit:
1 Tu dis:
"J'y parviens lorsque l'on appui sur un bouton. mais dès que je met ce code de le memo à copier voici ce que j'obtiens: pour une ligne ecrite..."

Quand lancé avec le bouton, c'est bon, ? Tu as donc un prob dans l'appel de ta proc qui lit Memo pour charger Memo1. L'aurais-tu mis dans un évenement, lequel ? OnChange ? chaque fois que tu mofif le memo çà exec ta proc ? elle pourrait se lancer plusieurs x par sec en mm temps ? Ca devrait être qq'chose comme çà.

L'idée d'un timer n'est pas mal, que tu activerais avec un CheckBox ou bouton.

2 peut-être des char spéciaux (CR, LF, TAB, ...) dans le memo source qui ferait déconner l'instruc Listbox.items[ ] (peu de chance)

3 c'est ta proc qui lit le COM port et qui charge qui met plusieurs lignes incomplètes dupliquées (à vérifier).

4 un bug dans ton code que tu n'as pas vu, 1 au lieu de i dans un fox i:=, un truc bête

Mais çà sent le 1: évènement OnChange
Bon amusement.

solilog