Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];
ВнизПроблема с программой... Найти похожие ветки
← →
KaLLeKa (2006-07-06 00:10) [0]Я сделал программу которая заменяет необходимые символы в тексте на другие... Но, возникла определенная трудность. Дело в том, что программа стала прерывать процедуру непонятно из за чего и оставлять часть текста необработанным. Программа спокойно обрабатывала 60.000 строк текста, где то секунд за 5-6, а тут, я подсунул ей 212.000 строк, и она стала прерывать процедуру на 15.432 строке, непонятно из за чего... Дал ей совсем другой текст - 90.000 строк, она так же вылетает на 15.000 строке... Привожу код функции обработки, поясните пожалуйста почему так происходит и как от этого избавиться...
procedure Tform1.CodeR(FP:Pchar);
var
i, u, k: word;
C: Char;
s : String;
begin
if RichEdit1.Text = "" then exit;
Slist.Clear;
Slist.Text := RichEdit1.Text;
Application.ProcessMessages();
WorkProcces.Visible := true;
WorkProcces.Progress := 0;
WorkProcces.MaxValue := SList.Count-1;
StatusBar1.Panels[0].Text := " Подмена...";
Application.ProcessMessages;
s := "";
for i := 0 to Slist.Count-1 do
begin
WorkProcces.Progress := i;
StatusBar1.Panels[2].text := " Cтрок : "+inttostr(Slist.Count-1);
StatusBar1.Panels[3].text := " Пройдено : "+ inttostr(i);
Application.ProcessMessages();
s := Slist.Strings[i];
if not (copy(s, 1, length("<br></font><font size=2 face="Tahoma" color=#E00000>")) = pchar("<br></font><font size=2 face="Tahoma" color=#E00000>")) then
if not (copy(s, 1, length("<br>")) = pchar("<br>")) then
if not (copy(s, 1, length("<br></font><font size=2 face="Tahoma" color=#0000E0>")) = pchar("<br></font><font size=2 face="Tahoma" color=#0000E0>")) then
if not (copy(s, 1, length("")) = pchar("")) then
if not (copy(s, 1, length("<font size=2 face="Tahoma" color=#E00000>")) = pchar("<font size=2 face="Tahoma" color=#E00000>")) then
if not (copy(s, 1, length("<font size=2 face="Tahoma" color=#0000E0>")) = pchar("<font size=2 face="Tahoma" color=#0000E0>")) then
if not (copy(s, 1, length("<html><head></head><body bgcolor=#FFFFFF>")) = pchar("<html><head></head><body bgcolor=#FFFFFF>")) then
if not (copy(s, 1, length("</body></html>")) = pchar("</body></html>")) then
begin
for u := 1 to Length(s) do
if pos(char(s[u]), CharX)<>0 then
begin
if not ((s[u] = "b") or (s[u] = "r")) then
begin
k := pos(char(s[u]), CharX);
C := CodeX[k];
s[u] := c;
end;
end;
Slist.Strings[i] := s;
end;
end;
WorkProcces.Progress := 0;
StatusBar1.Panels[0].Text := " Завершено";
Application.ProcessMessages();
Slist.SaveToFile(FP);
end;
← →
KilkennyCat © (2006-07-06 03:39) [1]> var
> i, u, k: word;
← →
KaLLeKa (2006-07-06 11:52) [2]> var
> i, u, k: word;
Var
i, u, k, : Integer; или longint
дают тот же эффект что и word. Я Пробовал.
Ну что, разве никто не может помочь? Как же так....? :((
← →
KaLLeKa (2006-07-06 11:56) [3]то же самое, только я опустил html тэги чтобы ТУТ ничего небыло подчеркнтым и жирным.
procedure Tform1.CodeR(FP:Pchar);
var
i, u, k: word;
C: Char;
s : String;
begin
if RichEdit1.Text = "" then exit;
Slist.Clear;
Slist.Text := RichEdit1.Text;
Application.ProcessMessages();
WorkProcces.Visible := true;
WorkProcces.Progress := 0;
WorkProcces.MaxValue := SList.Count-1;
StatusBar1.Panels[0].Text := " Подмена...";
Application.ProcessMessages;
s := "";
for i := 0 to Slist.Count-1 do
begin
WorkProcces.Progress := i;
StatusBar1.Panels[2].text := " Cтрок : "+inttostr(Slist.Count-1);
StatusBar1.Panels[3].text := " Пройдено : "+ inttostr(i);
Application.ProcessMessages();
s := Slist.Strings[i];
begin
for u := 1 to Length(s) do
if pos(char(s[u]), CharX)<>0 then
begin
if not ((s[u] = "b") or (s[u] = "r")) then
begin
k := pos(char(s[u]), CharX);
C := CodeX[k];
s[u] := c;
end;
end;
Slist.Strings[i] := s;
end;
end;
WorkProcces.Progress := 0;
StatusBar1.Panels[0].Text := " Завершено";
Application.ProcessMessages();
Slist.SaveToFile(FP);
end;
← →
StriderMan © (2006-07-06 12:06) [4]а что показывает отладка? поставь брэйкпоинт с условием i = 15000
← →
KaLLeKa (2006-07-06 13:04) [5]хм.. у меня это оказывается происходит из за длины строки...
Тогда другой вопрос...
Как сделать так, чтобы программа обрезала строки по допустимой длине, перенося оставшуюся часть на следующую строку? Обрезать то надо по пробелам между словами а не по длине просто....
← →
KaLLeKa (2006-07-06 13:06) [6]ЗЫ. Сейчас прога спокойно за 30 сек, пробежала и приспокойно заменила символы в 1.740.000 строках. На пробу ставил специально... Все строки были нормальной длины - 255 символов.
А вот когда строка длинная... Например такая, как пишут роботы html сраницы - весь код страницы одной строкой, тогда процедура подмены слетает...
← →
Desdechado © (2006-07-06 13:17) [7]Еще раз говорю.
Var i, u, k, : Integer;
У тебя же используется индексация символов в строках этими переменными. Так что же ты хочешь? Строки могут быть до 2Гб, а word - это только 65тыщ с копейками
И, хоть убей, не понимаю, зачем в цикле делать вот это:if not (copy(s, 1, length("")) = pchar("")) then
if not (copy(s, 1, length("<font size=2 face="Tahoma" color=#E00000>")) = pchar("<font size=2 face="Tahoma" color=#E00000>")) then
1. на кой постоянно переводить в PChar?
2. гораздо эффективнее было бы описать константы, их длины и сравнивать с ними, а не каждый раз вычислять длину в каждой проверке условия
← →
KaLLeKa (2006-07-06 13:43) [8]Desdechado © (06.07.06 13:17) [7]
Про Integer понял, сознаюсь, тупил) не знаю зачем вордом сделал...
>И, хоть убей, не понимаю, зачем в цикле делать вот это:
Да это я так)) вам для наглядности)) а то попросили бы еще константы выложить, а их у меня там такой спсок что ой ой ой)))
А в пчар перевожу потому что в функцию библиотеки посылаю данные иногда, а стрингом посылать неудобно...
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2006.07.30;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c