Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Работа с циклами


Автор: In0stRAnez 23.6.2011, 21:09
Доброго времени суток товарищи!

Такой вопрос: загружаю в лист бокс большой файл похожий на 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;


может я не тот цикл использую?

Автор: Чучмек 24.6.2011, 08:27
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;



Автор: In0stRAnez 24.6.2011, 18:28
использую вот это
Код

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 (..)

а так всё работает.. видно до ошибки заполняет..

Автор: Mifody 24.6.2011, 18:58
Логично
Код

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

Автор: Чучмек 24.6.2011, 20:55
А зачем тебе два цикла?
Тут вообще можно обойтись без них.
Код

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;


Автор: Fhusy 14.7.2011, 06:20
можешь попробовать такой вариант
Код

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;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)