|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Помогите выправить глюк
Код:
s1:=Label1.Caption; delete(s1,1,14); if FileExists('1.txt') then StrLst.LoadFromFile('1.txt') else MessageDlg('File not find',mtError,[mbOk],0); if StrLst[i]='Г'+s1 then repeat s:=s+StrLst[i+1]; inc(i); s:=s+#13#10; until(StrLst[i+1]='Г'+IntToStr(StrToInt(s1)+1)); ShowMessage(s); Если в Label1 слово+цифра"1", то всё работает. Если цифра больше 1, то не работает. Сам понять никак не могу в чём дело. |
#2
|
||||
|
||||
Вместо repeat..until лучше цикл for to do применить, проще так будет. Ну и для начала, брейк на строку "s:=s+#13#10;" хорошо бы поставить - сразу вылетает из рипита?
|
#3
|
||||
|
||||
В коде ошибок нет. Всё работает.
Проблема с заполнением строки s. Если из Лабеля берётся значение 1, то в файле прога находит все строки, что между Г1 и Г2, и записывает их в строку s соответственно. Если в Лабеле значение 2, то нужно считать всё, что между Г2 и Г3; если 3, то между Г3 и Г4 и т.д. С 1 всё как надо, с 2,3,4... - чтение не происходит, s - пустая строка. |
#4
|
||||
|
||||
Может сделать типа так:
Код:
s1:=Label1.Caption; delete(s1,1,14); if FileExists('1.txt') then StrLst.LoadFromFile('1.txt') else MessageDlg('File not find',mtError,[mbOk],0); i:=0; while i<StrLst.count do begin// вот здесь if StrLst[i]='Г'+s1 then begin s:=''; repeat s:=s+StrLst[i+1]; inc(i); s:=s+#13#10; until (StrLst[i+1]='Г'+IntToStr(StrToInt(s1)+1)) or (i=StrLst.count); ShowMessage(s); end else inc(i); end; |
Этот пользователь сказал Спасибо YVitaliy за это полезное сообщение: | ||
R-18Rus (23.07.2012)
|
#5
|
||||
|
||||
YVitaliy, точно я забыл про изменение переменной i.
Сделал так. Теперь, когда номер ' Г"последний" ' происходит выход за границы стриглиста (List index of bounds - как-то так). Код:
procedure TForm1.Button2Click(Sender: TObject); var StrLst:TStringList; s,s1:AnsiString; i:byte; begin if not FileExists('1.txt') then MessageDlg('File not find',mtError,[mbOk],0) else begin StrLst:=TStringlist.Create; StrLst.LoadFromFile('1.txt'); s1:=Label1.Caption; delete(s1,1,14); s:=(''); i:=0; while i<StrLst.Count-1 do if StrLst[i]='Г'+s1 then repeat s:=s+StrLst[i+1]; s:=s+#13#10; inc(i); until((StrLst[i+1]='Г'+IntToStr(StrToInt(s1)+1)) or (i=StrLst.Count)) else inc(i); ShowMessage(s); end; end; Последний раз редактировалось R-18Rus, 23.07.2012 в 10:56. |
#6
|
||||
|
||||
Потому что у тебя в цикле repeat нет инкремента i, соответственно, цикл "стоит" на одном значении i. Лучше использовать while (вместо for).
Последний раз редактировалось YVitaliy, 23.07.2012 в 10:58. |
#7
|
||||
|
||||
В условии repeat измени (i>=strlst.count-1)
|
#8
|
||||
|
||||
Цитата:
|
#9
|
||||
|
||||
Измени "-1" на "-2" в условиях while и repeat. Эт я немного туплю
|
#10
|
||||
|
||||
изменил так:
Код:
while i<StrLst.Count-1 do if StrLst[i]='Г'+s1 then begin repeat inc(i); s:=s+StrLst[i]; s:=s+#13#10; if i=StrLst.Count-1 then break; until(StrLst[i+1]='Г'+IntToStr(StrToInt(s1)+1)); break; end else inc(i); ShowMessage(s); |