Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с циклами 
:(
    Опции темы
In0stRAnez
  Дата 23.6.2011, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго времени суток товарищи!

Такой вопрос: загружаю в лист бокс большой файл похожий на ini выглядит он так:

Заголовок
.......
.........
.....
Конец
Примечания
.....
.
....
Конец

мне необходимо получить информацию из раздела "заголовок" все включающиеся строчки до фразы "конец"

вот предлагаю алгоритм что не так подскажите?

Код

form5.ListBox1.ItemIndex := 0;
for a := 0 to form5.ListBox1.Items.Count -1  do begin

if Form5.ListBox1.Items[Form5.ListBox1.ItemIndex] = 'Заголовок'
then begin
     while Form5.ListBox1.Items[Form5.ListBox1.ItemIndex] = 'Тема' do begin
     form5.Memo3.Lines.Add(form5.ListBox1.Items[Form5.ListBox1.itemindex]);
     form5.ListBox1.ItemIndex := form5.ListBox1.ItemIndex + 1;
     end;
     end;
end;


может я не тот цикл использую?
PM MAIL   Вверх
Чучмек
Дата 24.6.2011, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



1. ItemIndex используешь в for, а меняешь только в  while.
Если первая строка не  'Заголовок', то до  второй дело не дойдет. Зачем тогда вообще нужен  for?
2.
Цитата(In0stRAnez @  23.6.2011,  21:09 Найти цитируемый пост)
Form5.ListBox1.Items[Form5.ListBox1.ItemIndex] = 'Тема' 

А это что такое?
3. Зачем вообще использовать ItemIndex?
Вариантов тьма.


Код

var a:integer;
var flag:boolean;

flag:=true;
for a:= 0 to formX.ListBoxY.Items.Count -1  do 
  begin
  if flag then
      begin
      if FormX.ListBoxY.Items[a] = 'Заголовок' then flag:=false;
      end else
             begin
             if FormX.ListBoxY.Items[a] = 'Конец' then break;
             formX.MemoZ.Lines.Add(formX.ListBoxY.Items[a]);
             end;
  end;





--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
In0stRAnez
  Дата 24.6.2011, 18:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



использую вот это
Код

var
  a:integer;
begin
  a:=0;
  while a<Form5.ListBox1.Count do
    begin
      if Form5.ListBox1.Items[a]='Заголовок' then
        begin
          inc(a);
          while Form5.ListBox1.Items[a]<>'Конец' do
            begin
              Form5.Memo3.Lines.Add(Form5.ListBox1.Items[a]);
              inc(a);
            end
        end;
      inc(a);
    end
end;

но почему то вылетает ошибка -
 EstringListError - list index out of bounds (..)

а так всё работает.. видно до ошибки заполняет..
PM MAIL   Вверх
Mifody
Дата 24.6.2011, 18:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Логично
Код

var
  a:integer;
begin
  a:=0;
  while a<Form5.ListBox1.Count do // предполакаем а = Form5.ListBox1.Count - 1, условие выполняется
    begin
      if Form5.ListBox1.Items[a]='Заголовок' then
        begin
          inc(a); // тут получилось а = Form5.ListBox1.Count, соответственно дальше пойдут ошибки
          while Form5.ListBox1.Items[a]<>'Конец' do
            begin
              Form5.Memo3.Lines.Add(Form5.ListBox1.Items[a]);
              inc(a);
            end
        end;
      inc(a);
    end


Самое правильное, инструкцию inc(a); использовать ПОСЛЕ всех обращений типа Form5.ListBox1.Items[a], либо перед обращением еще условие ставить и проверять допустимое значение.
И еще, совсем уж "не комильфо" ставить два раз внутри тела цикла inc(a), в 99% случаев из 100, поймаете ошибку, 1% на тот случай, если программу не запустите smile

Это сообщение отредактировал(а) Mifody - 24.6.2011, 18:59
PM MAIL WWW   Вверх
Чучмек
Дата 24.6.2011, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


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

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



А зачем тебе два цикла?
Тут вообще можно обойтись без них.
Код

var p:pchar;
var s:string;



s:=ListBox1.Items.Text;
p:=pchar(s) ;
p:=strpos(p,'Заголовок'+#13#10)+length('Заголовок'+#13#10);
strpos(p,'Конец'+#13#10)^:=#0;
memo1.Text:=p;




--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Fhusy
Дата 14.7.2011, 06:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



можешь попробовать такой вариант
Код

procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
a:boolean;
begin
i:=0;
a:=false;
   repeat
      if lb.Items.Strings[i]='Заголовок' then a:=true;
      if a then memo1.Lines.Add(lb.Items.Strings[i]);
      inc(i);
   until (i>0)and(lb.Items.Strings[i-1]='Конец')
end;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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