| 
				  
 Решил не создавать новую тему, проблема тоже с передачей параметра в функцию. Задача такая: 
Есть 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 объявить процедуру с параметром? В самом модуле с этим проблем не возникло....
			
			
			
			
				  |