Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.02.2012, 09:12
MasMaX MasMaX вне форума
Прохожий
 
Регистрация: 07.02.2012
Сообщения: 1
Репутация: 10
Вопрос Несколько однотипных массивов

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

Начало примерно такое:
Код:
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.
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:16.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025