Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

про tStringList.Create [D6]


Страницы:   1 2

officeman ©   (2004-11-10 07:30:00) 

Уважаемые мастера. подскажите где ошибка. я читаю текстовый файл с четвертой строки. строку делю на части по специальному символу разделителю. и записываю в ListView1 таблицы. каждая часть строки в отдельный ранее созданный столбик.

var

         Form1: TForm1;
 DelimitedText: String;
     Delimited: Char;
            ss: integer;
ai,h1,h2,h3,h4,h5,h6,h7,h8,h9,h10:integer;
pA,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10: string;

 I: Integer;
 ListItem: TListItem;
 NewColumn: TListColumn;
FileName1,FileName2: TextFile;
Ch: string;
// ...

procedure TForm1.Button2Click(Sender: TObject);
var
f:tStrings;
TempLine:String;
ir:integer;
begin
ss:=0;
Memo1.Clear;
if OpenDialog1.Execute then begin

f:=tStringList.Create();
f.LoadFromFile(OpenDialog1.Filename); //открываю тектовый файл

for ir:=3 to f.Count-1 do begin  // Читаю тектовый с четвертой строки
TempLine:=f.Strings[ir]; // создаю список строк

//------------------------------------------------------------- -
for ai:=1 to length(TempLine) do begin // делю первую(4) строку. т.е. ищё в ней разделители и считаю их.
TempLine:=f.Strings[ir];
if TempLine[ai]=';' then begin
ss:=ss+1;
pA:=TempLine; // исходная строка
if ss=1 then begin
p1:=Copy(f.Strings[ir],1,ai-1); // первая найденная чтость до разделителя
h1:=ai; //
end;
if ss=2 then begin
p2:=Copy(pA,h1+1,ai-h1-1); // вторая найденная часть до разделителя
h2:=ai;
end;

end;
end;
//------------------------------------------------------------- -
Memo1.Lines.add(TempLine); // запись в мемо1. для проверки строк которые были обработаны
lv.Items.Add.Caption:=p1; // добаляю в ListView1
end;
end;

Вот тут почемуто проблема
lv.Items.Add.Caption:=p1; // добаляю в ListView1
Добавляет элементы но только первую часть - первой строки.
Почему? подскажите!

Текстовый файл выглядит так: (1строка-отвечает за описание таблицы, с 4строки начинаются данные)
Код;Товар;Производство;Наличие;Цена;

1001;Лак паркетный 2,5 кг;Турция;есть;
2544;Клей ПВА 3 кг;Россия;есть;
2662;Эмаль баклажановая 0,85 кг;Германия;нет;


sniknik   (2004-11-10 13:20:00) [21]

IB? опоздал уже написан, и комерческий и фриваре. ;о))
и текст?! неподходяшая основа для базы, лучше тогда свой формат разработать.


officeman   (2004-11-10 13:19:00) [22]

Итого получилось! =)
на форме надо: TListView имя в модуле lv
а также TOpenDialog1


var
Form1: TForm1;
DelimitedText: String;
Delimited: Char;
ss,sh: integer;
ai,h1,h2,h3,h4,h5,h6,h7,h8,h9,h10:integer;
pA,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10: string;
I,Complete: Integer;
ListItem: TListItem;
NewColumn: TListColumn;
FileName1,FileName2: TextFile;
Ch: string;
fs:tsearchrec;
f:tStrings;
TempLine:String;
ir:integer;
implementation

{$R *.dfm}

procedure TForm1.addNewItem(f: TSearchRec);
var
ih:integer;
begin
with form1.LV.items.add, f do begin
if (attr and faDirectory) <> 0
then begin
ImageIndex:=0;
end else ImageIndex:=1;
caption:=p1;
subitems.add(p2);
subitems.add(p3);
subitems.add(p4);
subitems.add(p5);
subitems.add(p6);
subitems.add(p7);
subitems.add(p8);
subitems.add(p9);
subitems.add(p10);
//end;
end;
end;

procedure TForm1.N3Click(Sender: TObject);
var
f:tStrings;
TempLine:String;
ir2:integer;
ai2:string;
begin
if OpenDialog1.Execute then begin
AssignFile(FileName1, OpenDialog1.Filename);
Reset(FileName1);
readln(FileName1,Ch);
TempLine:=Ch;
CloseFile(FileName1);
end;
for ai:=1 to length(TempLine) do begin
if TempLine[ai]=';' then begin
sh:=sh+1;
form1.Caption:=inttostr(ss);
pA:=TempLine;
if sh=1 then begin
p1:=Copy(pA,1,ai-1);
h1:=ai;
end;
if sh=2 then begin
p2:=Copy(pA,h1+1,ai-h1-1);
h2:=ai;
end;
if sh=3 then begin
h3:=ai;
p3:=Copy(pA,h2+1,ai-h2-1);
end;
if sh=4 then begin
h4:=ai;
p4:=Copy(pA,h3+1,ai-h3-1);
end;
if sh=5 then begin
h5:=ai;
p5:=Copy(pA,h4+1,ai-h4-1);
end;
if sh=6 then begin
h6:=ai;
p6:=Copy(pA,h5+1,ai-h5-1);
end;
if sh=7 then begin
h7:=ai;
p7:=Copy(pA,h6+1,ai-h6-1);
end;
if sh=8 then begin
h8:=ai;
p8:=Copy(pA,h7+1,ai-h7-1);
end;
if sh=9 then begin
h9:=ai;
p9:=Copy(pA,h8+1,ai-h8-1);
end;
if sh=10 then begin
h10:=ai;
p10:=Copy(pA,h5+1,ai-h9-1);
end;
end;
end;
try
with LV do
 begin
if  p1<>'' Then begin
   NewColumn := Columns.Add;
   NewColumn.Caption := p1;
end;
if  p2<>'' Then begin
   NewColumn := Columns.Add;
   NewColumn.Caption := p2;
end;
if  p3<>'' Then begin
   NewColumn := Columns.Add;
   NewColumn.Caption := p3;
end;
if  p4<>'' Then begin
   NewColumn := Columns.Add;
   NewColumn.Caption := p4;
end;
if  p5<>'' Then begin
   NewColumn := Columns.Add;
   NewColumn.Caption := p5;
end;
if  p6<>'' Then begin
   NewColumn := Columns.Add;
   NewColumn.Caption := p6;
end;
if  p7<>'' Then begin
   NewColumn := Columns.Add;
   NewColumn.Caption := p7;
end;
if  p8<>'' Then begin
   NewColumn := Columns.Add;
   NewColumn.Caption := p8;
end;
if  p9<>'' Then begin
   NewColumn := Columns.Add;
   NewColumn.Caption := p9;
end;
if  p10<>'' Then begin
   NewColumn := Columns.Add;
   NewColumn.Caption := p10;
end;
lv.Columns[1].AutoSize:=true;
end;
Finally
//----------------------------------------------------------------- -
//if OpenDialog1.Execute then begin
f:=tStringList.Create();
f.LoadFromFile(OpenDialog1.Filename);
for ir:=3 to f.Count-1 do begin  

//------------------------------------------- -
if ir=f.Count-1 then begin
lv.Columns[0].Width:=36;
lv.Columns[1].Width:=200;
LV.Items.Item[0].Selected:=true;
showmessage('Complete');
end;
//------------------------------------------- -

ss:=0;
TempLine:=f.Strings[ir];
try
for ai:=1 to length(TempLine) do begin
if TempLine[ai]=';' then begin
ss:=ss+1;
if ss=1 then begin
p1:=Copy(TempLine,1,ai-1);
h1:=ai;
end;
if ss=2 then begin
p2:=Copy(TempLine,h1+1,ai-h1-1);
h2:=ai;
end;
if ss=3 then begin
h3:=ai;
p3:=Copy(TempLine,h2+1,ai-h2-1);
end;
if ss=4 then begin
h4:=ai;
p4:=Copy(TempLine,h3+1,ai-h3-1);
end;
if ss=5 then begin
h5:=ai;
p5:=Copy(TempLine,h4+1,ai-h4-1);
end;
if ss=6 then begin
h6:=ai;
p6:=Copy(TempLine,h5+1,ai-h5-1);
end;
if ss=7 then begin
h7:=ai;
p7:=Copy(TempLine,h6+1,ai-h6-1);
end;
if ss=8 then begin
h8:=ai;
p8:=Copy(TempLine,h7+1,ai-h7-1);
end;
if ss=9 then begin
h9:=ai;
p9:=Copy(TempLine,h8+1,ai-h8-1);
end;
if ss=10 then begin
h10:=ai;
p10:=Copy(TempLine,h5+1,ai-h9-1);
end;
end;
end;
finally
end;
addNewItem(fs);
end;
end;
end;


и текстовый файл такой структуры: (первая строка описывает столбцы, с четвертой строки данные)

tovar.txt:
Код;Товар;Производство;Фасовка;Цена1;Цена2;Цена3;

6226;В\Д "Поли-Р"    Fassadenfarbe  14  кг;Деруфа;14 кг     ;14.05;21.07;19.51;17.27
6793;В\Д "Поли-Р"    Fassadenfarbe  14  кг В;Деруфа;14 кг     ;18.5;21.07;19.51;17.27
6227;В\Д "Поли-Р"    Fassadenfarbe  7  кг;Деруфа;7 кг      ;7.01;10.37;9.6;8.5
6794;В\Д "Поли-Р"    Fassadenfarbe  7  кг В;Деруфа;7 кг      ;9.19;10.37;9.6;8.5
6206;В\Д "Поли-Р"    Mattlatex  14 кг;Деруфа;14 кг     ;11.4;17.57;16.27;14.4
6795;В\Д "Поли-Р"    Mattlatex  14 кг В;Деруфа;14 кг     ;15.43;17.57;16.27;14.4
6628;В\Д "Поли-Р"    Mattlatex  14 кг м/у;Деруфа;14 кг     ;11.38;18.81;17.42;15.42
6667;В\Д "Поли-Р"    Mattlatex  14 кг м/у;Деруфа;14 кг     ;12.5;18.81;17.42;15.42
7083;В\Д "Поли-Р"    Mattlatex  14 кг м/у В;Деруфа;14 кг     ;13.18;18.81;17.42;15.42
6218;В\Д "Поли-Р"    Mattlatex  3,5  кг;Деруфа;3,5 кг    ;3.84;5.57;5.16;4.57
6796;В\Д "Поли-Р"    Mattlatex  3,5  кг м/у;Деруфа;3,5 кг    ;3.93;5.95;5.51;4.88
6208;В\Д "Поли-Р"    Mattlatex  7 кг;Деруфа;7 кг      ;6.15;9.09;8.42;7.45
6797;В\Д "Поли-Р"    Mattlatex  7 кг;Деруфа;7 кг      ;5.82;9.09;8.42;7.45
6648;В\Д "Поли-Р"    Mattlatex  7 кг м/у;Деруфа;7 кг      ;6.27;9.73;9.01;7.98
7082;В\Д "Поли-Р"    Mattlatex  7 кг м/у В;Деруфа;7 кг      ;6.78;9.73;9.01;7.98
6220;В\Д "Поли-Р"    Superweiss   14  кг;Деруфа;14 кг     ;13.73;21.64;20.04;17.74
6798;В\Д "Поли-Р"    Superweiss   14  кг;Деруфа;14 кг     ;14.07;21.64;20.04;17.74
6696;В\Д "Поли-Р"    Superweiss   14  кг м/у;Деруфа;14 кг     ;14.44;23.16;21.44;18.98
7434;В\Д "Поли-Р"    Superweiss   14  кг м/у В;Деруфа;14 кг     ;15.47;23.16;21.44;18.98


officeman   (2004-11-10 13:12:00) [23]

спасибо! обязательно попробую!
Проблема лишь состояла в том чтобы можно было налету создавать таблицы с данными! подставляя и использую данные из разных текстовых файлов. Когдато давно хотел написать ИБ как коммерческий проект.


sniknik   (2004-11-10 11:21:00) [24]

> Я собрался разрботать свою информационную бд, разобраться и немного поднакопить опыть программирования.
на основе текстовых файлов? проблемно. как индексы делать будеш? сортировка(в памяти)/фильтрация/использование с базой стандартных взаимодействующих компонент/и т.д.
в общем тебя ожидают трудности, но ради опыта, можно и "пободаться"  ;о)).
посмотри
х:\Program Files\Borland\Delphi7\Demos\Db\TextData
там пример "правильного" компонента датасета на текстовый файл, только в одну колонку, в принципе можно доработать.


officeman   (2004-11-10 10:33:00) [25]

Да всё нормально я разобрался!
просто обнуление переменной (ss1:=0) надо было тоже в цикл поставить. Ура! работает! =)
Я собрался разрботать свою информационную бд, разобраться и немного поднакопить опыть программирования.

У меня проблемы в криптографии! у тебя есть опыт?


ЮЮ   (2004-11-10 09:55:00) [26]

И обрати внимание на:
[Warning]: For loop control variable must be simple local variable

перенеси всю эту чушь
           ss: integer;
ai,h1,h2,h3,h4,h5,h6,h7,h8,h9,h10:integer;
pA,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10: string;
в var метода


ЮЮ   (2004-11-10 09:49:00) [27]

этот цикл воовще не работает:
for ir:= 3to f.Count-1 = for ir := 3 to 2


officeman   (2004-11-10 09:32:00) [28]

Удалено модератором


officeman   (2004-11-10 08:14:00) [29]

продолжение.
после добавления получается.
1001;Лак паркетный 2,5 кг;Турция;есть;
1001;Лак паркетный 2,5 кг;Турция;есть;
1001;Лак паркетный 2,5 кг;Турция;есть;

вместо
1001;Лак паркетный 2,5 кг;Турция;есть;
2544;Клей ПВА 3 кг;Россия;есть;
2662;Эмаль баклажановая 0,85 кг;Германия;нет;

немогу понять в чём дело.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо