Главная страница
    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.012 c
4-1145006916
Feg16
2006-04-14 13:28
2006.07.30
Создание расширенного ярлыка


3-1148423415
lockheed_man
2006-05-24 02:30
2006.07.30
Работа с DBLookupComboBox


6-1142508826
antoxa2005
2006-03-16 14:33
2006.07.30
Подскажите, а как читать HTML страницу? Как текстовый файл много


1-1150532479
kaif
2006-06-17 12:21
2006.07.30
Перекомпиляция родных run-time пакетов (*.bpl) Delphi


2-1152613306
Crazy monkey
2006-07-11 14:21
2006.07.30
Перенос данных из Adotable в Эксель





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский