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

請問一個讀取資料庫產生TreeView的問題 ...

答題得分者是:ccchen
shishan
一般會員


發表:1
回覆:10
積分:2
註冊:2002-10-03

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-11-05 16:03:16 IP:163.26.xxx.xxx 未訂閱
請問一個有關TreeView的問題~ 因為要將資料庫的內容轉為TTreeView物件的節點資料, 所以我是用TTreeView物件的Data屬性來記錄資料的, 也就是先宣告一個自訂的指標資料型態,如下: type PMyRecord = ^TMyRecord; TMyRecord = record parent_node_id : string; //父節點 node_id : string; //節點代碼 caption : string; //節點標題文字 frm : string; //form的名字 end; uses Student_fromU, Teacher_frmU, Class_frmU; 可是在TreeView物件的onClick中的程式碼在動態產生Form的部分不知道該如何寫呢?? 也就是當user點選node時,即以這個node中的Data所存的form名字create form... 我知道抓取node中Data的form名字是:PMyRecord(TreeView1.Selected.Data)^.frm; 可是抓取出來的是string,要怎麼轉為form型態呢?? 而且要怎麼讓它乖乖地create出來呢?? procedure TForm1.TreeView1Click(Sender:TObject); begin with TStudent_frm.Create(application) do ^^^^^^^^^^^==>"TStudent_frm"能依資料庫所存的值而動態改變為TTeacher_frm或TClass_frm begin showmodal; end; end; 我試過component之類,可是一直試不出來.. 不知是否有哪位大大能為小的解惑一下... 感激呀~... 發表人 - shishan 於 2002/11/05 16:24:54
FrederickPau
資深會員


發表:4
回覆:161
積分:268
註冊:2002-11-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2002-11-05 22:25:14 IP:61.228.xxx.xxx 未訂閱
你可以試試 procedure TForm1.TreeView1Click(Sender:TObject); var bb: TForm; begin if PMyRecord(TreeView1.Selected.Data)^.frm = 'TStudent_frm' then bb := TStudent_frm.Create(nil) else if PMyRecord(TreeView1.Selected.Data)^.frm = 'TTeacher_frm' then bb := TTeacher_frm.Create(nil) else if PMyRecord(TreeView1.Selected.Data)^.frm = 'TClass_frm' then bb := TClass_frm.Create(nil); bb.ShowModal; end; 不知道是否符合你的需求
shishan
一般會員


發表:1
回覆:10
積分:2
註冊:2002-10-03

發送簡訊給我
#3 引用回覆 回覆 發表時間:2002-11-06 09:14:14 IP:163.26.xxx.xxx 未訂閱
很感謝您的回答~ ^_^ 因為我的Form大約會有二,三十個.. 如果用if..else if... 那..我可能會寫到漏東漏西的吧~.. 所以..我才會想使用讀取資料庫來動態create的方式.. 只是..我try的方式是以動態建立edit的模式去create form.. 如下: with TForm(findcomponent('T' PMyRecord(TreeView1.Selected.Data)^.frm)).Create(application) do begin showmodal; end; try的結果..失敗~... 可是..又找不到任何相關的資料.. 所以..想借問看看..有沒有人曾經寫過相似的功能呢?!.. 謝謝~ 發表人 - shishan 於 2002/11/06 09:15:31 發表人 - shishan 於 2002/11/06 09:16:48
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2002-11-06 11:35:44 IP:203.204.xxx.xxx 未訂閱
引言: 所以..我才會想使用讀取資料庫來動態create的方式.. 只是..我try的方式是以動態建立edit的模式去create form.. 如下: with TForm(findcomponent('T' PMyRecord(TreeView1.Selected.Data)^.frm)).Create(application) do begin showmodal; end; try的結果..失敗~... 可是..又找不到任何相關的資料.. 所以..想借問看看..有沒有人曾經寫過相似的功能呢?!.. 謝謝~
有阿你用GetClass搜尋看看,應該可以找到你要的。 也就是用字串建立Form。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
ccchen
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2002-11-06 13:13:32 IP:61.219.xxx.xxx 未訂閱
由Form的classname來create Form你可以如此做    
var f:TForm;
    c:TFormClass;
begin
  c:= GetClass(formcalssname);//由class name取得Class之type例如'TForm1'
  Application.createForm(c, f); 
不過每一form要先Register,故在每一.pas之最後 end.之前Rerister此form 如下
initialization
RegisterClass(Tform1);    end.
shishan
一般會員


發表:1
回覆:10
積分:2
註冊:2002-10-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2002-11-06 16:59:08 IP:163.26.xxx.xxx 未訂閱
感謝jieshu和ccchen的說明!!    只是當我程式如下時: var f : TForm;     c : TFormClass; begin    edit1.Text := 'T'+PMyRecord(TreeView1.Selected.Data)^.frm;     c := GetClass(edit1.Text);     Application.createForm(c,f);    f.ShowModal; end; 執行時會有錯誤,沒辦法執行耶~為什麼呢?? [Error]:Incompatible types:'TFormClass' and 'TPersistentClass' 所以我改成: var f : TForm; c : TClass;===>更改後 begin edit1.Text := 'T' PMyRecord(TreeView1.Selected.Data)^.frm; c := GetClass(edit1.Text); Application.createForm(TComponentClass(c),f);===>更改後 f.ShowModal; end; 改成這樣後,就可以執行了... 而且成功執行了!! 只是..還有個小疑問.. initialization RegisterClass(TTeacher_frm); RegisterClass(TStudent_frm); RegisterClass(TClass_frm); 一定要這樣一個一個列出所有的TForm嗎??!! 如果二,三十個..那..程式不就會很冗長嗎?!.. 可是..我改以 RegisterClass(TComponentClass(c)); 結果..又失敗了~.. 所以又來借問一下..是不是有什麼好方法呢?? 謝謝!!
jieshu
版主


發表:42
回覆:894
積分:745
註冊:2002-04-15

發送簡訊給我
#7 引用回覆 回覆 發表時間:2002-11-06 17:18:23 IP:203.204.xxx.xxx 未訂閱
引言: 只是..還有個小疑問.. initialization RegisterClass(TTeacher_frm); RegisterClass(TStudent_frm); RegisterClass(TClass_frm); 一定要這樣一個一個列出所有的TForm嗎??!! 如果二,三十個..那..程式不就會很冗長嗎?!.. 可是..我改以 RegisterClass(TComponentClass(c)); 結果..又失敗了~.. 所以又來借問一下..是不是有什麼好方法呢?? 謝謝!!
我也是有這個困擾,但是想不到解決方法,不過我都是每支程式加自己的。
人生有夢,逐夢而行。 人若為善,福雖未至,禍已遠離。 人若為惡,禍雖未至,福已遠離。 http://www.taconet.com.tw/jieshu/
------
人生有夢,逐夢而行
人若為善,福雖未至,禍已遠離
人若為惡,禍雖未至,福已遠離
http://www.taconet.com.tw/jieshu/
ccchen
版主


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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2002-11-07 08:03:18 IP:61.219.xxx.xxx 未訂閱
c := TFormClass(GetClass(edit1.Text)); 只是..還有個小疑問.. initialization RegisterClass(TTeacher_frm); RegisterClass(TStudent_frm); RegisterClass(TClass_frm); 我們的習慣是, 在每一個Form之unit內自行RegisterClass而不是在一個unit中Register全部 其實不為此目的, 養成習慣每一個Form均RegisterClass, 也有很多好處 發表人 - ccchen 於 2002/11/07 08:04:44
shishan
一般會員


發表:1
回覆:10
積分:2
註冊:2002-10-03

發送簡訊給我
#9 引用回覆 回覆 發表時間:2002-11-07 10:02:47 IP:163.26.xxx.xxx 未訂閱
謝謝jieshu和ccchen的指導!!    1. c := TFormClass(GetClass(edit1.Text));==>原來是這樣寫喔..可以執行了!! 2. "每一個Form之unit內自行RegisterClass而不是在一個unit中Register全部" ==>可是因為我是以TTreeView的方式,點了node時,即create form, 而我的tree node會有二、三十個,也就是會有二、三十個form, 而且都是在這個TTreeView Form中create出來,因為如果沒有在 initialization中RegisterClass這些form,點TTreeView的node時, 即會出現錯誤: Project Project1.exe raised exception class EAcessViolation with message 'Access violation at address 0045918 in module ' 所以才會在一個unit中Register全部這些二、三十個form,想請問一下不知道我這樣的想法及做法對不對呢?? 謝謝!! 發表人 - shishan 於 2002/11/07 10:06:03
ccchen
版主


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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2002-11-08 08:01:46 IP:61.219.xxx.xxx 未訂閱
1. 你的Form有經過DesignTime之設計嗎, (i.e.)每一Form有單獨之.pas嗎? 有的話, 每一unit單獨RegisterClass就很正確, 將RegisterClass放在initialize就是因為不須Create 此form就會執行. 2. 如果這些Form無.pas(未經DesignTime之設計), 連Form上之所有元件均動態Create, 那你只須create Form Instance, 不須create Form Class,也沒這些問題了, 不是嗎
shishan
一般會員


發表:1
回覆:10
積分:2
註冊:2002-10-03

發送簡訊給我
#11 引用回覆 回覆 發表時間:2002-11-08 11:36:08 IP:163.26.xxx.xxx 未訂閱
引言: 1. 你的Form有經過DesignTime之設計嗎, (i.e.)每一Form有單獨之.pas嗎? 有的話, 每一unit單獨RegisterClass就很正確, 將RegisterClass放在initialize就是因為不須Create 此form就會執行. 2. 如果這些Form無.pas(未經DesignTime之設計), 連Form上之所有元件均動態Create, 那你只須create Form Instance, 不須create Form Class,也沒這些問題了, 不是嗎
成功了!!! 反覆地看了您打的這幾行字,思索了許久,終於開竅了~ try了之後,總算了解您所要說明的意思了!! 我的Form都是經過DesignTime設計的,所以每一個Form都有單獨的.pas。 原來 您之前所說的:"每一form要先Register,故在每一.pas之最後 end.之前Rerister此form" 還有jieshu之前所說的:"我都是每支程式加自己的.." ==>意思是把initialize RegisterClass(Tform1)加在各個Form中... 原先我一直誤會地把"所有的"RegisterClass(Tform1)都加在TreeView的主畫面中..難怪我自己怎麼想..都想不通..總覺得怪怪的..怎麼會加了一大串~ initialization RegisterClass(TTeacher_frm); RegisterClass(TStudent_frm); RegisterClass(TClass_frm); ..... 現在已經成功了!! 再次感謝ccchen和jieshu的指導!! 謝謝!! ^__^
系統時間:2024-05-18 22:39:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!