0 / 1 / 0
Регистрация: 07.08.2012
Сообщений: 47
1

Счетчики совпадений значений строк в ListBox

18.03.2013, 21:27. Показов 2081. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скажу сразу, что я в программировании почти "0", поэтому и пишу здесь в надежде, что какой-то знающий человек не полениться и напишет кусок кода, буду очень признателен!
Дело вот в чем: есть один ListBox, напротив каждой строки расположены Label, есть несколько кнопок, при нажатии которых в листбокс добавляются строки (начиная с 2 строки) с цифрами, напр. 1, 2, 3 , а также при их нажатии нужно: если в любой строке не будет такое же значение как в первой - счетчик в Label +1 напротив каждой такой строки, если совпадает - обнуляется.
Вот немного прикинул для 2 кнопок, но появляются ошибки и счетчики срабатывают только один раз (не пинайте и прошу прощения за мою тупость ):

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
i:=0;
ListBox1.Items.Insert(2, '1');
if ListBox1.Items[2]=ListBox1.Items[4]  then
 Label1.Caption:=inttostr (i+1);
 //обнолуние?
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
i:=0;
ListBox1.Items.Insert(2, '2');
if ListBox1.Items[2]=ListBox1.Items[4]  then
 Label2.Caption:=inttostr (i+1);
  //обнолуние?
end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.03.2013, 21:27
Ответы с готовыми решениями:

Поиск и отображения нескольких совпадений ListBox
Доброго времени суток! Помогите с кодом поиска текста в ListBox, так, чтобы отображало все...

В ListBox вводится последовательность строк. Вывести их в ListBox в обратном порядке
Помогите пожалуйста решить задачу :) очень надеюсь на ответ... В ListBox вводится...

Сравнить два бинарных файла и вывести в label количество не совпадений, или что нет не совпадений
Добрый день ! Прошу помощи в реализации задачи. В программе нужно сравнить два файла (разной...

Посчитать количество совпадений в listbox
Есть listbox1 с семью Items: три строки "apple" и четыре строки "orange". Если ввести в textBox1...

21
Модератор
3488 / 2611 / 741
Регистрация: 19.09.2012
Сообщений: 7,971
18.03.2013, 21:56 2
Цитата Сообщение от qis Посмотреть сообщение
Delphi
1
//обнолуние?

Не по теме:

Оно :D

1
0 / 1 / 0
Регистрация: 07.08.2012
Сообщений: 47
18.03.2013, 21:59  [ТС] 3
Обнуление
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
18.03.2013, 21:59 4
Не могу понять. Причём тут Items[4] ? Что-то не совпадает со словесным описанием.
1
0 / 1 / 0
Регистрация: 07.08.2012
Сообщений: 47
18.03.2013, 22:01  [ТС] 5
Цитата Сообщение от Одиночка Посмотреть сообщение
Не могу понять. Причём тут Items[4] ? Что-то не совпадает со словесным описанием.
Значит неправильно я "зашаманил". Я же говорю что в программировании "0", "пишу" код интуитивно
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
18.03.2013, 22:04 6
Как я понял нужно вновь введённую строку сравнить со всеми, которые есть и если есть такие ещё - добавить 1 к значению в соответствующем Label. Если же такая строка первая - в Label, наверное, нужно записать 1. Так или нет?
1
0 / 1 / 0
Регистрация: 07.08.2012
Сообщений: 47
18.03.2013, 22:07  [ТС] 7
Цитата Сообщение от Одиночка Посмотреть сообщение
Как я понял нужно вновь введённую строку сравнить со всеми, которые есть и если есть такие ещё - добавить 1 к значению в соответствующем Label.
Да, точно.
Все строки нужно сравнивать с первой, и для нее не надо Label.
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
18.03.2013, 22:14 8
Ну с ListBox-ом опыта у меня нет, но примерно так нужно писать:
Delphi
1
2
3
4
5
6
7
8
9
10
11
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
  j:=0;
  ListBox1.Items.Insert(2, '1');
  For i:=2 To ListBox1.Items.Count-1 Do
  If ListBox1.Items[i]='1' Then
  Inc(j);
 
  Label1.Caption:=inttostr(j);
end;
Соответствующий код и для других кнопок. Меняешь только вводимую строку, и Label.

По твоему коду - ты вставляешь новую строку с индексом 2. И с ней же сравниваешь.
Так с первой нужно сравнивать, или с той, что вставил?
1
0 / 1 / 0
Регистрация: 07.08.2012
Сообщений: 47
18.03.2013, 22:52  [ТС] 9
Вроде работает. Со счетчиками еще надо разбираться. Благодарствую!

Добавлено через 6 минут
По твоему коду - ты вставляешь новую строку с индексом 2. И с ней же сравниваешь.
Так с первой нужно сравнивать, или с той, что вставил?
С первой не надо, только с той, что вставил, то есть с индексом 2.

Добавлено через 22 минуты
Все работает, разобрался. Еще раз спасибо.
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
18.03.2013, 22:53 10
Показал бы, как сделал. А то я до конца и не понял суть.
1
0 / 1 / 0
Регистрация: 07.08.2012
Сообщений: 47
18.03.2013, 23:06  [ТС] 11
Значит, нужно что бы счетчики при несовпадении со строкой с индексом 2 давали +1 , а при совпадении обнулялись, а у меня наоборот (или я снова затупил), эх завтра, сегодня голова раскалываеся

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
j:=0;
  ListBox1.Items.Insert(2, '1');
  For i:=2 To ListBox1.Items.Count-1 Do
  If ListBox1.Items[i]='1' Then
  Inc(j);
  Label2.Caption:=inttostr(j);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
begin
j:=0;
  ListBox1.Items.Insert(2, '2');
  For i:=2 To ListBox1.Items.Count-1 Do
  If ListBox1.Items[i]='2' Then
  Inc(j);
  Label3.Caption:=inttostr(j);
end;
 
procedure TForm1.Button5Click(Sender: TObject);
var i,j:integer;
begin
j:=0;
  ListBox1.Items.Insert(2, '3');
  For i:=2 To ListBox1.Items.Count-1 Do
  If ListBox1.Items[i]='3' Then
  Inc(j);
  Label4.Caption:=inttostr(j);
end;
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
18.03.2013, 23:15 12
Тогда сделай так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
procedure TForm1.Button1Click(Sender: TObject);
var 
  i,j:integer;
  b : Boolean;
begin
  ListBox1.Items.Insert(2, '1');
  b:=True;
  For i:=3 To ListBox1.Items.Count-1 Do
  If ListBox1.Items[i]='1' Then
  //Строка совпала
  Begin
    b:=False;
    Break;
  End;
 
  j:=StrToIntDef(Label2.Caption,0);
  If b Then Inc(j);
  Label2.Caption:=inttostr(j+1);
end;
1
0 / 1 / 0
Регистрация: 07.08.2012
Сообщений: 47
18.03.2013, 23:37  [ТС] 13
Буду химичить, спасибо.
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
18.03.2013, 23:45 14
Тут всё равно возникает вопрос. Если ты кнопкой, допустим, вводишь строку '1'. Такой строки ещё нет и счётчик станет равным 1. Если ты опять нажмёшь на эту же кнопку - такая строка уже есть - и счётчик обнулится. И будет обнуляться теперь всё время, так как такая строка уже есть. Что-то у тебя с заданием не так.
Кстати, забыл за обнуление. Строку 17 нужно написать так:
Delphi
1
  If b Then Inc(j) Else j:=0;
0
0 / 1 / 0
Регистрация: 07.08.2012
Сообщений: 47
19.03.2013, 00:00  [ТС] 15
Да я что-то и сам запутался..
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
19.03.2013, 00:05 16
Ото первый вариант - счётчики количества одинаковых строк - наверное, правильный.
Ладно, иди отдыхай. Завтра на свежую голову обдумаешь.
0
0 / 1 / 0
Регистрация: 07.08.2012
Сообщений: 47
19.03.2013, 00:47  [ТС] 17
Давайте попробую еще раз объяснить (извините что морочу вам голову), вот картинка.

Теперь если нажать, напр., кнопку 2: в Строку 1 вставляется цифра 2, при это счетчик 2 сбрасывается на 0, остальные счетчики +1;

нажимаем кнопку 3: в Строку 1 вставляется цифра 3 (бывшая строка 1 с цифрой 2 перемещается на одну позицию вниз), счетчик 3 сбрасывается на 0, остальные счетчики +1 (то есть, теперь счетчик 2 будет показывать единицу, счетчик 3 естественно 0, остальные - двойку);

нажимаем кнопку 1: в Строку 1 вставляется цифра 1, счетчик 1 сбрасывается на 0, остальные счетчики +1 (то есть, теперь счетчик 3 - единица, счетчик 1 - ноль, остальные - тройка);

и т.д.
Изображения
 
0
0 / 1 / 0
Регистрация: 07.08.2012
Сообщений: 47
19.03.2013, 00:57  [ТС] 18
На картинке: счетчики - Label, поле - ListBox.
0
3943 / 1868 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
19.03.2013, 01:04 19
Если у тебя по определённой кнопке сбрасывается соответствующий счётчик, а остальные наращиваются на 1 - зачем выполнять проверку всех строк ListBox-а? Делаем просто:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
procedure TForm1.IncLabel;
var j:integer;
Begin
  j:=StrToIntDef(Label1.Caption,0);
  Label1.Caption:=inttostr(j+1);
  j:=StrToIntDef(Label2.Caption,0);
  Label2.Caption:=inttostr(j+1);
 
  //И так далее для всех Label
 
  j:=StrToIntDef(Label10.Caption,0);
  Label10.Caption:=inttostr(j+1);
End;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
  ListBox1.Items.Insert(2, '1');
  IncLabel; //Наращивание счётчиков на всех Label
  Label2.Caption:='0';
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  j:=0;
  ListBox1.Items.Insert(2, '1');
  IncLabel; //Наращивание счётчиков на всех Label
  Label3.Caption:='0';
end;
 
procedure TForm1.Button5Click(Sender: TObject);
begin
  j:=0;
  ListBox1.Items.Insert(2, '1');
  IncLabel; //Наращивание счётчиков на всех Label
  Label4.Caption:='0';
end;
Только внести эту процедуру в описание формы в секцию Public:
Delphi
1
2
Public
procedure IncLabel;
1
0 / 1 / 0
Регистрация: 07.08.2012
Сообщений: 47
19.03.2013, 01:47  [ТС] 20
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
procedure TForm1.IncLabel;
var j:integer;
Begin
  j:=StrToIntDef(Label2.Caption,0);
  j:=StrToIntDef(Label3.Caption,0);
  j:=StrToIntDef(Label4.Caption,0);
  Label2.Caption:=inttostr(j+1);
  Label3.Caption:=inttostr(j+1);
  Label4.Caption:=inttostr(j+1);
 
  //И так далее для всех Label
End;
 
procedure TForm1.Button1Click(Sender: TObject);
var j:integer;
begin
j:=0;
  ListBox1.Items.Insert(2, '1');
  IncLabel; //Наращивание счётчиков на всех Label
  Label2.Caption:='0';
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var j:integer;
begin
j:=0;
  ListBox1.Items.Insert(2, '2');
  IncLabel; //Наращивание счётчиков на всех Label
  Label3.Caption:='0';
end;
 
procedure TForm1.Button5Click(Sender: TObject);
var j:integer;
begin
j:=0;
  ListBox1.Items.Insert(2, '3');
  IncLabel; //Наращивание счётчиков на всех Label
  Label4.Caption:='0';
end;
Работает, но не совсем так, как нужно:
1) после сброса на 0, если нажать другую кнопку, не происходит добавление +1 к нулю, а сразу показывает общее значение
2) после 2-ного нажатия кнопкой Button5 счетчики почему-то сбрасывает на единицы, на другие не добавляется +1
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.03.2013, 01:47
Помогаю со студенческими работами здесь

Подсчет совпадений текстовых значений
Добрый день, как подсчитать, сколько раз в столбце повторялось текстовое значение а потом вывести...

Поиск совпадений значение в массиве строк
Добрый день форумчане. Вот код: var foundLines_a = File.ReadLines(files).Where(s =>...

Удаление не выделенных строк в ListBox (Поиск в ListBox)
Добрый день! Друзья, подскажите, пожалуйста, как внутри ListBox организовать поиск по записям...

Условное форматирование - поиск совпадений значений одной строки в другой
Добрый вечер! Ребята, прошу помочь правильно прописать формулы условного форматирования для...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru