Проблемы с динамич массивом

отредактировано 23:08 Раздел: FastReport 3.0
Может кто поможет?
Нужно вывести сумму в заголовке группы Пример из руководства не работает вообще. Хочу вместо StringList использовать простой массив

Пытаюсь сделать это Начал с малого - просто выводить в заголовках числа: 0 для первой группы, 1 для второй и т.д.
Есть такой код
var
i1,i2:Integer=0;
SumArr:array  of integer;

procedure GroupHeader2OnBeforePrint(Sender: TfrxComponent);
begin
if Engine.FinalPass then Memo17.Text := 'Sum: ' + FloatToStr(i2);
end;

procedure GroupFooter2OnBeforePrint(Sender: TfrxComponent);
begin

if Engine.FinalPass=false then
   begin
   SumArr[i1]:=i1;
   i1:=i1+1;
   end;
if Engine.FinalPass=true then i2:=i2+1;
end;


begin

end.


В строке SumArr[i1]:=i1 выдает ошибку- Variant Array Index Out of Bounds
Куда там что не помещается не пойму вообще Или этот fast script такой дырявый или у меня к концу дня крыша едет Отчет сделал двухпроходным
Fast-report 3.09

Комментарии

  • отредактировано 23:08
    Сорри, я тут новичок, это наверное надо писать в раздел FastScript В общем щас спрошу там
  • отредактировано 23:08
    Раз у тебя массив динамический перед использованием надо его проинициализировать.
    begin
    SetLength(SumArr,10); // 10 элементов,  0..9
    end.
    

    Если заранее не знаешь размера то увеличивай перед присвоением каждого нового элемента.
  • Andrew_ShAndrew_Sh г.Минск
    отредактировано 23:08
    ответ на вопрос смотри ЗДЕСЬ
  • отредактировано 23:08
    Не надо там никаких листов.
    просто подправь немного свой код
    var
    i1,i2:Integer=0;
    SumArr:array  of integer;
    
    procedure GroupHeader2OnBeforePrint(Sender: TfrxComponent);
    begin
    if Engine.FinalPass then Memo17.Text := 'Sum: ' + FloatToStr(i2);
    end;
    
    procedure GroupFooter2OnBeforePrint(Sender: TfrxComponent);
    begin
    
    if Engine.FinalPass=false then
      begin
      SetLength(SumArr,i1);
      SumArr[i1]:=i1;
      Inc(i1); // интересно Inc в FR также оптимизирован как и в Delphi :)
      end;
    if Engine.FinalPass=true then Inc(i2);
    end;
    
    
    begin
     i1:=1; // текущая размерность массива, как минимум должна быть 1
    end.
    

    во всяком случае у меня работает версия 3.14
  • Andrew_ShAndrew_Sh г.Минск
    отредактировано 23:08
    Пусть будет динамический массив. Но в этом примере надо провести работу над ошибками. Если SumArr используется для накопления сумм, то почему при выводе в GroupHeader2OnBeforePrint использутся какая-то переменная i2? SumArr - динамический массив, а элементы динамических массивов всегда нумеруются с нуля, поэтому даже с исправлениями от Markusа будет вылазить ошибка Variant Array Index Out of Bounds. Правильный пример выглядит так:
    var
      i1:Integer;
      SumArr:array of integer;
    
    procedure Page1OnBeforePrint(Sender: TfrxComponent);
    begin
      i1 := 0;
    end;
    
    procedure GroupHeader2OnBeforePrint(Sender: TfrxComponent);
    begin
      inc(i1);
      if Engine.FinalPass then 
        Memo17.Text := 'Sum: ' + FloatToStr(SumArr[i1]);
    end;
    
    procedure GroupFooter2OnBeforePrint(Sender: TfrxComponent);
    begin
      if not Engine.FinalPass then
      begin
        SetLength(SumArr, i1 + 1);
        SumArr[i1] := i1;
      end;
    end;
    
    begin
      
    end.
    
  • отредактировано 23:08
    Ну раз пошла такая пьянка поправлюсь сам ;)
    и чтобы полностью соответствовало условию
    написал:
    Пытаюсь сделать это Начал с малого - просто выводить в заголовках числа: 0 для первой группы, 1 для второй и т.д.
    var
    i1,i2:Integer;
    SumArr:array  of integer;
    
    procedure GroupHeader2OnBeforePrint(Sender: TfrxComponent);
    begin
    if Engine.FinalPass then Memo17.Text := 'Sum: ' + FloatToStr(SumArr[i2]);
    end;
    
    procedure GroupFooter2OnBeforePrint(Sender: TfrxComponent);
    begin
    
    if Engine.FinalPass=false then
     begin
     SetLength(SumArr,i1+1);
     SumArr[i1]:=i1;
     Inc(i1); // интересно Inc в FR также оптимизирован как и в Delphi :)
     end;
    if Engine.FinalPass=true then Inc(i2);
    end;
    
    
    begin
    i1:=0; 
    i2:=0;
    end.
    

    а по поводу
    написал:
    Если SumArr используется для накопления сумм, то почему при выводе в GroupHeader2OnBeforePrint использутся какая-то переменная i2?
    это была уже отчаянная попытка получить хоть что-то

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.