Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 22.07.2012, 10:41
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию Помогите выправить глюк

Код:
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  
Старый 22.07.2012, 14:44
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Вместо repeat..until лучше цикл for to do применить, проще так будет. Ну и для начала, брейк на строку "s:=s+#13#10;" хорошо бы поставить - сразу вылетает из рипита?
Ответить с цитированием
  #3  
Старый 22.07.2012, 20:27
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

В коде ошибок нет. Всё работает.
Проблема с заполнением строки s. Если из Лабеля берётся значение 1, то в файле прога находит все строки, что между Г1 и Г2, и записывает их в строку s соответственно. Если в Лабеле значение 2, то нужно считать всё, что между Г2 и Г3; если 3, то между Г3 и Г4 и т.д.
С 1 всё как надо, с 2,3,4... - чтение не происходит, s - пустая строка.
Ответить с цитированием
  #4  
Старый 22.07.2012, 21:28
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Может сделать типа так:

Код:
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  
Старый 23.07.2012, 10:22
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

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  
Старый 23.07.2012, 10:56
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Потому что у тебя в цикле repeat нет инкремента i, соответственно, цикл "стоит" на одном значении i. Лучше использовать while (вместо for).

Последний раз редактировалось YVitaliy, 23.07.2012 в 10:58.
Ответить с цитированием
  #7  
Старый 23.07.2012, 11:41
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

В условии repeat измени (i>=strlst.count-1)
Ответить с цитированием
  #8  
Старый 23.07.2012, 12:06
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

Цитата:
Сообщение от YVitaliy
В условии repeat измени (i>=strlst.count-1)
Не помогло. Выходит за границы List index out of bounds
Ответить с цитированием
  #9  
Старый 23.07.2012, 12:25
Аватар для YVitaliy
YVitaliy YVitaliy вне форума
Местный
 
Регистрация: 14.12.2011
Сообщения: 481
Версия Delphi: Borland Delphi7
Репутация: 17
По умолчанию

Измени "-1" на "-2" в условиях while и repeat. Эт я немного туплю
Ответить с цитированием
  #10  
Старый 23.07.2012, 15:26
Аватар для R-18Rus
R-18Rus R-18Rus вне форума
Новичок
 
Регистрация: 08.04.2012
Сообщения: 68
Версия Delphi: Delphi 7
Репутация: 127
По умолчанию

изменил так:
Код:
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);
Всё работает
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:00.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter