Access Violation при работе с переменными

hichic
отредактировано 19:29 Раздел: FastReport 4.0
Использую Delphi7 и FastReport 4.9. Столкнулся со странной проблемой при работе с переменными.
Добавил в отчете две преременные var1 и var2. В Delphi в событии frxReport OnGetValue пишу следующий код:
procedure TForm1.frxReportGetValue(const VarName: String; var Value: Variant);
begin
  // Имя
  frxReport.Variables['var1'] := AnsiQuotedStr(Query1['name'], '''');
  // Дата
  frxReport.Variables['var2'] := Query1.ParamByName('date').AsDate;
end;
В скрипте отчета:
procedure ReportTitleOnBeforePrint(Sender: TfrxComponent);
begin
   Memo1.Text := UpperCase(<var1>) + ' от ' + DateToStr(<var2>);  
end;

При запуске отчета frxReport.ShowReport(); вылетает ошибка:
написал:
Access violation at address 0064DE9D in module 'project1.exe'. Read of address 000002F8

Причем если сделать так:
Delphi:
procedure TForm1.frxReportGetValue(const VarName: String; var Value: Variant);
begin
  // Имя
  frxReport.Variables['var1'] := AnsiQuotedStr(Query1['name'], '''');
end;
FastReport:
procedure ReportTitleOnBeforePrint(Sender: TfrxComponent);
begin
   Memo1.Text := UpperCase(<var1>);  
end;
или так:
Delphi:
procedure TForm1.frxReportGetValue(const VarName: String; var Value: Variant);
begin
  // Имя
  frxReport.Variables['var1'] := AnsiQuotedStr(Query1['name'], '''');
  // Дата
  frxReport.Variables['var2'] := Query1.ParamByName('date').AsDate;
end;
FastReport:
procedure ReportTitleOnBeforePrint(Sender: TfrxComponent);
begin
   Memo1.Text := ' от ' + DateToStr(<var2>);  
end;
То все работает.
Не понимаю, в чем дело. Помогите, пожалуйста.


Комментарии

  • hichic
    отредактировано May 2011
    Путем длительной интеллектуальной мастурбации установил, что ошибка происходит при использовании данных датасетов из разных модулей. Например:
    frxReport.Variables['var1'] := AnsiQuotedStr(Form1.Query1['field1'] + Form2.Query2['field2'], '''');
    
    Если перенести датасеты и компонент frxReport в один модуль, то все работает корректно. Пример:
    Form1.frxReport.Variables['var1'] := AnsiQuotedStr(Form1.Query1['field1'] + Form1.Query2['field2'], '''');
    
    Но почему?..
  • hichic
    отредактировано July 2011
    Данная проблема не возникает, если обращаться к frxReport из модуля, на котором компонент находится, и, соответственно, возника, если обращаться из другого с передачей переменным данных из разных модулей.
  • gpigpi
    отредактировано 19:29
    Вы бы выложили простой тестовый проект, демонстрирующий проблему

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

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