全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1584
推到 Plurk!
推到 Facebook!

視覺化元件的指令該怎麼封入dll

答題得分者是:jow
ithree
一般會員


發表:2
回覆:1
積分:0
註冊:2005-11-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-12-02 00:38:32 IP:218.168.xxx.xxx 未訂閱
我有一個可與word連結的DDE程式,如今想將這程式中的功能封入dll中,我想了兩種方法: 一是將這個程式中的四個procedure分封成四個dll,二是讓dll自己創出一個form,然後把這整個程式放入dll的form中。    可是我目前兩種方法都出了問題,第一種是在我的四個procedure中,有很多包含視覺化元件的指令,在沒有form先讓我放入那些元件的情況下, 一打到元件那邊就會出現錯誤訊息。比如有一個produre是:  
procedure TForm1.FormCreate(Sender: TObject);
begin
  if (not DdeClientConv1.SetLink('WinWord','C:\example.DOC')) then
  ShowMessage('Set Link Error');
  DdeClientItem1.DdeItem:='DDE_LINK';
  if (not DdeClientConv1.OpenLink) then
  ShowMessage('Open Link Error');
end;
 
照理說在DdeClientConv1後加上「.」後面就會出現指令讓我選擇,但卻是下面的訊息視窗出現「不能生成指令,由於有錯誤code」 所以我想了第二個方法,用Form1 := TForm1.Create(Application)這個指令,如此一來就有form,能在上面先放入視覺化元件,所以我在procedure之前,加上了
function GetDllForm: Boolean; stdcall;
begin
  result := false;
  Form1 := TForm1.Create(Application);
  try
    Form.ShowModal;
  finally
    Form.Free;
  end;
end;
 
可是不知道為什麼,我開啟dll精靈,到加入unit都ok,但當要編輯時,就會出現: [Error] UNDLL.pas(18): 'END' expected but 'VAR' found [Error] UNDLL.pas(30): Incompatible types: 'Integer' and 'Boolean' [Error] UNDLL.pas(33): Undeclared identifier: 'Form' [Error] UNDLL.pas(36): Missing operator or semicolon [Fatal Error] Project1.dpr(16): Could not compile used unit 'UNDLL.pas' 然後var Form1: TForm1;的var那行會出現紅色。 拉哩拉雜說了一堆,想請問的是, 在第一個方法中,有關視覺化元件的問題該如何解決? 因為我看到有關介紹dll寫法的範例文章中, 在function的宣告上,大多都沒有用到視覺化元件, 所以也無法從中去推敲。 第二個是由dll生成form,將整個程式封入dll的方法是否可行? 如果可行,那些procedure是要像mrOK的用法:
begin
  Form:=TForm1.Create(nil);
  if Form.ShowModal=mrOk then S:=PChar(Form.Edit1.Text)
                         else S:='';
 
將那些procedure插入生成form的函數中,還是可以有另外的寫法?
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-12-05 14:06:51 IP:220.130.xxx.xxx 未訂閱
library Project2;    uses
  SysUtils,
  Classes,
  Forms,
  Unit2 in 'Unit2.pas' {Form2};      function GetDllForm(AOwner: TComponent): TForm2; stdcall;
  begin
    Result := TForm2.Create(AOwner);
  end;    exports
  GetDllForm;    begin
end.    //---------------------
unit Unit2;    interface    uses
  Windows, Classes, Controls, StdCtrls, Buttons, Forms;    type
  TForm2 = class(TForm)
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    procedure FormCreate(Sender: TObject);
  end;    implementation    {$R *.dfm}    procedure TForm2.FormCreate(Sender: TObject);
begin
  BitBtn1.Kind := bkOk;
  BitBtn2.Kind := bkCancel;
end;    //-----------------------
unit Unit1;    interface    uses
  Windows, Controls, StdCtrls, Classes, Dialogs, Forms, unit2;    type      TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;      function GetDllForm(AOwner: TComponent): TForm2; stdcall; external 'Project2.dll';    var
  Form1: TForm1;    implementation    {$R *.dfm}    procedure TForm1.Button1Click(Sender: TObject);
begin
  with GetDllForm(Self) do
  try
    if ShowModal = mrOk then
      ShowMessage('Show some message');
  finally
    Free;
  end;
end;    
系統時間:2024-05-17 13:27:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!