|
#1
|
|||
|
|||
listview поиск
Здравствуйте, подскажите реально ли такое провернуть.
На форме есть три листвью, каждый в режиме "репорт". Первый и второй листвью постоянно наполняются записями. Задача. Допустим раз в минуту, проверять обе таблички на совпадение записей в них. Значение второго и третьего столбца в 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. |