Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.021 c
2-1152416078
elfen_kenny
2006-07-09 07:34
2006.07.30
TIBUpdateSQL блин


1-1150257710
xex32
2006-06-14 08:01
2006.07.30
Как принять штрих код со сканера Eclipse в компонент TEdit


15-1151833354
kaif
2006-07-02 13:42
2006.07.30
Расшифрована структура энзима, вызывающего рак


15-1151252872
Petr V. Abramov
2006-06-25 20:27
2006.07.30
Какие же химеры живут в Подмосковье... )


15-1151640852
tButton
2006-06-30 08:14
2006.07.30
вот такое вот сообщение пришло... думаю...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский