Показать сообщение отдельно
  #11  
Старый 05.09.2012, 11:03
sorockinalex sorockinalex вне форума
Начинающий
 
Регистрация: 08.08.2012
Сообщения: 178
Репутация: 10
По умолчанию

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