Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Внизпро tStringList.Create Найти похожие ветки
← →
officeman (2004-11-10 07:30) [0]Уважаемые мастера. подскажите где ошибка. я читаю текстовый файл с четвертой строки. строку делю на части по специальному символу разделителю. и записываю в 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 кг;Германия;нет;
← →
officeman (2004-11-10 08:14) [1]продолжение.
после добавления получается.
1001;Лак паркетный 2,5 кг;Турция;есть;
1001;Лак паркетный 2,5 кг;Турция;есть;
1001;Лак паркетный 2,5 кг;Турция;есть;
вместо
1001;Лак паркетный 2,5 кг;Турция;есть;
2544;Клей ПВА 3 кг;Россия;есть;
2662;Эмаль баклажановая 0,85 кг;Германия;нет;
немогу понять в чём дело.
← →
officeman (2004-11-10 09:32) [2]Удалено модератором
← →
ЮЮ © (2004-11-10 09:49) [3]этот цикл воовще не работает:
for ir:=3 to f.Count-1 = for ir := 3 to 2
← →
ЮЮ © (2004-11-10 09:55) [4]И обрати внимание на:
[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 метода
← →
officeman (2004-11-10 10:33) [5]Да всё нормально я разобрался!
просто обнуление переменной (ss1:=0) надо было тоже в цикл поставить. Ура! работает! =)
Я собрался разрботать свою информационную бд, разобраться и немного поднакопить опыть программирования.
У меня проблемы в криптографии! у тебя есть опыт?
← →
sniknik © (2004-11-10 11:21) [6]> Я собрался разрботать свою информационную бд, разобраться и немного поднакопить опыть программирования.
на основе текстовых файлов? проблемно. как индексы делать будеш? сортировка(в памяти)/фильтрация/использование с базой стандартных взаимодействующих компонент/и т.д.
в общем тебя ожидают трудности, но ради опыта, можно и "пободаться" ;о)).
посмотри
х:\Program Files\Borland\Delphi7\Demos\Db\TextData
там пример "правильного" компонента датасета на текстовый файл, только в одну колонку, в принципе можно доработать.
← →
officeman (2004-11-10 13:12) [7]спасибо! обязательно попробую!
Проблема лишь состояла в том чтобы можно было налету создавать таблицы с данными! подставляя и использую данные из разных текстовых файлов. Когдато давно хотел написать ИБ как коммерческий проект.
← →
officeman (2004-11-10 13:19) [8]Итого получилось! =)
на форме надо: 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
← →
sniknik © (2004-11-10 13:20) [9]IB? опоздал уже написан, и комерческий и фриваре. ;о))
и текст?! неподходяшая основа для базы, лучше тогда свой формат разработать.
← →
officeman (2004-11-10 13:21) [10]кто может блеснуть своими знаниями, и помочь оптимизировать код?
← →
Romkin © (2004-11-10 13:34) [11]ТАк. Быстренько читать учебник по Паскалю. Главу "Массивы"
← →
officeman (2004-11-10 15:13) [12]to romkin , приведи пример. что ты имел ввиду под массивом в моём случае?
← →
ЮЮ © (2004-11-11 03:23) [13]Надо начинать не с массивов, а с алгоритмов, изучить один из китов алгоритма - его велмчество ЦИКЛ :)
← →
kostan © (2004-11-11 04:21) [14]1)однако стиль ??? зачем так много if?
желательно просто циклически ... вызывать процедуру(ы) обработки!
2)динамические массивы работают на два порядка быстрее
чем базы:) (типа IB) ... и на порядок быстрее TStrings
(правда статические еще быстрее %на 30)
да и нужна ли вам такая скорость (какие объемы данных ?)
← →
jack128 © (2004-11-11 04:43) [15]kostan © (11.11.04 4:21) [14]
2)динамические массивы работают на два порядка быстрее
чем базы:) (типа IB)
Ага. Когда сортируют пять записей. А когда 5 миллонов,то...
← →
officeman (2004-11-11 14:33) [16]Как "правильно" записать этот кусок кода for.......
без использования if.
Вобщем-то и мои каракули работают неплохо. только у меня получается ограничение на 10 частей (делиметерс),
а как записать чтоб небыло ограничения.
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;
← →
msguns © (2004-11-11 14:54) [17]Ух, щас придет ЮЗ ! ЧТО БУДЕТ !!!!!!!! Э8<O
← →
sniknik © (2004-11-11 16:34) [18]если много ифов с одной переменной подряд то правильнее будет использовать case
но в этом случае и это неправильно, т.к. может быть разное количество сравнений.
можно и поправить, если бы был понятен смысл манипуляций (обьясни его простыми словами), может быть будет полная замена логики (зачем тогда это оптимизировать?)
p.s. рановато за коммерческие проекты взялся, имхо. ;)
← →
MetalFan © (2004-11-11 16:51) [19]
> ss:=0;
> TempLine:=f.Strings[ir];
> ...
> ...
> addNewItem(fs);
> end;
> end;
жуткий код! абсолютно нечитаемый(((
даже разбираться не хочется!
← →
jack128 © (2004-11-11 18:28) [20]officeman (11.11.04 14:33) [16]
end;
end;
end;
finally
end;
addNewItem(fs);
end;
end;
вот за эти 7 строк - четвертовать через повешенье. Сначало учимся делать отступы, а потом выкладываем код в форум.
← →
ЮЮ © (2004-11-12 03:58) [21]Как "правильно" записать этот кусок кода for.......
Для особо внимательных, повторяю:
ЮЮ © (11.11.04 03:23) [13]
Надо начинать не с массивов, а с алгоритмов, изучить один из китов алгоритма - его велмчество ЦИКЛ :)
Ты ведь и так последовательно выполняешь одни и те же действия, количество которых, на сам деле, определяется содержимым TempLine. Продумай алгоритм, нолучишь нормальный код.
← →
officeman (2004-11-12 07:34) [22]to MetalFan, прочитай мой пост номер 8, и тебе станет всё ясно!
to ALL. да конечно я сам его сделаю. Код будет мааааленький всмысле кломпактный и работать будет!
Я задал рабочий вопрос и никто не поддержал. залез на этот форум первый раз за посление полгода(год)... ладно ладно..
Officeman, сам дойдёт до истины!
← →
officeman (2004-11-12 08:03) [23]родил.
procedure TForm1.Button1Click(Sender: TObject);
var
ai,h1:integer;
p1: string;
begin
h1:=0;
for ai:=1 to length(str.Caption) do begin
if str.Caption[ai]=";" then begin
p1:=Copy(str.Caption,h1+1,ai-h1-1);
h1:=ai;
try
with LV do
begin
NewColumn := Columns.Add;
NewColumn.Caption := p1
end;
finally
end;
end;
end;
← →
ЮЮ © (2004-11-12 08:26) [24]Молодца!
Осталость учесть, что после последнего значения ";" не стоит
И убери, ИМХО,
try
finally
end
т.к. не вижу здесь "опасного" кода
З.Ы. Почему все строки добавляются как Columns.Add, а не создается для каждой строки новый TListItem, а уже там TListItem.SubItems.Add
← →
sniknik © (2004-11-12 08:33) [25]уже лучше, понятнее, что делаеш (не совсем конечно, непоказаны типы используемых переменных, а догадки неравноценны знанию), но еще непонятно зачем. (от этого прямо зависит лучшее решение)
так понимаю на основе TListView пытаешся таблицу(оно же грид) сделать? совет в [6] видимо полностью проигнорировал. хм. ну чтож, на ошибках учатся. но только не надо разных обвинений, никто в здравом уме не будет повторять чужие ошибки чтобы разобратся и написаить их оптимизированный вариант... это твоя прерогатива.
p.s. надеюсь скажеш как твой коммерческий продукт будет называться? чтобы не дай бог не купить по ошибке. ;о))
← →
officeman (2004-11-12 10:33) [26]Спасибо всем!
to ЮЮ.. ";" он там необязателен так как дальше идёт end;
про TListItem я забыл! исправлюсь!
to sniknik! =) да неволнуйся! усё будет хорошо!
Да тема проста! Некоторая организация поросила сделать электронный каталог их продукции. ну я сделал его с использование Paradox.. установочный пак весит 12 метров. прораммой пользуются организации по региону уже примерно пол-года. просто я решил её переписать чтобы можно было её с лёгкостью распростанять через интренет! и на основе разработок которые будут мной изучены - написать интернет магазин. в будущем. в настоящей базе пока что 400 позиций! каждая из которых имеет свою карточку в виде файла с описанием и фоткой.
да! задача написать компактный броузер для вкдкния таблиц источником которых являются текстовые файлы. Почему я выбрал текстовые файлы. на мой взгляд они гибки и удобны в работе. любой xls,doc,rtf документ за 2-3 минуты возможно перевести в текстовый файл с разделителями. который легко использовать дальше.
может у вас есть дельный совет.?
← →
Anatoly Podgoretsky © (2004-11-12 10:49) [27]officeman (12.11.04 10:33) [26]
Некоторая организация поросила сделать электронный каталог их продукции. ну я сделал его с использование Paradox.. установочный пак весит 12 метров.
Как умудрился сделать так много, здесь должно быть всего 4-4 мб
← →
sniknik © (2004-11-12 12:01) [28]> может у вас есть дельный совет.?
бесполезно, ты же уже все решил, а я только за координальную смену логики. даже оставляя текст, что уже нехорошо, все одно делать нужно на основе рекордсета, иначе придется переписывать очень многое, что уже есть в стандартном дельфи и проверено не раз, а у тебя... не уверен что у тебя лучше чем у борланда получится.
кстати по поводу гибкости и удобства в работе, ... полностью несогласен, что это за удобство если для удаления одной записи в начале придется всю таблицу(txt файл) перезаписывать... разделители выпадают из символов пригодных к использованию в полях в базе(или сильно затрудняют разбор, если придумаеш "обходной маневр"), многопользовательского доступа не будет и в помине, ссылки на поля(быстрые) работать не будут т.к. записи переменной длинны, и чтобы сослаться на 2153ю строку/запись (например) нужно будет все до этого прочитать. или держать все в памяти (тоже вариант) но тогда тебе нужно на твоих 400-4000 записях и остановиться на большее не замахиваться. спорное "удобство". а индексы/сортировки/фильтры/связи/...? считаеш что это ненужные свойства баз? цифры/даты если понадобятся будеш держать в строке (а где же еще файл то текстовый) зничит или зависиш от локальных настроек или свой формат тчательно продуманый (сомнительно) или глюки непонятные от машины к машине.
... по мере написания сам сможеш добавить, разных "прелестей" текстового формата.
← →
officeman (2004-11-12 12:28) [29]to Anatoly Podgoretsky
основной объем занимает библиотека товара: описание, фотка.
это около 6 мб., плюс екзешник программы и dll для работы под разными ОС ещё на 4,5 м., плюс установщик(от InstallShield)
гдето так всё и наберается 12. Наверно я с DLL перестарался.
Еслибы можно было работать с таблицами парадокс без использования DLL... я бы в жизни не подумал бы об своей реализации.
Midas - я тоже пробовал. полностью не разобрался! непонравилась её работа под некоторыми ОС.
to sniknik
конечно мой грид(и датасет) близко не стоят с реальными уже существующими. хм. задача только представлять данные, которые пользователь будет получать в виде файла обновления, используя специальный встроенный клиент. (или по электронной почте).
только для представления данных. без редактирования и пр.
Логичнее написать свой (как это сделал я) или использовать существующий, в моей задаче?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.11.28;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.033 c