Главная страница
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.035 c
3-1084453545
Masa
2004-05-13 17:05
2004.06.06
Кодировка в BDE


14-1085224655
Jel
2004-05-22 15:17
2004.06.06
Подскажите софт для редактирования mp3 без преобразования в wav


3-1084721913
Алексей Петухов
2004-05-16 19:38
2004.06.06
Картинки в БД


14-1085222466
Vlad
2004-05-22 14:41
2004.06.06
Тейксер и Пачеко


4-1082798392
BVictor
2004-04-24 13:19
2004.06.06
Смена разрешения