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

請教關於static member

 
peipei36
一般會員


發表:8
回覆:51
積分:16
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-04-13 18:24:35 IP:61.59.xxx.xxx 未訂閱
請教大家... Delphi有class function,那它有沒有class 層級的變數(不必Create物件) 或者,可以用什麼樣的方式模擬..達到類似static變數的功能?! 謝謝大家!!
lee
站長


發表:55
回覆:173
積分:45
註冊:2002-02-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-04-14 10:42:43 IP:61.219.xxx.xxx 未訂閱
引言: 請教大家... Delphi有class function,那它有沒有class 層級的變數(不必Create物件) 或者,可以用什麼樣的方式模擬..達到類似static變數的功能?! 謝謝大家!!
我想應該是沒有的,因為Class用來定義物件,它只是一個記憶體的指標(Addressing Pointer),必需經由Create方法來配製一塊記憶體,它與變數是不同的,若不須採用物件的繼承..等屬性就用record來定義static變數吧! ~~~Delphi K.Top網站總管~~~
------
~~~Delphi K.Top網站總管~~~
ccchen
版主


發表:61
回覆:940
積分:1394
註冊:2002-04-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-04-15 08:39:26 IP:163.29.xxx.xxx 未訂閱
引言: 請教大家... Delphi有class function,那它有沒有class 層級的變數(不必Create物件) 或者,可以用什麼樣的方式模擬..達到類似static變數的功能?! 謝謝大家!!
直接使用Class Function 傳回值應該就可達到你要的目的 例如TObject.className 我常用一Class Function 傳回對此Class之描述, 如此不須Create即可了解此一Class Base Class可宣告為Virtual以便override
cubi
初階會員


發表:56
回覆:94
積分:35
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-04-15 09:30:51 IP:61.218.xxx.xxx 未訂閱
引言:
引言: 請教大家... Delphi有class function,那它有沒有class 層級的變數(不必Create物件) 或者,可以用什麼樣的方式模擬..達到類似static變數的功能?! 謝謝大家!!
直接使用Class Function 傳回值應該就可達到你要的目的 例如TObject.className 我常用一Class Function 傳回對此Class之描述, 如此不須Create即可了解此一Class Base Class可宣告為Virtual以便override
請教前輩: Class Funtion 到底是什麼呢??小弟愚昧一直搞不清楚,可否請前輩 指導,謝謝
peipei36
一般會員


發表:8
回覆:51
積分:16
註冊:2002-03-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-04-15 15:09:54 IP:211.74.xxx.xxx 未訂閱
ccchen sir~ 感謝您的說明,但是這樣的做法資料該記錄在哪呢?! 我指的類似原來的class內欄位的部份?! 不知能否請您舉個簡單的code例子...好想學這招...thx~ 另外,cubi sir~ class function 有點類似我們平常在用的公用函數, 可以不必建物件直接呼叫使用,寫法與class一般的成員函數相同, 只是在宣告、定義前都加上'class'(即class function fun1..).. 例如:呼叫 ClassA.fun1,而不必 obja := ClassA.Create;後再使用obja.fun1.. 大概是這樣子...
天外來客
初階會員


發表:22
回覆:199
積分:44
註冊:2001-11-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-04-17 08:23:23 IP:163.29.xxx.xxx 未訂閱
引言: ccchen sir~ 感謝您的說明,但是這樣的做法資料該記錄在哪呢?! 我指的類似原來的class內欄位的部份?! 不知能否請您舉個簡單的code例子...好想學這招...thx~ 另外,cubi sir~ class function 有點類似我們平常在用的公用函數, 可以不必建物件直接呼叫使用,寫法與class一般的成員函數相同, 只是在宣告、定義前都加上'class'(即class function fun1..).. 例如:呼叫 ClassA.fun1,而不必 obja := ClassA.Create;後再使用obja.fun1.. 大概是這樣子...
以下是我製作Tutorial時之程式片斷, 提供參考
1. rbBase.pas (宣告Base Class及Class function)
type
  TfmrbBase = class(TForm)
    ...
  public
    class function GetDescpt:string; virtual; abstract;
  end;    2. unit T01.pas(第一個Child)
type
  Tfm01 = class(TfmrbBase)
    ..
  public
    class function GetDescpt:string; override;
    { Public declarations }
  end;    implementation
{$R *.dfm}
class function Tfm01.GetDescpt: string;
begin
  Result:='直接使用ppDataPipeline連接DataSource 之簡單Report';
end;    3. unit T02.pas(第二個Child)
type
  Tfm01 = class(TfmrbBase)
    ..
  public
    class function GetDescpt:string; override;
    { Public declarations }
  end;    implementation
{$R *.dfm}
class function Tfm02.GetDescpt: string;
begin
  Result:='使用ppReport之內部Pipeline連接資料庫';
end;    4. main.pas--FormCreate時先建立List, User選擇時, Show所選CLass之Descpt 
...
uses rbBase,t01,t02;    {$R *.dfm}    procedure TfmMain.FormCreate(Sender: TObject);
begin
  ListBox1.items.AddObject('01 Simple Report',TObject(Tfm01));
  ListBox1.items.AddObject('02 使用內部PipeLine',TObject(Tfm02));
end;    procedure TfmMain.ListBox1Click(Sender: TObject);
var
  id:integer;
  fmclass:TrbClass;
begin
  id:=ListBox1.itemindex;
  if id >=0 then begin
    fmclass := TrbClass(Listbox1.Items.Objects[id]);
    Memo1.lines.clear;
    memo1.lines.add(fmclass.GetDescpt);  //呼叫Class Function取得字串
  end;
end;
優良文章
peipei36
一般會員


發表:8
回覆:51
積分:16
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-04-17 13:30:53 IP:211.74.xxx.xxx 未訂閱
感謝您回應,但是我仍有些不解...可否請大家幫忙.. 您的code感覺是單純class function的運用.. 但是一般其他語言所謂的static member欄位的部份, 比較像我們非OO的全域變數,也就是說, 如果用class function處理時,希望它在class function結束後, 能將運算的結果,存放在某一個「非區域的變數」, 但這個非區域的變數,覺得若去定義、使用全域變數,破壞class架構.. 例如,我在系統進入時,取得了目前系統的曆制,這個變數若不使用全域變數, 又不想建立物件,就比較像一般其他語言的static特性... 不知這樣的表達方式,會不會很清楚?!先感謝大家的幫忙!! ===像這樣的「感覺」====
  class1=class
    public
      class Var1:string;
  end;
  //使用時 採用類似 class1.Var1 := 'xxx'; ShowMessage(class1.Var1);
天外來客
初階會員


發表:22
回覆:199
積分:44
註冊:2001-11-27

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-04-18 10:01:09 IP:163.29.xxx.xxx 未訂閱
我了解你的問題, 不過Delphi是很明確無Static Data Member(Document中有明述),因此必須用替代方法. 1. 前所述是假設你只要Const, 故可用Class Funcion 取代. 2. Document中建議之方法是用Unit Level之變數
peipei36
一般會員


發表:8
回覆:51
積分:16
註冊:2002-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-04-19 00:43:41 IP:61.59.xxx.xxx 未訂閱
原來如此!!非常感謝您的熱心幫忙!!thx~
系統時間:2017-12-11 19:04:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!