Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.28;
Скачать: CL | DM;

Вниз

про 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;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.041 c
3-1099351613
Apophis
2004-11-02 02:26
2004.11.28
DBGrid и блокировка клавиш курсора и ESC


1-1100215749
Семен
2004-11-12 02:29
2004.11.28
Как вытащить нужный мне текст?


1-1100604775
Rifo
2004-11-16 14:32
2004.11.28
Буфер обмена-как до него добраться?


14-1100055330
Думкин
2004-11-10 05:55
2004.11.28
С днем рождения!


3-1099468339
RavenD
2004-11-03 10:52
2004.11.28
Как определить длинну всего Blob a?