Здравствуйте. Помогите оптимизировать алгоритм программы. Суть следующая:
Имеется база данных (файловая), из этой базы информация считывается в массивы. Иногда в один массив, иногда (если выполяются условия) в несколько.
Начало примерно такое:
Код:
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ый массив, то всё очень сильно вырастет.
Как здесь лучше оптимизировать код? После чтения из файла и вывода в Эексель еще не мало операций, поэтому писать сразу из файла в Эксель не получится.