Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.04.2020, 09:29
pikabu pikabu вне форума
Прохожий
 
Регистрация: 27.12.2017
Сообщения: 30
Версия Delphi: 10.1
Репутация: 10
По умолчанию listview поиск

Здравствуйте, подскажите реально ли такое провернуть.

На форме есть три листвью, каждый в режиме "репорт".
Первый и второй листвью постоянно наполняются записями.

Задача. Допустим раз в минуту, проверять обе таблички на совпадение записей в них.
Значение второго и третьего столбца в listview1 и listview2 могут совпадать.
Также у listview2 есть четвертый и пятый столбец. Так вот, если находятся совпадения по таблицам второго и третьего столбца, а в четвертом столбце listview2 значение "груша", то из listview2 брать значение пятого столбца и записывать его listview3.

124.png
Ответить с цитированием
  #2  
Старый 28.04.2020, 04:39
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, типа, как то так:
Код:
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  
Старый 28.04.2020, 12:53
pikabu pikabu вне форума
Прохожий
 
Регистрация: 27.12.2017
Сообщения: 30
Версия Delphi: 10.1
Репутация: 10
По умолчанию

За пример спасибо вам огромное, работает. Потестил, имеется небольшой глюк. Если искомые совпадения есть в последней строке то, значение в 3 листвью не добавляется. А вот если добавить ниже простую строку, без совпадений, то все норм. В целом не критично, но не понятно откуда ноги растут.
Цитата:
И еще, хотелось спросить, можно в данном коде реализовать проверку совпадений в 1 и 2 листвью, игнорируя регистр слов в 3 столбце. Чтобы не важно с большой или маленькой буквы начинается значение subitem?

Project.rar

GIF 28.04.2020 14-48-46.gif
Ответить с цитированием
  #4  
Старый 28.04.2020, 13:47
pikabu pikabu вне форума
Прохожий
 
Регистрация: 27.12.2017
Сообщения: 30
Версия Delphi: 10.1
Репутация: 10
По умолчанию

P.S. по вопросу регистра понял, помогло
Код:
ANSIUpperCase
Ответить с цитированием
  #5  
Старый 28.04.2020, 21:08
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,003
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от pikabu
За пример спасибо вам огромное, работает. Потестил, имеется небольшой глюк. Если искомые совпадения есть в последней строке то, значение в 3 листвью не добавляется. А вот если добавить ниже простую строку, без совпадений, то все норм. В целом не критично, но не понятно откуда ноги растут.

Да, там очепятка во внутреннем цикле.
Поправь "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.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 12:41.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter