Copier des lignes d'un memo vers un autre automatiquement

Résolu
marin1617
Messages postés
43
Date d'inscription
samedi 3 août 2013
Statut
Membre
Dernière intervention
17 décembre 2019
- Modifié par f0xi le 8/08/2013 à 14:47
solilog
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
- 8 août 2013 à 20:25
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

sp40
Messages postés
1284
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
13
8 août 2013 à 10:15
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...

0
f0xi
Messages postés
4205
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
12 mars 2022
37
Modifié par f0xi le 8/08/2013 à 15:03
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 ?]
0
solilog
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Statut
Membre
Dernière intervention
18 avril 2015
10
8 août 2013 à 20:25
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
0