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

請教函數調用的問題

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


發表:4
回覆:5
積分:1
註冊:2007-10-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-11-11 13:50:26 IP:58.217.xxx.xxx 訂閱
在下有一程式,其中在Public中定義了如下程序:
Image1Start(Sender);
Image2Start(Sender);
Image3Start(Sender);
有沒有類似于 TImage(Sender)Start(Sender)的方法可以控制他們呢?
謝謝各位高手了。。。
jow
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-11-11 20:51:10 IP:123.193.xxx.xxx 訂閱
提問引述不清, Start()並不屬於TImage定義的方法或事件,
所以下列的程式碼以OnClick的事件處理程序, 說明如何判斷
所傳入的Sender

[code delphi]
unit fMain;

interface

uses
Classes, Forms, Dialogs, ExtCtrls, StdCtrls, Controls;

type
TForm1 = class(TForm)
Image1: TImage;
Image2: TImage;
Image3: TImage;
Label1: TLabel;
Label2: TLabel;
procedure Image1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
public
end;

var
Form1: TForm1;

implementation

uses SysUtils;

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

//讓三個TImage使用同一個OnClick的Event Handler
Image1.OnClick:= Image1Click;
Image2.OnClick:= Image1Click;
Image3.OnClick:= Image1Click;

//指定Tag, 以供後續程式判斷
Image1.Tag := 100;
Image2.Tag := 200;
Image3.Tag := 300;
end;

procedure TForm1.Image1Click(Sender: TObject);
var
T: Integer;
begin
//
if Sender is TImage then //限定Sender型態
begin
if Sender = Image1 then Label1.Caption := 'Image1 Clicked'
else if Sender = Image2 then Label1.Caption := 'Image2 Clicked'
else if Sender = Image3 then Label1.Caption := 'Image3 Clicked'
else Label1.Caption := TImage(Sender).Name ' Clicked';
end;
//
if Sender is TImage then
begin
T := TComponent(Sender).Tag;
case T of
100: Label2.Caption := 'Image1 Clicked';
200: Label2.Caption := 'Image2 Clicked';
300: Label2.Caption := 'Image3 Clicked';
else Label2.Caption := 'Sender with Tag=' IntToStr(T) ' Clicked';
end;
end;

end;
end.
[/code]

===================引 用 spiritboy11750 文 章===================
在下有一程式,其中在Public中定義了如下程序:
Image1Start(Sender);
Image2Start(Sender);
Image3Start(Sender);
有沒有類似于 TImage(Sender)Start(Sender)的方法可以控制他們呢?
謝謝各位高手了。。。
編輯記錄
jow 重新編輯於 2007-11-11 20:51:49, 註解 無‧
jow 重新編輯於 2007-11-11 20:52:55, 註解 無‧
jow 重新編輯於 2007-11-11 20:54:03, 註解 無‧
spiritboy11750
一般會員


發表:4
回覆:5
積分:1
註冊:2007-10-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-11-11 23:46:28 IP:58.213.xxx.xxx 訂閱
  呵呵,也許是我的表述不清楚,問題是這樣的。。。
例如:有3個Image(image1,image2,image3),他們點擊事件都指向image1OnClick,處理一些共同事項。
另外我在Public中的設計了Image1Start(Sender);
Image2Start(Sender);
Image3Start(Sender);
這3個函數會在image1OnClick中根據TImage(Sender).Name來進行相對應的調用。即:點擊image3,即觸發image1OnClick,在image1OnClick中檢測TImage(Sender).Name:=Image3再調用Image3Start(Sender);
當然,可以用case 來做,可是我想問能否有一種寫法:可以自動將image的名字加載到Start(Sender)前,並調用這個函數?該怎麽寫呢。。。
謝謝各位高手了。
編輯記錄
spiritboy11750 重新編輯於 2007-11-11 23:47:38, 註解 無‧
spiritboy11750 重新編輯於 2007-11-11 23:50:25, 註解 無‧
spiritboy11750 重新編輯於 2007-11-11 23:52:03, 註解 無‧
jow
尊榮會員


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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-11-12 01:58:36 IP:123.193.xxx.xxx 訂閱
如果我沒看錯, 你要的是Name來產生一個function name,
然後以此function name去執行事先宣告並定義好的function???

以下建議幾個想法:

(1)你可以透過RTTI去query TForm1(目前定義的form)有沒有定義
與你要找的function name相同名稱的method,然後看有沒有辦法
引用它?

(2)以繼承方式, 將Start() 宣告成 virtual; abstract; 然後在繼承改寫成
三種形態的TImage物件, 之後在程式裡可以用它的base class直接引用
Start(), 這樣就能自動根據產生時所用的型別, 執行各自改寫的Start()實作
程式碼.

(3)將Start()以介面的形式宣告, 然後以class來實作它, 依據介面的規格,
你可以去query某個class是否有實作該介面, 然後引用它. 只是TForm在
某部分屬於VCL實作的一部分, 並且牽涉的Designer的互動關係, 以它來
實作介面, 這一點我倒是沒試過...

(4)預先建置好以名稱來索引function的機制, 建立 "類Method Table",
它是可以用名稱來搜尋並引用的.

(5)另外你的XXXStart(Sender), 既然已經有將Sender傳入, 如果處理的動作
差異不大, 例如根據所傳入物件來載入不同圖檔, 那麼以同一個function來處
理就可以了, 唯一要做的是判斷出Sender所代表的物件.


個人建議僅供參考...

===================引 用 spiritboy11750 文 章===================
呵呵,也許是我的表述不清楚,問題是這樣的。。。
例如:有3個Image(image1,image2,image3),他們點擊事件都指向image1OnClick,處理一些共同事項。
另外我在Public中的設計了Image1Start(Sender);
Image2Start(Sender);
Image3Start(Sender);
這3個函數會在image1OnClick中根據TImage(Sender).Name來進行相對應的調用。即:點擊image3,即觸發image1OnClick,在image1OnClick中檢測TImage(Sender).Name:=Image3再調用Image3Start(Sender);
當然,可以用case 來做,可是我想問能否有一種寫法:可以自動將image的名字加載到Start(Sender)前,並調用這個函數?該怎麽寫呢。。。
謝謝各位高手了。
編輯記錄
jow 重新編輯於 2007-11-12 02:00:50, 註解 無‧
spiritboy11750
一般會員


發表:4
回覆:5
積分:1
註冊:2007-10-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-11-12 10:32:46 IP:121.229.xxx.xxx 訂閱
謝謝您的回復,您的建議給我很多啓示,我還還要細細琢磨一下。
P.D.
版主


發表:571
回覆:3888
積分:3677
註冊:2006-10-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2007-11-12 13:44:24 IP:61.67.xxx.xxx 未訂閱
可能你將目標定的太高, 除非你們老師要求要這樣做或想做學術研究, 要不請用另一種思考方法, 或許我們寫程式已久, 完成目標是第一優先, 技巧技術是其次, 所以既然你都指向同一個事件, 何不只做一個ImageStart(ImageName: string) 的function, 然後三個Image的onclick都指向 ImageStart('Imagename') 就好了, 在 ImageStart中用你最熟悉的 if 或 case 來判斷, 反正你也是有三支function處理, 與整合在一支並沒有差多少, 試試看吧!
編輯記錄
P.D. 重新編輯於 2007-11-12 13:45:29, 註解 無‧
P.D. 重新編輯於 2007-11-12 13:46:24, 註解 無‧
spiritboy11750
一般會員


發表:4
回覆:5
積分:1
註冊:2007-10-18

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-11-12 16:36:08 IP:58.217.xxx.xxx 訂閱
謝謝jow,把你的建議和同事們做了交流,他們已經有新的想法了。
謝謝P.D,換個角度看這個問題,果然是很簡單。謝謝了。
問題已解決,結帖。

P.S:其實,如上兩位都解答在下的問題,可是好像只能給一個人分。所以給了jow。
委屈BZ了,呵呵。。。問一下,可以兩個人都給分麽?
編輯記錄
spiritboy11750 重新編輯於 2007-11-12 16:36:44, 註解 無‧
spiritboy11750 重新編輯於 2007-11-12 16:42:20, 註解 無‧
P.D.
版主


發表:571
回覆:3888
積分:3677
註冊:2006-10-31

發送簡訊給我
#8 引用回覆 回覆 發表時間:2007-11-12 21:50:25 IP:61.67.xxx.xxx 未訂閱
沒關係, 分數對我來說又不能換獎金, 只是希望把多年的經驗交棒下去就好了!
系統時間:2017-12-15 6:48:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!