marin1617
Messages postés42Date d'inscriptionsamedi 3 août 2013StatutMembreDernière intervention17 décembre 2019
-
Modifié par f0xi le 8/08/2013 à 14:47
solilog
Messages postés273Date d'inscriptionsamedi 13 juin 2009StatutMembreDernière intervention18 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
sp40
Messages postés1276Date d'inscriptionmardi 28 octobre 2003StatutContributeurDernière intervention 3 juillet 201515 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...
f0xi
Messages postés4205Date d'inscriptionsamedi 16 octobre 2004StatutModérateurDernière intervention12 mars 202235 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.
(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 ?]
solilog
Messages postés273Date d'inscriptionsamedi 13 juin 2009StatutMembreDernière intervention18 avril 201510 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.