視覺化元件的指令該怎麼封入dll |
答題得分者是:jow
|
ithree
一般會員 發表:2 回覆:1 積分:0 註冊:2005-11-02 發送簡訊給我 |
我有一個可與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 發送簡訊給我 |
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; |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |