Componentes.Terceros.jvcl/official/3.32/examples/RaLib/RaInterpreterDynamicLoad/MainForm.pas

136 lines
3.7 KiB
ObjectPascal
Raw Normal View History

unit MainForm;
{ NOTE: to run this demo, compile the packages MyLabelPackage.dpk and JvInterpreter_MyLabelPackage.dpk (in this folder)
and move the generated bpl/dcp files to the demos output folder (this is by default the jvcl\bin folder) }
{$I jvcl.inc}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TMain = class(TForm)
RunDynamic: TButton;
procedure RunDynamicClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Main: TMain;
implementation
//uses JvInterpreter_StdCtrls, JvInterpreter_Classes;
{$R *.dfm}
const
{$IFDEF COMPILER5}
PackageFileName = 'JvInterpreterD5R.bpl';
ALLPackageFileName = 'JvInterpreterD5R.bpl';
{$ENDIF COMPILER5}
{$IFDEF COMPILER6}
PackageFileName = 'JvInterpreterD6R.bpl';
ALLPackageFileName = 'JvInterpreterD6R.bpl';
{$ENDIF COMPILER6}
{$IFDEF COMPILER7}
PackageFileName = 'JvInterpreterD7R.bpl';
ALLPackageFileName = 'JvInterpreterD7R.bpl';
{$ENDIF COMPILER7}
{$IFDEF COMPILER9}
PackageFileName = 'JvInterpreterD9R.bpl';
ALLPackageFileName = 'JvInterpreterD9R.bpl';
{$ENDIF COMPILER9}
{$IFDEF COMPILER10}
PackageFileName = 'JvInterpreterD10R.bpl';
ALLPackageFileName = 'JvInterpreterD10R.bpl';
{$ENDIF COMPILER10}
procedure DynamicJvInterpreterRunFormModal(const FileName: TFileName);
var
Pak, ALLPak: HModule;
Proc : procedure;
type
TRunFormModal = function (const FileName: TFileName): TModalResult;
TMakeForm = function (const FileName: TFileName): TForm;
begin
try
Pak := LoadPackage(PackageFileName);
except
raise Exception.CreateFmt('Package %s couldn''t be loaded!', [ExtractFileName(PackageFileName)]);
end;
try
ALLPak := LoadPackage(ALLPackageFileName);
except
raise Exception.CreateFmt('Package %s couldn''t be loaded!', [ExtractFileName(AllPackageFileName)]);
end;
try
Proc := GetProcAddress(ALLPak, ('@JvInterpreter_all@initialization$qqrv'));
if not Assigned(Proc) then
raise Exception.CreateFmt('%s Initialization section not found!', [ChangeFileExt(ExtractFileName(AllPackageFileName),'')]);
Proc;
Proc := GetProcAddress(Pak, ('@JvInterpreterFm@JvInterpreterRunFormModal$qqrx17System@AnsiString'));
if not Assigned(Proc) then
raise Exception.CreateFmt('Function %s not found!', ['RunFormModal']);
TRunFormModal(Proc)(FileName);
finally
UnloadPackage(ALLPak);
UnloadPackage(Pak);
end;
end;
function LoadJvInterpreterPackage(const PackageFileName: TFileName; const UnitName: String): HModule;
var
Proc: procedure;
FuncName: String;
begin
try
Result := LoadPackage(PackageFileName);
except
raise Exception.CreateFmt('Package %s couldn''t be loaded!', [ExtractFileName(PackageFileName)]);
end;
FuncName := '@' + UnitName + '@initialization$qqrv';
Proc := GetProcAddress(Result, PChar(FuncName));
if not Assigned(Proc) then
raise Exception.CreateFmt('Function %s.Initialization not found!', [FuncName]);
Proc;
end;
procedure TMain.RunDynamicClick(Sender: TObject);
var
PackageFileName: String;
MyLabelPackage: HModule;
begin
PackageFileName := ExtractFilePath(Application.ExeName) + 'MyLabelPackage.bpl';
MyLabelPackage := 0;
try
try
MyLabelPackage := LoadJvInterpreterPackage(PackageFileName, 'Mylabel');
except
raise Exception.CreateFmt('Package %s couldn''t be loaded!', [ExtractFileName(PackageFileName)]);
end;
DynamicJvInterpreterRunFormModal(ExtractFilePath(Application.ExeName) + 'ScriptForm.pas');
finally
FreeLibrary(MyLabelPackage);
end;
end;
initialization
end.