Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизФормы в 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 1.962 c