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

Delphi 有沒有像java中的java.util.Stack()去new

尚未結案
syene
一般會員


發表:17
回覆:12
積分:5
註冊:2003-01-04

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-25 00:52:12 IP:220.138.xxx.xxx 未訂閱
不想自己去type一個stack class, 因為如果是這樣, 勢必要先type出你的pointer只到的資料型態是啥, 有沒有現成的可以去createㄋ, 類似java.util.Stack(), 而且不用先宣告要push的資料型態, 就可push任意資料型態的資料進去, 這些資料物件也好,record也罷,或是pascal的基本資料型態也行, 當然同一stack instance只能拿來push同一類資料型態的資料, 總之就是有一個現成內建的class可供create, 然後拿它來push應用程式中的資料. tkx
jamests
初階會員


發表:0
回覆:43
積分:28
註冊:2005-01-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-25 16:02:05 IP:211.75.xxx.xxx 未訂閱
您好: Delphi有提供TStack (uses Contnrs). 吃的是point型態. 不知道是不是您在找的. 希望有所幫助, 供參考.
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-26 13:27:21 IP:219.134.xxx.xxx 未訂閱
引言: 不想自己去type一個stack class, 因為如果是這樣, 勢必要先type出你的pointer只到的資料型態是啥, 有沒有現成的可以去createㄋ, 類似java.util.Stack(), 而且不用先宣告要push的資料型態, 就可push任意資料型態的資料進去, 這些資料物件也好,record也罷,或是pascal的基本資料型態也行, 當然同一stack instance只能拿來push同一類資料型態的資料, 總之就是有一個現成內建的class可供create, 然後拿它來push應用程式中的資料. tkx
自己做一个也不难。大概代码如下:
TMyStack=class
private
  FList:TList;
  FClass:TClass;
public
  Contructor Create(WhichClass:TClass);
  Destructor Destroy;override;
  procedure Push(AObj:TObject);
  function Pop:TObject;
published
end;    
大概就是类似上面这样的代码吧。其中:FClass用来限制当前对象的实例究竟是用来放什么类型的对象的,比如,是放TButton还是放TLabel。当然也可以不要这个,直接允许放Pointer,什么类型都可以同时放进去。 实际上放进去的东西,是放到FList这个TList里去了。PUSHU的时候就用TList.Add把它加到FList最尾的地方。POP的时候就从FList最尾的地方取出来:FClass(Result:=FList[FList.Count-1]); 这样就是一个标准的后进先出的Stack了。
syene
一般會員


發表:17
回覆:12
積分:5
註冊:2003-01-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-26 23:40:03 IP:220.138.xxx.xxx 未訂閱
引言:
引言: 不想自己去type一個stack class, 因為如果是這樣, 勢必要先type出你的pointer只到的資料型態是啥, 有沒有現成的可以去createㄋ, 類似java.util.Stack(), 而且不用先宣告要push的資料型態, 就可push任意資料型態的資料進去, 這些資料物件也好,record也罷,或是pascal的基本資料型態也行, 當然同一stack instance只能拿來push同一類資料型態的資料, 總之就是有一個現成內建的class可供create, 然後拿它來push應用程式中的資料. tkx
自己做一个也不难。大概代码如下:
TMyStack=class
private
  FList:TList;
  FClass:TClass;
public
  Contructor Create(WhichClass:TClass);
  Destructor Destroy;override;
  procedure Push(AObj:TObject);
  function Pop:TObject;
published
end;    
大概就是类似上面这样的代码吧。其中:FClass用来限制当前对象的实例究竟是用来放什么类型的对象的,比如,是放TButton还是放TLabel。当然也可以不要这个,直接允许放Pointer,什么类型都可以同时放进去。 实际上放进去的东西,是放到FList这个TList里去了。PUSHU的时候就用TList.Add把它加到FList最尾的地方。POP的时候就从FList最尾的地方取出来:FClass(Result:=FList[FList.Count-1]); 这样就是一个标准的后进先出的Stack了。
感謝jamests ,pcplayer99兩位先知的寶貴意見, 我已經大慨有頭緒了, 不過我也試了jamests所提供的TStack (uses Contnrs), 發現再pop時有無法掌握該物件的成員資料, 以下是我用delphi的TStack (uses Contnrs)所code的內容, resourcestring Form_Title='Stack operation: Items = %d'; var Stack:TObjectStack; element:TElement; {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Caption:=Format(Form_Title,[0]); Stack:=TObjectStack.Create; element:=TElement.Create; Memo1.Lines.Clear; end; procedure TForm1.FormDestroy(Sender: TObject); begin Stack.Free; element.Free; end; procedure TForm1.Button1Click(Sender: TObject); begin if Edit1.Text<>'' then begin element.name:=Edit1.Text; Stack.Push(element); Memo1.Lines.Add(TElement(Stack.Peek).name); Caption:=Format(Form_Title,[Stack.Count]); Button3Click(nil); end; Edit1.SetFocus; end; procedure TForm1.Button2Click(Sender: TObject); begin if Stack.Count>0 then begin Label1.Caption:=TElement(Stack.Pop).name; Memo1.Lines.Delete(Stack.Count); Caption:=Format(Form_Title,[Stack.Count]); Button3Click(nil); end; Edit1.SetFocus; end; procedure TForm1.Button3Click(Sender: TObject); begin if Stack.Count>0 then ShowMessage('Top item : ' TElement(Stack.Peek).name) else ShowMessage('No Item in stack!'); Edit1.SetFocus; end; end. 問題說明: 1.button1作push動作正常. 2.button2作pop動作,但TElement(Stack.pop).name卻一直是最後一筆資料name. 3.button3作peek動作,但不管pop幾次,甚至已經剩下最後一筆,他還是return最後一筆被push進去的name. 4.但如果pop幾次後又push一筆進去,這時peek就會return這一筆,這樣就正常了,why?peek不是會隨時return stack 最上端的一筆嗎?也就是說我一次PUSH五筆,接著pop三筆,那這時peek 不是會return第二筆嗎? Tkx 發表人 - syene 於 2005/01/26 23:47:11
jamests
初階會員


發表:0
回覆:43
積分:28
註冊:2005-01-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-27 10:58:51 IP:211.75.xxx.xxx 未訂閱
您好:    您推入的元件似乎都是同一個, 然後只改該元件的值. 所以造成您辨識上的錯亂了.    以下提供我的測試: procedure TForm1.Button1Click(Sender: TObject); var ed: TEdit; begin ed:=TEdit.Create(nil); // Stack只存放point, 所以point指到的元件要個別存在 ed.Text:=TimeStr(now); Stack.Push(ed); end; procedure TForm1.Button2Click(Sender: TObject); var ed: TEdit; begin if stack.Count=0 then exit; // assert not empty ed:=TEdit(Stack.Pop); ShowMessage(ed.Text); FreeAndNil(ed); // 記得資源的釋放 end; procedure TForm1.Button3Click(Sender: TObject); var ed: TEdit; begin ShowMessage('before peek count:' IntToStr(stack.Count)); if stack.Count>0 then begin ed:=TEdit(Stack.Peek); ShowMessage('after peek count:' IntToStr(stack.Count)); ShowMessage('First Data:' ed.Text); end; //FreeAndNil(element); 由於stack裡還存有該元件point, 所以不能釋放; end;
系統時間:2024-05-01 8:23:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!