線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1529
推到 Plurk!
推到 Facebook!

在自訂的procedure裡動態產生元件的問題

答題得分者是:pedro
showdino
一般會員


發表:3
回覆:3
積分:1
註冊:2006-08-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-03 15:01:12 IP:220.140.xxx.xxx 訂閱

請問在自訂的procedure裡動態產生IdFTP這個元件時,在Create(Owner)這部份一直會出錯,該uses的都沒少

但它就是一直不會過,但如果改成Create(nil)那就可以了,請問這是為什麼呢?那改成Create(nil)又是什麼意思?

這個問題困擾我很久了,希望各位Delphi的高手能給予解惑?謝謝~

procedure FTP(ip,use,pas,path : string);
var PF : TIdFTP;
begin
PF := TIdFTP.Create(Owner);
PF.Host := ip;
PF.Username := use;
PF.Password := pas;
PF.Connect(True);
end;

錯誤訊息:

[Error] Unit1.pas(28): Undeclared identifier: 'Owner'

[Fatal Error] Project2.dpr(5): Could not compile used unit 'Unit1.pas'

pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-04 08:46:48 IP:60.248.xxx.xxx 未訂閱

TIdFTP應建立在像TForm的container,所以procedure需多一個參數

procedure FTP(ip,use,pas,path : string;Owner:TForm);
var PF : TIdFTP;
begin
PF := TIdFTP.Create(Owner);

......
end;

showdino
一般會員


發表:3
回覆:3
積分:1
註冊:2006-08-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-08-04 12:27:02 IP:61.225.xxx.xxx 訂閱

===================引 用 文 章===================

TIdFTP應建立在像TForm的container,所以procedure需多一個參數

procedure FTP(ip,use,pas,path : string;Owner:TForm);
var PF : TIdFTP;
begin
PF := TIdFTP.Create(Owner);

......
end;

請問如果說多一個參數,那在呼叫時也需要多一個參數嗎?因為我加上Owner:Tform之後在呼叫時就會出現問題了!

而如果是Create(nil)那這是什麼意思呢?因為必須用到,所以急需知道它是什麼意思和它的用途!希望各位Delphi高手

能夠解答,十分感謝!

pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-08-04 17:20:05 IP:60.248.xxx.xxx 未訂閱

您可以去看看TIdFTP.Create宣告的原型

constructor Create(AOwner: TComponent); override;

大意上是要建立在TComponent類的容器上,若您使用nil為建立,那麼,TIdFTP在程式結束時並不會被釋放掉,最好是傳遞給它擁有者像TForm或TPanel等容器元件

showdino
一般會員


發表:3
回覆:3
積分:1
註冊:2006-08-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-08-04 19:04:47 IP:61.225.xxx.xxx 訂閱

真的很感謝您的解答,現在還有最後一個疑問就是,我在呼叫procedure時需要再加上什麼參數嗎?

因為照原本的呼叫它會有錯誤!感謝您的解答!

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, FTPClient;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
FTP(Edit1.Text,Edit2.Text,Edit3.Text,Edit4.Text)
end;

錯誤訊息如下:

[Error] Unit1.pas(32): Not enough actual parameters

[Fatal Error] Project2.dpr(5): Could not compile used unit 'Unit1.pas'

pedro
尊榮會員


發表:152
回覆:1187
積分:892
註冊:2002-06-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-08-04 21:52:47 IP:61.217.xxx.xxx 未訂閱

傳入Self

procedure TForm1.Button1Click(Sender: TObject);
begin
FTP(Edit1.Text,Edit2.Text,Edit3.Text,Edit4.Text,Self)
end;

此時,self指的是TForm1物件本身,因為Button1Click是屬於TForm1的事件

showdino
一般會員


發表:3
回覆:3
積分:1
註冊:2006-08-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-08-04 23:33:42 IP:218.163.xxx.xxx 訂閱

真的很感謝您解答了我這些多問題,讓我學到很多,但是我還是有一個疑問,如果我是寫成unit的話,那我呼叫時該傳入哪呢?

我如果還是傳入self 的話,那它就會出錯了,那這時我應該傳入哪呢?又該寫什麼參數呢?

我的unit名稱是FTPClient,而unit裡的procedure名稱是FTP,我試了好久,寫成FTPClient也不對,而寫FTP也不對,

那應該寫什麼才好呢?

感謝您的解答!

系統時間:2024-05-17 15:27:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!