TfrxReport в Dll неработает?

отредактировано 11:55 Раздел: FastReport 3.0
Добрый день!!!
Решил перемемтить рабочую процедуру построения отчета в DLL.
Procedure GetReport(RepName:string; NPacient:integer);
begin
  if not dmReport.frxReport1.LoadFromFile(RepName)
  then ShowMessage('Файл отчета ''+RepName+'' не загруженна')
  else
   begin
    dmReport.frxReport1.Variables['NPacient']:=NPacient;
    if dmReport.frxReport1.PrepareReport
    then dmReport.frxReport1.ShowReport;
  end;
end;
Выдает ошибку "Access violation at adress 000664c1c in modul DllReport.dll"
В чем причина непойму. пошагово слетает на dmReport.frxReport1.ShowReport.

Комментарии

  • отредактировано 11:55
    Что такое dmReport? Глобальная переменная? или это объект переданный из основной программы? Подробнее расскажи. Исползуешь ли run-time пакеты?
  • отредактировано February 2006
    dmReport - это DataModule на котором лежат пиктограмки frxClass, frxBDEComponents, frxCross. Больше в Dll ничего нет. В этом unit:
    unit rep;
    
    interface
    
    uses
      SysUtils, Classes, frxClass, frxBDEComponents, frxCross, Dialogs;
    
    type
      TdmReport = class(TDataModule)
        frxCrossObject1: TfrxCrossObject;
        frxBDEComponents1: TfrxBDEComponents;
        frxReport1: TfrxReport;
        procedure DataModuleCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    var
      dmReport: TdmReport;
      Procedure GetReport(RepName:string; NPacient:integer);
    StartDate,StopDate:TDateTime);
    implementation
    
    {$R *.dfm}
    Procedure GetReport(RepName:string; NPacient:integer);
    begin
      if not dmReport.frxReport1.LoadFromFile(RepName)
      then ShowMessage('Файл отчета ''+RepName+'' не загруженна')
      else
       begin
        dmReport.frxReport1.Variables['NPacient']:=NPacient;
        if dmReport.frxReport1.PrepareReport
        then dmReport.frxReport1.ShowReport;
      end;
    end;
    
    end.
    
    В самой библиотеке:
    library DllReport;
    
    uses
      SysUtils,
      Classes,
      rep in 'rep.pas' {dmReport: TDataModule};
    
    {$R *.RES}
    exports GetReport;
    begin
    end.
    
    В процедуру передается назване файла отчета и переменная типа integer.
  • отредактировано 11:55
    Попробуйте не frxReport1.ShowReport, а frxReport1.ShowPreparedReport.
  • отредактировано 11:55
    Модуль ShareMem не используешь значит вместо string используй PChar или ShortString (смотри примечание которое появляется при создании новой dll)
  • отредактировано 11:55
    Упростил код, убрал вообще все параметры процедуры
    Procedure GetReport;//(RepName:ShortString; NPacient:integer);
    begin
      if not dmReport.frxReport1.LoadFromFile('DirOnProcA41.fr3')
      then ShowMessage('Файл отчета ''+RepName+'' не загруженна')
      else
       begin
        dmReport.frxReport1.Variables['NPacient']:=1;
        if dmReport.frxReport1.PrepareReport
        then dmReport.frxReport1.ShowPreparedReport;
      end;
    end;
    

    <span style='font-size:14pt;line-height:100%'>Все равно таже ошибка!!!</span>
  • отредактировано 11:55
    А где создается dmReport?

    Посмотри пример в Demos\Dll
  • отредактировано 11:55
    -=Serg=-. Спасибо.
    Я посмотрел пример там форма создается, а у меня дата модуль уже создан при проектировании. На что мне обратить внимание на переменную TApplication или на что то другое.
  • отредактировано 11:55
    Создавай датамодуль динамически. По аналогии с тем как сделано в демке.
  • отредактировано 11:55
    Удалось вызвать отчет следующей процедурой:
    Procedure GetReport(A: TApplication);
    var
      dmReport: TDataModule1;
    begin
      Application.Handle := A.Handle;
      dmReport := TDataModule1.Create(A);
      try
        if not dmReport.frxReport1.LoadFromFile('DirOnProcA41.fr3')
        then ShowMessage('Файл отчета не загруженна')
        else 
          begin
            dmReport.frxReport1.ShowReport;
            dmReport.frxReport1.Variables['NPacient']:=1;
          end;
      finally
        dmReport.Free;
      end;
    end;
    
    Как правильно передать параметр в процедуру. Мне необходимо передать имя файла отчета ('DirOnProcA41.fr3') и переменную типа integer. Если можно на примере.

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

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