Заморочка с отчётом в DLL

отредактировано 05:17 Раздел: FastReport 3.0
Уважаемые мастера, подскажите как решить следующую проблему.
Впервые решил использовать фастрепорт и поэтому может чего то недопонимаю.
Итак.
Есть прога + Отчёт в ДЛЛ.
В проге на каждый TDataSource создан свой TfrxDbDataSet.
Не могу в репорте "видеть" TfrxDbDataSet'ы в основном приложении.
Теперь код. Все модули класть не буду. Через чур большие они, но основные моменты укажу.
//-- По части DLL
Library FRDll;
uses
  Forms,
  FRSel in 'FRSel.pas' {FRSelForm},
  FRUnit in 'FRUnit.pas' {FRForm};

{$R *.res}
exports GetFastPerort;
  
begin
end.

//
Procedure GetFastPerort(A: TApplication; Login, ComponentName, RepPath : String; Tip : Integer); StdCall;
//<<Login, ComponentName, RepPath : String; Tip : Integer>> используется в ДЛЛ для других целей.

//
Procedure GetFastPerort(A: TApplication; Login, ComponentName, RepPath : String; Tip : Integer);
begin
  Application.Handle := A.Handle;
  FRForm := TFRForm.Create(A);
  FRSelForm := TFRSelForm.Create(A);
   FRForm.Login := Login;
   FRForm.ComponentName := ComponentName;
   FRForm.RepPath := RepPath;
   FRForm.frxDesigner.OpenDir := RepPath;
   FRForm.frxDesigner.SaveDir := RepPath;
   FRForm.CreateFRDataSource;
   case Tip Of
    0 : FRForm.DoReport(FRForm.ComponentName);
    1 : FRForm.DoDesign(FRForm.ComponentName);
   end;
  FRSelForm.Free;
  FRForm.Free;
end;

//
Procedure TFRForm.DoReport(ComponentName : String);
var RepName : String;
Begin
 RepName := GetFileNameForReport(ComponentName);
 If RepName<>'' Then
 begin
  Report.LoadFromFile(RepName);
  if Report.PrepareReport then Report.ShowPreparedReport;
 end;
End;




//-- Вызов в основном проекте

If (Key in PrintHotKey) and
   (Screen.ActiveControl as TwwDBGrid).DataSource.DataSet.Active Then
 CallFastReport(Screen.ActiveControl.Name, 0);


//
Procedure TDM.CallFastReport(ComponentName : String; Tip : Integer);
var
  LibHandle: THandle;
  FastReportForm : TFastReportForm;
begin
  LibHandle := LoadLibrary('FRDll.DLL');
  try
    if LibHandle = HINSTANCE_ERROR then
      raise Exception.Create('Unable to Load FRDll.DLL');
    @FastReportForm := GetProcAddress(LibHandle, 'GetFastPerort');
    if not (@FastReportForm = nil) then
      FastReportForm(Application, SelectorForm.Ret.Login, ComponentName, SetupForm.ReportsPath.Text, Tip);
  finally
    FreeLibrary(LibHandle);
  end;
end;

//
TFastReportForm = Procedure(A: TApplication; Login, ComponentName, RepPath : String; Tip : Integer); StdCall;

//--------------------------------------------------------

Репорт отлично вызывается и работает. Вот только "видит" он только те данные что в самой ДЛЛ сделаны.
Научите как подцепиться к данным в основном проекте ?
Иначе весь смысл класть репорт в ДЛЛ просто исчезает. ;)

Комментарии

  • отредактировано 05:17
    компилируете с использованием run time пакетов?
  • отредактировано 05:17
    Exciter написал:
    Научите как подцепиться к данным в основном проекте ?
    Иначе весь смысл класть репорт в ДЛЛ просто исчезает.
    Это не факт. Нр у меня ФР лежит в ДЛЛ и все компоненты доступа к данным и все данные генерит библиотека, а основное приложение вообще доступа к данным не имеет. Короче, все зависит от конкретной реализации. В Вашем случае, как я понимаю, необходимо передавать в ДЛЛ компоненты доступа к данным с помощью динамического массива...
  • отредактировано 05:17
    Постольку поскольку в ДЛЛ передаётся ссылка на Application, формы в ДЛЛ ИМХО создаются от основного приложения, а вместе с ними и компоненты FR. Должен же в таком случае фаст "видеть" датасеты основного прилоюбения.
    написал:
    В Вашем случае, как я понимаю, необходимо передавать в ДЛЛ компоненты доступа к данным с помощью динамического массива...

    В основном приложении датасетов штук 300. Передать их в ДЛЛ просто геморно.

    Неужели нет решения ? ;)

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

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