Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1085129195
AngelSAI
2004-05-21 12:46
2004.06.06
Экспорт текста из Microsoft Word в StringGrid.


9-1076104531
Budy
2004-02-07 00:55
2004.06.06
Я про игры!


1-1085546834
Анатолий
2004-05-26 08:47
2004.06.06
Блокирование файлов как винда блокирует некоторые свои


14-1084861551
anstrem
2004-05-18 10:25
2004.06.06
Есть место для программиста Delphi в Москве


14-1084798394
Kerk
2004-05-17 16:53
2004.06.06
Запуздырить иконку в трей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский