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 кг;Германия;нет;


officeman   (2004-11-12 12:28:00) [1]

to Anatoly Podgoretsky
основной объем занимает библиотека товара: описание, фотка.
это около 6 мб., плюс екзешник программы и dll для работы под разными ОС ещё на 4,5 м., плюс установщик(от InstallShield)
гдето так всё и наберается 12. Наверно я с DLL перестарался.
Еслибы можно было работать с таблицами парадокс без использования DLL... я бы в жизни не подумал бы об своей реализации.
Midas - я тоже пробовал. полностью не разобрался! непонравилась её работа под некоторыми ОС.

to sniknik
конечно мой грид(и датасет) близко не стоят с реальными уже существующими.  хм. задача только представлять данные, которые пользователь будет получать в виде файла обновления, используя специальный встроенный клиент. (или по электронной почте).

только для представления данных. без редактирования и пр.
Логичнее написать свой (как это сделал я) или использовать существующий, в моей задаче?


sniknik   (2004-11-12 12:01:00) [2]

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

кстати по поводу гибкости и удобства в работе, ... полностью несогласен, что это за удобство если для удаления одной записи в начале придется всю таблицу(txt файл) перезаписывать... разделители выпадают из символов пригодных к использованию в полях в базе(или сильно затрудняют разбор, если придумаеш "обходной маневр"), многопользовательского доступа не будет и в помине, ссылки на поля(быстрые) работать не будут т.к. записи переменной длинны, и чтобы сослаться на 2153ю строку/запись (например) нужно будет все до этого прочитать. или держать все в памяти (тоже вариант) но тогда тебе нужно на твоих 400-4000 записях и остановиться на большее не замахиваться. спорное "удобство". а индексы/сортировки/фильтры/связи/...? считаеш что это ненужные свойства баз? цифры/даты если понадобятся будеш держать в строке (а где же еще файл то текстовый) зничит или зависиш от локальных настроек или свой формат тчательно продуманый (сомнительно) или глюки непонятные от машины к машине.
... по мере написания сам сможеш добавить, разных "прелестей" текстового формата.


Anatoly Podgoretsky   (2004-11-12 10:49:00) [3]

officeman   (12.11.04 10:33) [26]
Некоторая организация поросила сделать электронный каталог их продукции. ну я сделал его с использование Paradox.. установочный пак весит 12 метров.

Как умудрился сделать так много, здесь должно быть всего 4-4 мб


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

Спасибо всем!

to ЮЮ.. ';'  он там необязателен так как дальше идёт end;
про TListItem я забыл! исправлюсь!

to sniknik! =) да неволнуйся! усё будет хорошо!
Да тема проста! Некоторая организация поросила сделать электронный каталог их продукции. ну я сделал его с использование Paradox.. установочный пак весит 12 метров.  прораммой пользуются организации по региону уже примерно пол-года. просто я решил её переписать чтобы можно было её с лёгкостью распростанять через интренет! и на основе разработок которые будут мной изучены - написать интернет магазин. в будущем. в настоящей базе пока что 400 позиций! каждая из которых имеет свою карточку в виде файла с описанием и фоткой.

да! задача написать компактный броузер для вкдкния таблиц источником которых являются текстовые файлы. Почему я выбрал текстовые файлы. на мой взгляд они гибки и удобны в работе. любой xls,doc,rtf документ за 2-3 минуты возможно перевести в текстовый файл с разделителями. который легко использовать дальше.

может у вас есть дельный совет.?


sniknik   (2004-11-12 08:33:00) [5]

уже лучше, понятнее, что делаеш (не совсем конечно, непоказаны типы используемых переменных, а догадки неравноценны знанию), но еще непонятно зачем. (от этого прямо зависит лучшее решение)

так понимаю на основе TListView пытаешся таблицу(оно же грид) сделать? совет в [6] видимо полностью проигнорировал. хм. ну чтож, на ошибках учатся. но только не надо разных обвинений, никто в здравом уме не будет повторять чужие ошибки чтобы разобратся и написаить их оптимизированный вариант... это твоя прерогатива.

p.s. надеюсь скажеш как твой коммерческий продукт будет называться? чтобы не дай бог не купить по ошибке. ;о))


ЮЮ   (2004-11-12 08:26:00) [6]

Молодца!
Осталость учесть, что после последнего значения ";" не стоит

И убери, ИМХО,
 try
 finally
 end
т.к. не вижу здесь "опасного" кода

З.Ы. Почему все строки добавляются как Columns.Add, а не создается для каждой строки новый TListItem, а уже там TListItem.SubItems.Add


officeman   (2004-11-12 08:03:00) [7]

родил.

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;


officeman   (2004-11-12 07:34:00) [8]

to MetalFan, прочитай мой пост номер 8, и тебе станет всё ясно!

to ALL. да конечно я сам его сделаю. Код будет мааааленький всмысле кломпактный и работать будет!

Я задал рабочий вопрос и никто не поддержал. залез на этот форум первый раз за посление полгода(год)... ладно ладно..

Officeman, сам дойдёт до истины!


ЮЮ   (2004-11-12 03:58:00) [9]

Как "правильно" записать этот кусок кода for.......

Для особо внимательных, повторяю:
ЮЮ ©   (11.11.04 03:23) [13]
Надо начинать не с массивов, а с алгоритмов, изучить один из китов алгоритма - его велмчество ЦИКЛ :)

Ты ведь и так последовательно выполняешь одни и те же действия, количество которых, на сам деле, определяется содержимым TempLine. Продумай алгоритм, нолучишь нормальный код.


jack128   (2004-11-11 18:28:00) [10]

officeman   (11.11.04 14:33) [16]
end;
end;
end;
finally
end;
addNewItem(fs);
end;
end;

вот за эти 7 строк - четвертовать через повешенье. Сначало учимся делать отступы, а потом выкладываем код в форум.


MetalFan   (2004-11-11 16:51:00) [11]


> ss:=0;
> TempLine:=f.Strings[ir];
> ...
> ...
> addNewItem(fs);
> end;
> end;

жуткий код! абсолютно нечитаемый(((
даже разбираться не хочется!


sniknik   (2004-11-11 16:34:00) [12]

если много ифов с одной переменной подряд то правильнее будет использовать case
но в этом случае и это неправильно, т.к. может быть разное количество сравнений.
можно и поправить, если бы был понятен смысл манипуляций (обьясни его простыми словами), может быть будет полная замена логики (зачем тогда это оптимизировать?)

p.s. рановато за коммерческие проекты взялся, имхо. ;)


msguns   (2004-11-11 14:54:00) [13]

Ух, щас придет ЮЗ ! ЧТО БУДЕТ !!!!!!!! Э8<O


officeman   (2004-11-11 14:33:00) [14]

Как "правильно" записать этот кусок кода 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;


jack128   (2004-11-11 04:43:00) [15]

kostan ©   (11.11.04 4:21) [14]
2)динамические массивы работают на два порядка быстрее
чем базы:) (типа IB)  

Ага.  Когда сортируют пять записей. А когда 5 миллонов,то...


kostan   (2004-11-11 04:21:00) [16]

1)однако стиль ???  зачем так много if?
желательно просто циклически ... вызывать процедуру(ы) обработки!

2)динамические массивы работают на два порядка быстрее
чем базы:) (типа IB)  ... и на порядок быстрее TStrings
(правда статические еще быстрее %на 30)
да и нужна ли вам такая скорость (какие объемы данных ?)


ЮЮ   (2004-11-11 03:23:00) [17]

Надо начинать не с массивов, а с алгоритмов, изучить один из китов алгоритма - его велмчество ЦИКЛ :)


officeman   (2004-11-10 15:13:00) [18]

to romkin , приведи пример. что ты имел ввиду под массивом в моём случае?


Romkin   (2004-11-10 13:34:00) [19]

ТАк. Быстренько читать учебник по Паскалю. Главу "Массивы"


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

кто может блеснуть своими знаниями, и помочь оптимизировать код?


Страницы:   1 2

Наверх

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