Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

Формы в DLL   Найти похожие ветки 

 
Alex Friend ©   (2004-05-23 23:31) [0]

Проблема:
написал DLL, в которой присутствует форма. Хочу показать ее модально. При использованиии этой DLL из приложений Delphi все нормально. При вызове формы из VBA (Visual Basic for Application) наблюдаются глюки. Что делать?
Спасибо.

Сама DLL:


library LibraryN;
uses
 ShareMem,
 SysUtils,
 Classes,
 Unit1 in "Unit1.pas" {DLLForm};
{$R *.res}
exports
ShowModalForm, FreeForm;
begin
end.


Форма:


unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons, ExtCtrls, MPlayer;
type
 TDLLForm = class(TForm)
   BitBtn1: TBitBtn;
   BitBtn2: TBitBtn;
   Panel1: TPanel;
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure BitBtn1Click(Sender: TObject);
   procedure BitBtn2Click(Sender: TObject);
 private
   { Private declarations }
   CallForm: THandle; //Дескриптор вызывающей формы
 public
   { Public declarations }
 end;
function ShowModalForm(path:string): Integer;
//procedure ShowForm(aHandle: THandle); external;
procedure FreeForm;
var
 DLLForm: TDLLForm;
implementation
{$R *.dfm}
function ShowModalForm(path:string): Integer;
// Модальный вызов
begin
   DLLForm := TDllForm.Create(Application);
//    DLLForm.MediaPlayer1.FileName:= path;
   Result := DLLForm.ShowModal;
   DLLForm.Free;
end;

procedure ShowForm(Appl, Form: THandle);
// Немодальный вызов
begin
Application.Handle := Appl; // Замена объекта
DllForm := TDllForm.Create(Application);
// Запоминаем дескриптор вызывающего окна для посылки
// ему сообщения о закрытии
CallForm := Form;
DLLForm.Show
end;

procedure FreeForm;
// Уничтожение формы
begin
DLLForm.Free
end;

procedure TDLLForm.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   if CallForm>0 then
      SendMessage(CallForm, wm_User, 0, 0)
end;
end;


Вызов:

unit Unit1;
interface
uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, Buttons;
type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Label1: TLabel;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   procedure WMUser(var Msg: TMessage);
   message WM_USER;
 end;
var
 Form1: TForm1;
implementation
{$R *.dfm}

function ShowModalForm(path: string): Integer; External "LibraryN";
procedure FreeForm; External "LibraryN";

procedure TForm1.Button1Click(Sender: TObject);
begin
//Button2.Enabled := False;
label1.Caption := "ModalResult = "+IntToStr(ShowModalForm("D:\Documents\Диплом\Video\Range.avi"));
label1.Show; // Показываем результат вызова
//Button2.Enabled := True
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  FreeForm;
end;

procedure TForm1.WMUser(var Msg: TMessage) ;
// Сообщение из формы DLL о ее закрытии
begin
   Button2.Click;
end;
end.


 
Cobalt ©   (2004-05-24 01:02) [1]

Покажи, как вызываешь из VBA.


 
Alex Friend ©   (2004-05-24 01:53) [2]

Описание:

Private Declare Function ShowModalForm Lib "D:\Sample\App\LibraryN.dll" (ByVal path As String) As Integer


Вызов

ShowModalForm "D:\Documents\Диплом\Video\Range.avi"


 
Cobalt ©   (2004-05-24 09:22) [3]

Да, и какого рода глюки?
P.S. рекомендую - FreeAndNil


 
Alex Friend ©   (2004-05-24 13:04) [4]

Глюк такой:
при вызове пустой формы из Excel она предяъвляется на экран, а при закрытии VBA говорит, что "Bad DLL calling convention"
Если же на форме присутствует компонент MediaPlayer, то форма вообще не показывается на экране.


 
Mim1 ©   (2004-05-24 13:28) [5]

отображайте форму методом showmodal тогда она будет дйствительно модальной. И прибивать ее можно сразу после вызова этого метода.


 
sniknik ©   (2004-05-24 13:49) [6]

а ShareMem в VBA такой же как в дельфях разве?
и вызовы тоже паскалевские? stdcall не нужен?
чегото сомнительно. (но точно не знаю, VBA даже не открывал ни разу, только на дисках название видел ;о))



Страницы: 1 вся ветка

Текущий архив: 2004.06.06;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.053 c
1-1085133521
man
2004-05-21 13:58
2004.06.06
TDateTimePicker


1-1085517113
Jih
2004-05-26 00:31
2004.06.06
Глюки Делфей


14-1085189750
Думкин
2004-05-22 05:35
2004.06.06
С днем рождения! 22 мая


14-1084635145
SPeller
2004-05-15 19:32
2004.06.06
PE Viewer 1.11


3-1084528367
exe
2004-05-14 13:52
2004.06.06
Аналог IBExperta