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

利用module作全域變數方便管理的好方法?

缺席
skyline_no1
一般會員


發表:9
回覆:7
積分:3
註冊:2006-07-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-07-26 13:54:33 IP:211.20.xxx.xxx 未訂閱

請教了解使用module的高手:

由於利用全域變數容易導致維護.管理不易,但是又因為一些比較大的專案,或是牽扯很多數學

運算的時候,還是必須要用到,因此小第一直想尋找很多FORM或UNIT共享變數的好作法,

最近在網路上找到有人提供的好方法, 如下網址所示,裡面的Gary W. Lee 所發表的...

但由於小弟才疏學淺,而且也很少看到module的作法,還是無法了解使用方式

,請問各位高手有人有使用該方法嗎?可否教導一下建立方式呢?

http://groups.google.com.tw/group/tw.bbs.comp.language/browse_thread/thread/b6002b3132321a91/b113103dfbb0e635#b113103dfbb0e635

感激不盡!

richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-07-26 15:43:05 IP:211.76.xxx.xxx 未訂閱

skyline_no1 您好:

提供個人的使用方法請參考!

因為不熟悉新系統的檔案上傳方式,所以原始碼請至發表區下載,不好意思!

File: Parameter.cpp

// 宣告所有的全域共享變數

int gTotalValue=0;
float gAverage;
int gInput=0;

//===========================

File: Parameter.hpp

// 讓需要使用全域共享變數的程式能引用它們,並避免同一檔案中重複載入。

#ifndef My_Parameter

#define My_Parameter
extern int gTotalValue;
extern float gAverage;
extern int gInput;

#endif


aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-07-26 18:43:25 IP:61.229.xxx.xxx 未訂閱

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

最近在網路上找到有人提供的好方法, 如下網址所示,裡面的Gary W. Lee 所發表的...

但由於小弟才疏學淺,而且也很少看到module的作法,還是無法了解使用方式

,請問各位高手有人有使用該方法嗎?可否教導一下建立方式呢?

http://groups.google.com.tw/group/tw.bbs.comp.language/browse_thread/thread/b6002b3132321a91/b113103dfbb0e635#b113103dfbb0e635

你好,Garry W. Lee 所用的處理global變量的方式並非標準且完美的。但,看了他寫的東西後,我還是幫你在細說一下他的意思。在bcb中。有個叫data module的元件 ( file->new->data module),這個元件像是個container,可放入許多的「非視覺元件」到裡面。而bcb預設會在你加入這個元件後幫你建立二段程式碼: 1/ 為你在程式一跑的時候建立此這個module的實體(instance) 於projcet上有.USEFORM("Unit2.cpp", DataModule1); 2/ 會在這個moule的CPP上建立TDataModule1 *DataModule1; 還有在該header上有extern PACKAGE TDataModule1 *DataModule1;

上面那二個動作意義很重要。請記注。接下來說一下實作 : 1 拉一個data module,2 在此class上的public上可以放入你自己的變量(最好是放在private上,然後加入get/set的方法,或者用property來實現,但這都比較難,在此為了解說方便就放在public上),比如說放一個變量叫 int count;

class TDataModule1 : public TDataModule
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TDataModule1(TComponent* Owner);
int count; //自己加入
};

在你的form上加入一個button,然後如何存取count變量呢? 先include這個module的header進這個form的unit上,比如說: #include "Unit2.h" 然後在button的處理funcion上寫上:

DataModule1->count = 1; //這就是讀取該變量的方式
ShowMessage(String(DataModule1->count)); // 這是取出的方式

當然,你也可以在裡面放入一些非視覺的元件,那就可以用
DataModule1->你的元件->性質或方法

然而事實上data module並非是最佳的處理global variables的方法。因為記得我最上面說的二個重要動作嗎? 若這個module不是只被初始化一次,那就失去了global的意義了。因為第二個instance的資料內容和第一個instance的資料內容是獨立的! 為了避開被建立好幾個instance而失去了封裝的意義,正統的做法是自己創一個static class,所謂的static的class就是沒法讓你產生instance的class,這樣就可以避開剛的問題。如比說: (bcb developer guide 上的例子)

class Global
{
private:
static int Number;
static double Average;

//PRIVATE CONSTRUCTOR
Global(); //not implemented, instantiation not possible

public:
// SETTERS
static void setNumber(int NewNumber) { Number = NewNumber; }
static void setAverage(double NewAverage) { Average = NewAverage; }

// GETTERS
static int getNumber() { return Number; }
static double getAverage() { return Average; }
};

存取時就用Global::getNumber() and Global::setNumber(). 之類的…

結論: 用datamodule的方式是很有效率的,很可以偷懶的,但要記得只能create一次instance,並讓該instance成為global variable供大家使用。常常要僅記在心。若不想僅記在心…為了完美,為了程式可能由多人來寫,可以選用static class的方式。

附註. 為什麼要用class的方式來封裝global變量? 傳統的c語言通常都是一global變量放在一個global namespace裡,那麼久了這個space的變量極可能產生衝突。所以才用class來封存,避開全用global space所產生的side effect。

蕭沖 qs.xiao@gmail.com

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
skyline_no1
一般會員


發表:9
回覆:7
積分:3
註冊:2006-07-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-07-27 11:00:45 IP:211.20.xxx.xxx 未訂閱

看來還有別的超強方法呢

我要花一些時間消化~~~

謝謝大大囉~~感激

skyline_no1
一般會員


發表:9
回覆:7
積分:3
註冊:2006-07-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-07-28 11:28:31 IP:211.20.xxx.xxx 未訂閱

請問這兩種是否都不可使用視覺元件?

那WIN API呢?

譬如說我要控制RS232, 寫入 HANDLE ghComm;

好像存取會有問題呢...

class TDataModule2 : public TDataModule
{
__published: // IDE-managed Components
private: // User declarations
public: // User declarations
__fastcall TDataModule2(TComponent* Owner);
int iCount;
HANDLE ghComm;
};

skyline_no1
一般會員


發表:9
回覆:7
積分:3
註冊:2006-07-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-07-28 12:11:55 IP:211.20.xxx.xxx 未訂閱

Sorry

我已經搞定了,我是笨蛋

看來我需要一點耐心

謝謝大大的協助,尤其是講解觀念的問題喔

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