Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.03.06;
Скачать: [xml.tar.bz2];

Вниз

Ошибка при обработке 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.009 c
14-17272
Zhenka
2003-02-19 05:55
2003.03.06
Хочу собрать новый комп


14-17347
ZeroDivide
2003-02-17 14:24
2003.03.06
Из Ярославля есть кто-нибудь.


3-16968
AlexAlex2
2003-02-14 16:59
2003.03.06
Как бороться с Directory is bizy на присв. Session.PrivateDir ?


1-17154
aade
2003-02-21 16:54
2003.03.06
Выход из цикла


1-17184
frizZ.
2003-02-23 22:11
2003.03.06
возведение числа в целую степень при помощи циклов





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