Форум: "Потрепаться";
Текущий архив: 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