Решил не создавать новую тему, проблема тоже с передачей параметра в функцию. Задача такая:
Есть bpl пакет:
Код:
unit ULogin;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DB, DBClient, Provider, ADODB, UDataModule;
type
TFLogin = class(TForm)
Edit_EmployeeId: TEdit;
Edit_EmployeePass: TEdit;
Label_EmployeeId: TLabel;
Label_EmployeePass: TLabel;
BtnOK: TButton;
Btn_Close: TButton;
procedure BtnOKClick(Sender: TObject);
procedure Btn_CloseClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
end;
procedure ExecuteModal;
function FamilyName: string;
function PluginName: string;
implementation
{$R *.dfm}
.....
procedure ExecuteModal;
var
FLogin:TFLogin;
begin
FLogin:= TFLogin.Create(Application);
FLogin.Hide;
FLogin.Showmodal;
end;
exports
ExecuteModal;
end.
из главной формы по нажатию кнопки вызывается процедура, расположенная в DataModule, из которой вызывается запуск и загрузка bpl пакета:
Код:
unit UDataModule;
interface
uses
Windows, Messages, SysUtils,Classes,Dialogs, DB, ADODB, IniFiles;
type
TExecuteModal = procedure;
TDM = class(TDataModule)
Query: TADOQuery;
DataSet: TADODataSet;
procedure DataModuleCreate(Sender: TObject);
private
public
end;
procedure LoadPlugin(PlName:String; H:HWND; Par:string);
const
MY_MESSAGE = WM_USER + 1;
var
DM: TDM;
ParentHandle:HWND;
implementation
{$R *.dfm}
.....
//---------------------------ЗАГРУЗКА ПЛАГИНА
procedure LoadPlugin(PlName:String; H:HWND; Par:string);
var
Plugin : HModule;
FamilyName : TFamilyName;
PluginName : TPluginName;
ExecuteModal : TExecuteModal;
ServerPath,
ServerPluginPath,
LocalPluginPath,
PluginFileName:string;
MyIniFile:TInifile;
begin
//Получаем путь к серверу из файла настроек
MyIniFile := TIniFile.Create(GetCurrentDir+'\cfg.ini');
ServerPath := MyIniFile.ReadString('General', 'ServerPath', 'not found');
MyIniFile.Free;
ServerPluginPath:=ServerPath+PlName+'.bpl';
LocalPluginPath:=GetCurrentDir+'\'+PlName+'.bpl';
PluginFileName:=PlName+'.bpl';
//Пробуем обновить с сервера
if not CopyFile(PChar(ServerPluginPath), PChar(LocalPluginPath), false) then
begin
showmessage('Не получилось обновить '+PluginFileName+' с сервера');
end;
//Ищем в папке с программой
if FileSearch(PChar(PluginFileName), GetCurrentDir)='' then
begin
showmessage('Локальная копия '+PluginFileName+' не найдена');
//Если модуль логина не найден - закрываем всю программу
if PlName='Login' then SendMessage(ParentHandle, WM_DESTROY, 0,0); //FMain.Close;
end;
//Пробуем загрузить плагин в память
try
Plugin := LoadPackage(PluginFileName);
except
showmessage('Ошибка загрузки '+PluginFileName+' в память');
//Если модуль логина невозможно загрузить - закрываем всю программу
If PlName='Login' then SendMessage(ParentHandle, WM_DESTROY, 0,0); //FMain.Close;
end;
//Если плагин загружен, пытаемся найти функции и процедуры
if Plugin <> 0 then
try
@FamilyName := GetProcAddress(Plugin,'FamilyName');
@PluginName := GetProcAddress(Plugin,'PluginName');
@ExecuteModal := GetProcAddress(Plugin,'ExecuteModal');
except
ShowMessage ('Невозможно найти процедуры и функции плагина '+PluginFileName);
end;
//Если процедуры и функции найдены, проверяем его версию и принадлежность к программе
if Assigned(FamilyName) then
begin
if (FamilyName<>'TPMDocs') then
begin
Showmessage('Ошибка 01. Левый плагин '+PLName); //Плагин не принадлежит TPMDocs
UnloadPackage(Plugin);
If PlName='Login' then SendMessage(ParentHandle, WM_DESTROY, 0,0); //FMain.Close;
end;
end;
If Assigned(PluginName) then
begin
if (PluginName<>PlName) then
begin
Showmessage('Ошибка 02. Левый плагин '+PLName); //Имя плагина не соответствует имени файлв
UnloadPackage(Plugin);
If PlName='Login' then SendMessage(ParentHandle, WM_DESTROY, 0,0); //FMain.Close;
end;
end;
if Assigned(ExecuteModal) then
begin
ParentHandle:=H;
msgtochild:=txtmsg;
ExecuteModal;
end;
end;
end.
Вопрос - как в ExecuteModal передать параметр?
хотел сделать так: ExecuteModal(Par:string), но в DataModule не понятно где это параметр объявлять. В разделе type не понятно как объявить, там только TExecuteModal = procedure;
Как в модуле DataModule объявить процедуру с параметром? В самом модуле с этим проблем не возникло....
|