Заморочка с отчётом в DLL
Уважаемые мастера, подскажите как решить следующую проблему.
Впервые решил использовать фастрепорт и поэтому может чего то недопонимаю.
Итак.
Есть прога + Отчёт в ДЛЛ.
В проге на каждый TDataSource создан свой TfrxDbDataSet.
Не могу в репорте "видеть" TfrxDbDataSet'ы в основном приложении.
Теперь код. Все модули класть не буду. Через чур большие они, но основные моменты укажу.
Репорт отлично вызывается и работает. Вот только "видит" он только те данные что в самой ДЛЛ сделаны.
Научите как подцепиться к данным в основном проекте ?
Иначе весь смысл класть репорт в ДЛЛ просто исчезает.
Впервые решил использовать фастрепорт и поэтому может чего то недопонимаю.
Итак.
Есть прога + Отчёт в ДЛЛ.
В проге на каждый 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;
//--------------------------------------------------------
Репорт отлично вызывается и работает. Вот только "видит" он только те данные что в самой ДЛЛ сделаны.
Научите как подцепиться к данным в основном проекте ?
Иначе весь смысл класть репорт в ДЛЛ просто исчезает.
Комментарии
В основном приложении датасетов штук 300. Передать их в ДЛЛ просто геморно.
Неужели нет решения ?