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
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...
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 ?]
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.