Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.06;
Скачать: CL | DM;

Вниз

Ошибка при обработке TStringList.   Найти похожие ветки 

 
Zn   (2003-02-17 17:52) [0]

Программа с простым алгоритмом. Текстовый файл загружается в TStringList, а затем пробегается по этому массиву, и, если строка соответствует условию, она добавляется в другой TStringList. При обработке некоторых файлов программа глухо виснет. Не подскажет ли кто, где копать?


 
MBo ©   (2003-02-17 17:55) [1]

В программе ошибка или файлы нетекстовые попадаются.


 
smok_er   (2003-02-17 17:59) [2]

>>а затем пробегается по этому массиву, и,

а при чем здесь массив?

а вообще, без исходников сложно что либо сказать


 
Zn   (2003-02-17 18:02) [3]

Файлы текстовые 100%. Причём виснет не сначала, а когда переваливает за 50%. А где-то 80% файлов обрабатывается нормально.


 
mate ©   (2003-02-17 18:09) [4]

Без исходника явно не разобраться.


 
Zn   (2003-02-17 18:19) [5]


> smok_er


> а при чем здесь массив?

В смысле

while i<RichEdit1.Lines.Count do
begin
...
if Pos("Счёт: ",RichEdit1.Lines.Strings[i])>0) then
...
end;


 
Zn   (2003-02-17 18:23) [6]

Даю исходник.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ComCtrls, Unit2, Grids, DBGrids, Db, DBTables;

type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
RichEdit1: TRichEdit;
Button1: TButton;
Button2: TButton;
SaveDialog1: TSaveDialog;
Button3: TButton;
ProgressBar1: TProgressBar;
Spr_rax: TTable;
StatusBar1: TStatusBar;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
RaxList: TStringList;
FSprdbf,FSpridx: String;
procedure AddStrToVip(ia: LongWord; S: TStrings);
procedure InitSpr(F_iniName: String);
implementation
{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var j, k, l: LongWord;
i: Integer;
NewVip, SpisRax: TStringList;
begin
NewVip:=TStringList.Create;
SpisRax:=TStringList.Create;

InitSpr("clear.ini");

Spr_rax.TableName:=FSprdbf;
Spr_rax.IndexFiles.Add(FSpridx);

Spr_rax.Active:=true;
Spr_rax.First;

while (not Spr_rax.Eof) do
begin
if Spr_rax.FieldValues["ROZ1"] and
Spr_rax.FieldValues["ROZ1"] then
SpisRax.Add(Spr_rax.Fields[0].AsString);
Spr_rax.Next;
end;
Spr_rax.Active:=false;
ProgressBar1.Min:=0;
ProgressBar1.Max:=RichEdit1.Lines.Count;
ProgressBar1.Visible:=true;
i:=0;
Cursor:=crHourGlass;
while i<RichEdit1.Lines.Count do
begin
ProgressBar1.Position:=i;
StatusBar1.SimpleText:=FloatToStrF(i/RichEdit1.Lines.Count*100,ffGeneral,3,2)+"%";
Application.ProcessMessages;
if ((Pos("Рахунок: ",RichEdit1.Lines.Strings[i])>0) and
(SpisRax.IndexOf(Trim(Copy(RichEdit1.Lines.Strings[i],10,14)))<>-1)) then
begin
AddStrToVip(i,NewVip);
j:=i+8;
k:=0;
while Pos("Счёт: ",RichEdit1.Lines.Strings[j])=0 do
begin
k:=NewVip.Add(Form1.RichEdit1.Lines.Strings[j]);
Inc(j);
end;
for l:=k downto k-3 do NewVip.Delete(l);
i:=j-1;
end;
Inc(i);
end;
ProgressBar1.Visible:=false;
Cursor:=crDefault;
SaveDialog1.FileName:=ChangeFileExt(OpenDialog1.FileName,".txt");
SaveDialog1.Execute;
NewVip.SaveToFile(SaveDialog1.FileName);
end;

procedure AddStrToVip(ia: LongWord; S: TStrings);
var ii: Byte;
begin
for ii:=0 to 11 do S.Add(Form1.RichEdit1.Lines.Strings[ia-4+ii]);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Button1.Enabled:=false;
OpenDialog1.Execute;
If FileExists(OpenDialog1.FileName) then
begin
Button1.Enabled:=true;
RichEdit1.PlainText := True;
RichEdit1.Lines.LoadFromFile(OpenDialog1.FileName);
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if CloseQuery then Close;
end;

procedure InitSpr(F_iniName: String);
var F_ini: TStringList;
begin
F_ini:=TStringList.Create;
F_ini.LoadFromFile(F_iniName);
FSprdbf:=F_ini.Values["FSprdbf"];
FSpridx:=F_ini.Values["FSpridx"];
F_ini.Free;
end;

end.


 
smok_er   (2003-02-17 18:57) [7]

Это кусок лично мне ни о чем не говорит.
Правильнее было бы оттрасировать прогу и дать именно тот кусочек, где собственно говоря и виснет прога.


 
Sha ©   (2003-02-17 19:15) [8]

while i<RichEdit1.Lines.Count do
j:=i+8;
while Pos("Счёт: ",RichEdit1.Lines.Strings[j])=0 do


 
NetBreaker666 ©   (2003-02-17 19:25) [9]

Наверное, это тот самый кусок: for l:=k downto k-3 do NewVip.Delete(l); хотя хз.

Во-первых, что за хреновая привычка работать таким вот образом TStringList ? Вместо того, что бы производить синтаксический анализ файла, строить в памяти структуры, деревья объектов, вы просто используете TStrings.Values[] - это один их источников багов и тормозов. Сразу видно, что вы никогда не программировали на C++/Ассемблере (тогда бы вы поняли сколько машинного времени тратиться на чтение одного Values[]). Во-вторых: что за д***вый стиль ? Почему все компоненты названы TForm1, Button1, и т.л. Я в свое время написал прогу, сидящую в систрее и которая к капшинам всех окон с классами TForm1, TForm2 и т.д. добавляля строку "(written by lamer)". В результате каждая прог-а, которая ко мне попадала и в кэпшине которой было написано written by lamer хоть раз глюканула или повисла.
В-третьих: какого хрена вы вставляете обработчики нажатий прямо в onClick()...
блин, пока не станете нормально оформлять код, и хоть немного задумываться о производительности cool-programmer"ами вам не стать.


 
Zn   (2003-02-18 09:56) [10]


> NetBreaker666 © (17.02.03 19:25)


> written by lamer

Не спорю, про меня.
Трудно непрофессионалу в 36 лет изучать Дельфи.
В общем, я так понял, глюк где-то глубоко внутри, куда начинающему не долезть.
Спасибо всем, это тоже полезная информация!


 
Anatoly Podgoretsky ©   (2003-02-18 10:13) [11]

Ну возраст тут ни причем, мне пришлось изучать Дельфи в 44, но это Борланд винован не мог раньше выпустить.


 
Внук ©   (2003-02-18 10:17) [12]

>>NetBreaker666 ©
"Слова не мальчика, но мужа..." :))
Вы человеку помочь хотели, или на себя в очередной раз полюбоваться?


 
Думкин ©   (2003-02-18 10:26) [13]


> NetBreaker666 © (17.02.03 19:25)

Повыпендриваться - тут мастеров много, может посоревнуемся7
А если вы к моим кепшинам чего-то добавили и повисло, - так это уже не моя прога пашет. А вот где виснет - разбираться надо, хотя тут базы - я пас.
С - хорош, АСС - хорош - но тут тоже не ногой пишут.

Флейм - можно выкинуть.


 
Sha ©   (2003-02-18 10:27) [14]

> Zn (18.02.03 09:56)
> В общем, я так понял, глюк где-то глубоко внутри, куда начинающему не долезть.

см. Sha © (17.02.03 19:15)
Я выкусил операторы из твоей программы. Посмотри на них внимательно. Чему равно j, если i=RichEdit1.Lines.Count-1 ?


 
Radionov Alexey ©   (2003-02-18 10:28) [15]

>Zn (17.02.03 18:23)
While i < RichEdit1.Lines.Count Do
.............
i := j - 1; - вот это не может повлиять на то, что условие выхода из цикла никогда не выполнится?


 
Radionov Alexey ©   (2003-02-18 10:31) [16]

While Pos("Счёт: ", RichEdit1.Lines.Strings[j]) = 0 Do - вот это тоже подозрительно.


 
Anatoly Podgoretsky ©   (2003-02-18 10:31) [17]

NetBreaker666 © (17.02.03 19:25)
Ты весь точно охарактеризовал своб программу


 
malkolinge ©   (2003-02-18 11:11) [18]


> NetBreaker666 ©


И сочинив стишок он очень рад
А сам под шляпой носит зад :)

(С) Сирано де Бержерак ( уточнение для NetBreaker666, програмер такой 16 века)


 
Fktrc ©   (2003-02-18 11:29) [19]

>какого хрена вы вставляете обработчики нажатий прямо в onClick()
вопрос - а куда их нужно собссно вставлять?


 
Zn   (2003-02-18 11:36) [20]

Спасибо Sha, Radionov Alexey!
Вы крутые ребята!
Точно, j выходит за пределы RichEdit1.Lines.Count. Добавил условие j<RichEdit1.Lines.Count и всё работает!
Спасибо ещё раз!


 
Думкин ©   (2003-02-18 11:39) [21]

ну вот, а мы только-только флеймить начали - нехорошо так ...


 
Внук ©   (2003-02-18 11:41) [22]

"И все чинно, благородно" (скупая слеза скатилась по лицу Вицина) :))



Страницы: 1 вся ветка

Текущий архив: 2003.03.06;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.026 c
3-16943
bavc
2003-02-17 06:42
2003.03.06
Таблица 2 in 1


3-16903
cat_si
2003-02-14 16:37
2003.03.06
Еще один вопрос о пользователях.


14-17285
Vitus
2003-02-19 10:48
2003.03.06
Как проверить есть ли подключение к Инету?


3-16883
anton2v
2003-02-18 10:01
2003.03.06
Locate bug ?


14-17368
Delph
2003-02-18 17:23
2003.03.06
Есть ли эмулятор лазерного принтера?