Здравствуйте. Помогите оптимизировать алгоритм программы. Суть следующая:
Имеется база данных (файловая), из этой базы информация считывается в массивы. Иногда в один массив, иногда (если выполяются условия) в несколько.
Начало примерно такое:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | 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 ;
|
Затем выделяем из записей данные чтобы для ввода в Эксель:
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 мы при выводе тоже не забываем и берем часть данных из них.
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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ый массив, то всё очень сильно вырастет.
Как здесь лучше оптимизировать код? После чтения из файла и вывода в Эексель еще не мало операций, поэтому писать сразу из файла в Эксель не получится.