Другие языки программирования и технологии

Программа на Delphi работает не совсем так...

Написал на Delphi две проги. Обе работают, но очень корректно. ПОМОГИТЕ ПЛИЗ!!!Имеется одно поле и одна функиция... Пример!1). Я ввожу...08:00 Discovery09:00 Новости10:00 Сериал12:00 Discovery13:15 Сериал14:00 Discovery15:00 Новости16:00 Сериал17:00 Discovery18:15 Сериал2). То, что должно быть08:00 12:00 14:00 17:00 Discovery09:00 15:00 Новости10:00 13:15 16:00 18:15 Сериал3). То, что выходит08:00 12:00 14:00 17:00 Discovery09:00 15:00 Новости10:00 13:15 18:15 Сериал16:00 Сериал!!!Как видите иногда он пропускает эти строчки. Причем если использовать 10 строк (к примеру) он может пропустить три, а если пять, то только две. Фиг знает почему он их пропускает.!!! Код программы!!!Memo8.Text:='';for i := 0 to Memo1.Lines.Count do {Начинает искать нужную строку} begin s:=Memo1.Lines.Strings; s2:=s; Delete(s2,1,6); {запоминает название программы без времени!!!} c:=0; for d := i+1 to Memo1.Lines.Count do {Ищит похожие названия после себя} begin s3:=Memo1.Lines.Strings[d]; Delete(s3,1,6); if s2=s3 then {Сравнивает название программы без времени с новой строкой тоже без времени} begin c:=c+1; s3:=Memo1.Lines.Strings[d][1]; s3:=s3+Memo1.Lines.Strings[d][2]; s3:=s3+Memo1.Lines.Strings[d][3]; s3:=s3+Memo1.Lines.Strings[d][4]; s3:=s3+Memo1.Lines.Strings[d][5]; s3:=' '+s3; insert(s3,s,c*6); Memo1.Lines.Delete(d); {Удаляет строку, чтобы ошибочно не проверять ее вновь и она не мешала} end; end; Memo8.Lines.Add(s); end;Memo1.Text:=Memo8.Text;!!!Комментарий!!!В Memo1 находится изначальный текст, а в Memo8 тот, который создается. Затем просто он заменяет тот, что был в первом. Написал подробный комментарий, плиз ПОМОГИТЕ!!!
Доброго времени суток.

Во-первых, цикл надо делать до Memo1.Lines.Count -1, поскольку индексация идет с нуля. А во-вторых, почему бы не сделать проще? Сейчас проверить не могу, поэтому только схема действий.

Memo8.Text:='';
for i := 0 to Memo1.Lines.Count - 1 do begin {просматриваем строки}
S := Memo1.Lines[ i ]; {получили очередную строку}
if S <> '' then begin {если строка не пустая}
TimeS := Copy(S,1,6); {выделяем время}
NameS := Copy(S, 7, Length(S)); {название}
for j:=i+1 to Memo1.Lines.Count - 1 do begin {и просматриваем оставшиеся строки}
if Pos(NameS, Memo1.Lines[ j ]) > 0 then begin {если в очередной строке есть запомненное название}
TimeS := TimeS + Copy(Memo1.Lines[ j ],1,6); {добавляем время из этой строки}
Memo1.Lines[ j ] := ''; {и обнулям ее (не удаляем!) }
end;
Memo8.Lines.Add(NimeS + NameS); {пишем результирующую строку в мемо}
end;
end;

В принципе, можно обойтись и без дополнительной переменной S. Возможно сравнение на повторяющееся название надо будет сделать несколько иначе, чтобы ошибочно не цеплялись названия, включающие в себя подстроку равную запомненной. Но это уже детали, которые вы можете додумать сами.. . Например, можно проверять так

if NameS = Copy(Memo1.Lines[ j ], 7, Length(Memo1.Lines[ j ])) then ...

Удачи!
Владимир Хашимов
Владимир Хашимов
59 613
Лучший ответ
сделай так
for d := Memo1.Lines.Count downto i+1 do {Ищит похожие названия после себя}
Алексей и что? Я проверил не работал т. е. с данными автора работает, а ежли дополняешь начинает портачить? Я не 1й день в дельфе