![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
про tStringList.Create [D6]
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 кг;Германия;нет;
немогу понять в чём дело.