![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Здравствуйте. Помогите оптимизировать алгоритм программы. Суть следующая:
Имеется база данных (файловая), из этой базы информация считывается в массивы. Иногда в один массив, иногда (если выполяются условия) в несколько. Начало примерно такое: Код:
type TProduct = packed record kod: integer; pname: string[30]; ptype: integer; otgr: array[0..20] of integer; vozvr: array[0..20] of integer; recom: array[0..20] of integer; postav: array[0..20] of integer; end; var Stroki, Stroki_dop: array of TProduct; while not Eof(Felik) do // Читаем весь файл begin ReadLn(Felik, n1); // Читаем строку fkod := StrToInt(GetField(n1, 1)); // Код fpname := GetField(n1, 3); // Название fptype := StrToInt(GetField(n1, 2)); // Тип ....// Здесь еще в массивы данные добавляются if (fptype = 31) or (prodsarr[fkod, 4] = '1') then begin SetLength(Stroki_dop, Length(Stroki_dop) + 1); Stroki_dop[i].kod := fkod; Stroki_dop[i].pname := fpname; Stroki_dop[i].ptype := fptype; .... // Здесь еще в массивы данные добавляются end begin SetLength(Stroki, Length(Stroki) + 1); Stroki[i].kod := fkod; Stroki[i].pname := fpname; Stroki[i].ptype := fptype; .... // Здесь еще в массивы данные добавляются end; end; Затем выделяем из записей данные чтобы для ввода в Эксель: Код:
SetLength(main_arr, 0); SetLength(main_arr, Length(Stroki), 21); for i := 0 to Length(Stroki) - 1 do for j := 0 to Length(Stroki[j].recom) - 1 do main_arr[i, j] := Stroki[i].recom[j]; if Length(Stroki_dop) <> 0 then begin SetLength(main_arr2, 0); SetLength(main_arr2, Length(Stroki_dop), 21); for i := 0 to Length(Stroki_dop) - 1 do for j := 0 to Length(Stroki_dop[j].recom) - 1 do main_arr2[i, j] := Stroki_dop[i].recom[j]; end; Затем массивы main_arr и main_arr2 выводятся к Эксель. Про сами записи Stroki мы при выводе тоже не забываем и берем часть данных из них. Код:
if l1 <> 0 then // Если есть первый массив begin XL.Range[XL.Cells[6, ss], XL.Cells[l1 + 5, l3 + ss - 1]].Select; XL.Selection := Variant(main_arr); XL.Selection.EntireColumn.Hidden := True; end; if l2 <> 0 then // Если есть второй массив begin XL.Range[XL.Cells[l1 + 8, ss], XL.Cells[l1 + l2 + 7, l3 + ss - 1]].Select; XL.Selection := Variant(main_arr2); XL.Selection.EntireColumn.Hidden := True; end; Код я сильно урезал для форума, но суть такая. Могут существовать оба массива, либо только какой-то один из них. Теперь появилась необходимость создать третий список. Можно конечно создать Stroki_dop2 аналогичного типа. Но если потом вдруг понадобится 4ый массив, то всё очень сильно вырастет. Как здесь лучше оптимизировать код? После чтения из файла и вывода в Эексель еще не мало операций, поэтому писать сразу из файла в Эксель не получится. Последний раз редактировалось MasMaX, 07.02.2012 в 09:15. |