![]() |
|
|
#1
|
|||
|
|||
|
Здравствуйте, подскажите реально ли такое провернуть.
На форме есть три листвью, каждый в режиме "репорт". Первый и второй листвью постоянно наполняются записями. Задача. Допустим раз в минуту, проверять обе таблички на совпадение записей в них. Значение второго и третьего столбца в listview1 и listview2 могут совпадать. Также у listview2 есть четвертый и пятый столбец. Так вот, если находятся совпадения по таблицам второго и третьего столбца, а в четвертом столбце listview2 значение "груша", то из listview2 брать значение пятого столбца и записывать его listview3. 124.png |
|
#2
|
|||
|
|||
|
Ну, типа, как то так:
Код:
procedure TForm1.UpdateList3(List1, List2, List3: TListView; KeyWord : String);
var
I, J : Integer;
begin
List1.Items.BeginUpdate;
List2.Items.BeginUpdate;
List3.Items.BeginUpdate;
List3.Items.Clear; // удаляем старые совпадения
Try
For I := 0 to List1.Items.Count-1 Do
For J := 0 To List2.Items.Count-2 Do
If (List1.Items[i].SubItems[0] = List2.Items[J].SubItems[0]) And
(List1.Items[i].SubItems[1] = List2.Items[J].SubItems[1]) And
(List2.Items[J].SubItems[2] = KeyWord) Then
List3.Items.Add.Caption := List2.Items[J].SubItems[3];
Finally
List1.Items.EndUpdate;
List2.Items.EndUpdate;
List3.Items.EndUpdate;
End;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
UpdateList3(ListView1,ListView2,ListView3,Edit1.Text);
end;В таймере интервал ставишь на 60000. В принципе, можно ускорить. Например, делая проверку не по таймеру, в в момент добавления итемов в ListView1 и ListView2. Тогда придется либо чуть чуть модифицировать существующий код, либо просто написать 2 похожие процедуры. Суть - проверка добавляемого итема против только одного ListView. Хотя и полная проверка все-равно нужна - на смену кодового слова (в Edit1). Если из дальнейшего сравнения надо исключать уже найденные пары, то надо будет еще дописать кусочек - установку и проверку свойства Data у итемов (и его очистку в самом начале). А вот если надо найти максимальнок кол-во совпадений, да еще и максимизировать результирующую сумму - то тут так легко не отделаться, тут тебе дорога в задачу формирования портфеля. Последний раз редактировалось lmikle, 28.04.2020 в 04:48. |
| Этот пользователь сказал Спасибо lmikle за это полезное сообщение: | ||
pikabu (28.04.2020)
| ||
|
#3
|
|||
|
|||
|
За пример спасибо вам огромное, работает. Потестил, имеется небольшой глюк. Если искомые совпадения есть в последней строке то, значение в 3 листвью не добавляется. А вот если добавить ниже простую строку, без совпадений, то все норм. В целом не критично, но не понятно откуда ноги растут.
Цитата:
Project.rar GIF 28.04.2020 14-48-46.gif |
|
#4
|
|||
|
|||
|
P.S. по вопросу регистра понял, помогло
Код:
ANSIUpperCase |
|
#5
|
|||
|
|||
|
Цитата:
Да, там очепятка во внутреннем цикле. Поправь "Count-2" на "Count-1" и все будет работать. С регистром тоже все просто. В If надо сравнивать без его учета. Короче, вот эти строчки поправить: Код:
For J := 0 To List2.Items.Count-1 Do
If (List1.Items[i].SubItems[0] = List2.Items[J].SubItems[0]) And
(List1.Items[i].SubItems[1] = List2.Items[J].SubItems[1]) And
(AnsiCompareText(List2.Items[J].SubItems[2],KeyWord)=0) ThenПоследний раз редактировалось lmikle, 28.04.2020 в 21:11. |