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

Messages postés
42
Date d'inscription
samedi 3 août 2013
Dernière intervention
15 août 2014
-
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
Afficher la suite 

Votre réponse

3 réponses

Messages postés
1293
Date d'inscription
mardi 28 octobre 2003
Statut
Contributeur
Dernière intervention
3 juillet 2015
0
Merci
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...

Commenter la réponse de sp40
Messages postés
4304
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
9 mars 2018
0
Merci
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 ?]
Commenter la réponse de f0xi
Messages postés
273
Date d'inscription
samedi 13 juin 2009
Dernière intervention
18 avril 2015
0
Merci
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
Commenter la réponse de solilog

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.