Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск в ListBox, без точного названия искомого 
V
    Опции темы
Kirgston
Дата 15.4.2009, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Ребята вот у меня надеюсь последний вопросик. Вообщем решил сделать проверку на валидность "треков" при запуске. Вообщем застрял на поиске 2ух комбо боксов... проблема только в одном. Почему оно не работает?

Код

{
int i=0;// переменная для подсчета списка избранных
int a=0;//для простого списка
int n=0;//для проверки есть ли что либо в списке
for (Fav->Items->Strings[i] ; Fav->Items->Count-1; i++ ) {//начиная с нулевой строчки по последнюю проверяем их
for (PList->Items->Strings[a]; PList->Items->Count-1; a++) {//начиная опять с первой по последнюю но уже в простом списке
if (Fav->Items->Strings[i]==PList->Items->Strings[a]) {// проверяем или есть аналогичные строчки избранных и плей листа
n++;//если да то увеличиваем на 1
}
}
if (n==0) {//после обхода 1 разу первого цикла проверяем или что то было найдено
    Fav->Items->Delete(i);// если ничего не нашло то удаляем текущую строчку из КБ
}
}
}


Проблема - просто виснет... :( а почему? :(

Это сообщение отредактировал(а) Kirgston - 15.4.2009, 20:07
PM MAIL   Вверх
artsb
Дата 15.4.2009, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Эм...
Должно быть так:
Код

{
int i=0;// переменная для подсчета списка избранных
int a=0;//для простого списка
int n=0;//для проверки есть ли что либо в списке
for (i=0; i < Fav->Items->Count; i++ ) {//начиная с нулевой строчки по последнюю проверяем их
for (a=0; a < PList->Items->Count; a++) {//начиная опять с первой по последнюю но уже в простом списке
if (Fav->Items->Strings[i]==PList->Items->Strings[a]) {// проверяем или есть аналогичные строчки избранных и плей листа
n++;//если да то увеличиваем на 1
}
}
if (n==0) {//после обхода 1 разу первого цикла проверяем или что то было найдено
    Fav->Items->Delete(i);// если ничего не нашло то удаляем текущую строчку из КБ
}
}
}


Это сообщение отредактировал(а) artsb - 15.4.2009, 23:34


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Kirgston
Дата 16.4.2009, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Хе хе... спасибо большое! Как всегда я просто не доглядел... вышло так что я просто свою ф-цию пихал перед загрузкой текста в ЛБ и думал почему же не происходит фильтрация =))) Спасибо огромное!!! Теперь буду стараться ещё более внимательно относится к вещам!
PM MAIL   Вверх
artsb
Дата 16.4.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(Kirgston @  16.4.2009,  10:15 Найти цитируемый пост)
Как всегда я просто не доглядел

У меня тоже бывает smile


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Kirgston
Дата 17.4.2009, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Хм... вот вопросик... я чего то не понимаю... а почему у меня оно срабатывает через раз? То есть оно чистит список... но раз через раз... 3-4 раза прогу надо запускать почему это? Или это связано с тем что я установил Windows 7?

Добавлено через 3 минуты и 38 секунд
Странно... удаляет ровно только половину...
PM MAIL   Вверх
artsb
Дата 17.4.2009, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Не совсем вас понял smile...
Но по поводу кода, здесь можно сделать получше:
Код

{
int i, n;
for (i = 0; i < Fav->Items->Count; i++) 
{
  n = PList->Items->IndexOf(Fav->Items->Strings[i]);
  if(n < 0) // если такой строки нет
    Fav->Items->Delete(i);
}



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Kirgston
Дата 18.4.2009, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Ну я имел введу если ввести в список Fav крякозябры которых нету в списке PList то оно удаляет... но ровно половину =) вроде я уже понял почему. Т.к. переменную n надо было занулять. 
Хм... насколько я понимаю то в вашем примере вы сравниваете индекса. Но к сожалению я не могу так :( надо именно по строкам сравнивать.

Код


{
int i=0;// переменная для подсчета списка избранных
int a=0;//для простого списка
int n=0;//для проверки есть ли что либо в списке
for (i=0 ; i<Fav->Items->Count; i++ ) {//начиная с нулевой строчки по последнюю проверяем их
n=0;
for (a=0; a<PList->Items->Count; a++) {//начиная опять с первой по последнюю но уже в простом списке
if (Fav->Items->Strings[i]==PList->Items->Strings[a]) {// проверяем или есть аналогичные строчки избранных и плей листа
n=1;//если да то увеличиваем на 1
        }
    }
if (n==0) {//после обхода 1 разу первого цикла проверяем или что то было найдено
    Fav->Items->Delete(i);// если ничего не нашло то удаляем текущую строчку из КБ
    }
  }
}


вот на сколько я понял надо было просто ещё занулять переменную н. Т.к. при проходе второго раза первого цикла она могла стать 1 и всё. А значит никакая другая строка не будет удалятся. Вроде всё щас должно работать... но...

http://s39.radikal.ru/i085/0904/07/806470f4200a.jpg
http://s50.radikal.ru/i130/0904/ba/b79edb2d97af.jpg
http://s46.radikal.ru/i114/0904/be/ec29f62ef2e6.jpg
http://s57.radikal.ru/i157/0904/64/8f46eeeef01d.jpg
http://s48.radikal.ru/i119/0904/cb/707171728df1.jpg
http://s45.radikal.ru/i108/0904/96/c22a095fa0ab.jpg

Вот пожалуйста посмотрите по-порядку... на левый список. Вот что я имел "именно в 2 раза" . Использовал 

Код

{
int i=0;// переменная для подсчета списка избранных
int a=0;//для простого списка
int n=0;//для проверки есть ли что либо в списке
for (i=0 ; i<Fav->Items->Count; i++ ) {//начиная с нулевой строчки по последнюю проверяем их
n=0;
for (a=0; a<PList->Items->Count; a++) {//начиная опять с первой по последнюю но уже в простом списке
if (Fav->Items->Strings[i]==PList->Items->Strings[a]) {// проверяем или есть аналогичные строчки избранных и плей листа
n=1;//если да то увеличиваем на 1
        }
    }
if (n==0) {//после обхода 1 разу первого цикла проверяем или что то было найдено
    Fav->Items->Delete(i);// если ничего не нашло то удаляем текущую строчку из КБ
    }
  }
}


Не понимаю почему именно в 2 раза... ведь вроде код нормальный
PM MAIL   Вверх
THandle
Дата 18.4.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



Kirgston, я не очень понял твоей проблемы, а точнее того, что тебе требуется сделать.

Значит, скажи.
У тебя есть список избранных, и список доступных станций. Так?
Тебе нужно удалить все такие станции из избранного, каких нет в списке доступных? Или что? Или же тебе нужно удалить повторения.
Сразу скажу - вышеприведенный код ужасен по своей сути.

Объясни пожалуйста подробнее, что конкретно тебе требуется сделать.

PM   Вверх
Kirgston
Дата 18.4.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Надо : 
"У тебя есть список избранных, и список доступных станций. Так?
Тебе нужно удалить все такие станции из избранного, каких нет в списке доступных"

Но они скажем так... должны проверятся именно по строкам. То есть по названию. 

Да не спорю что ужасен и т.д. но скажем я только 2 месяца перешёл на С++ . Да я знаю что мол и за 2 месяца и т.д. можно много чего сделать. Но просто я учусь в универе... и времени на учения где-то 1 час в день...

Это сообщение отредактировал(а) Kirgston - 18.4.2009, 10:51
PM MAIL   Вверх
THandle
Дата 18.4.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



Kirgston, тебе уже artsb давал код:

 
Код


{
int i, n;
for (i = 0; i < Fav->Items->Count; i++) 
{
  n = PList->Items->IndexOf(Fav->Items->Strings[i]);
  if(n < 0) // если такой строки нет
    Fav->Items->Delete(i);
}


Чем не устроил?
PM   Вверх
Anikmar
Дата 18.4.2009, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2513
Регистрация: 26.11.2006
Где: Санкт-Петербург

Репутация: 34
Всего: 59



Либо я дурак - либо лыжи не едут.

Был вопрос:

Цитата(THandle @  18.4.2009,  09:44 Найти цитируемый пост)
Значит, скажи.
У тебя есть список избранных, и список доступных станций. Так?
Тебе нужно удалить все такие станции из избранного, каких нет в списке доступных? Или что? Или же тебе нужно удалить повторения.
Сразу скажу - вышеприведенный код ужасен по своей сути.

Объясни пожалуйста подробнее, что конкретно тебе требуется сделать.


Ответ:

Цитата(Kirgston @  18.4.2009,  10:48 Найти цитируемый пост)
Надо : 
"У тебя есть список избранных, и список доступных станций. Так?
Тебе нужно удалить все такие станции из избранного, каких нет в списке доступных"

Но они скажем так... должны проверятся именно по строкам. То есть по названию. 

Да не спорю что ужасен и т.д. но скажем я только 2 месяца перешёл на С++ . Да я знаю что мол и за 2 месяца и т.д. можно много чего сделать. Но просто я учусь в универе... и времени на учения где-то 1 час в день...


Не знаю кто как, а я лично так и не врубился, а что собственно надо?  smile 
PM MAIL ICQ   Вверх
Kirgston
Дата 18.4.2009, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Ну так я же процытировал :Р

Есть список избранных и список доступных станций и мне нужно удалить все станции избранных которых нету в простом списке.

Код artsb увы не подходит т.к. проверка по индексу, а мне по названию\имени\по параметру Strings надо проверять. Мой код вроде вполне рабочий... только он сугубо удаляет 50% только... почему 50 я не знаю...  

Вот сами побалуйтесь =) 
http://www.sendspace.com/file/e3odik

чисто 50% удаляет... почему понять я не могу
PM MAIL   Вверх
THandle
Дата 18.4.2009, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



Kirgston, парень, прими мои поздравления smile Ты первый кому удалось взорвать мой моск  smile 

Цитата(Kirgston @  18.4.2009,  21:33 Найти цитируемый пост)
Код artsb увы не подходит т.к. проверка по индексу, а мне по названию\имени\по параметру Strings надо проверять. 


Не по индексу он ищет.

--------------------------------------------
Цитата из моей статьи:

Метод IndexOf.

Объявлен как:
    
function IndexOf(const S: string): Integer; override;

Ищет в наборе строку S, если она найдена, то возвращает её индекс, иначе возвращает -1.

Пример:

    
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  S : TStringList;
  i : integer;
begin
  s := TStringList.Create;
  try
    for i := 1 to 5 do
      s.Add('SomeText' + IntToStr(i));
    s.Delete(s.IndexOf('SomeText3'));
    ShowMessage(s.Text);
  finally
    s.Free;
  end;
end;



В этом примере строка 'SomeText3' была успешно найдена и удалена.


--------------------------------------------------

Теперь просьба объяснить. Чем это принципиально отличается от твоего кода?

Ты попробуй код artsb поставить

Добавлено через 32 секунды
То есть, IndexOf ищет не массив, а строку(что и ты делаешь в своем коде).
PM   Вверх
Kirgston
Дата 18.4.2009, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 792
Регистрация: 24.12.2007

Репутация: 2
Всего: 2



Ясно понял! ;) извините пожалуйста просто ещё чайник... :(

Так вот... но с его кодом тоже! о_О Ровно половину... удаляет... мистика... точнее работает как и мой кусок... может это всётаки из-за Виндовс 7 ?
PM MAIL   Вверх
THandle
Дата 18.4.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хранитель Клуба
Group Icon
Награды: 1



Профиль
Группа: Админ
Сообщений: 3639
Регистрация: 31.7.2007
Где: Moscow, Dubai

Репутация: 25
Всего: 372



Прошу меня простить. Я попался на самой простой новичковой ошибке, которая присутствует в коде artsb.

Эта ошибка описана посте:
http://forum.vingrad.ru/index.php?showtopi...t&p=1537072

Вот верный код:

Код

    for (int i = ListBox1->Items->Count - 1; i >= 0; i--)
        if (ListBox2->Items->IndexOf(ListBox1->Items->Strings[i]) < 0)
            ListBox1->Items->Delete(i);


PM   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0587 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.