136 lines
3.7 KiB
ObjectPascal
136 lines
3.7 KiB
ObjectPascal
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.
|