![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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); |