請問一個讀取資料庫產生TreeView的問題 ... |
答題得分者是:ccchen
|
shishan
一般會員 發表:1 回覆:10 積分:2 註冊:2002-10-03 發送簡訊給我 |
請問一個有關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 發送簡訊給我 |
你可以試試 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 發送簡訊給我 |
很感謝您的回答~ ^_^ 因為我的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 發送簡訊給我 |
引言: 所以..我才會想使用讀取資料庫來動態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/ |
||
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
由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 發送簡訊給我 |
感謝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 發送簡訊給我 |
引言: 只是..還有個小疑問.. initialization RegisterClass(TTeacher_frm); RegisterClass(TStudent_frm); RegisterClass(TClass_frm); 一定要這樣一個一個列出所有的TForm嗎??!! 如果二,三十個..那..程式不就會很冗長嗎?!.. 可是..我改以 RegisterClass(TComponentClass(c)); 結果..又失敗了~.. 所以又來借問一下..是不是有什麼好方法呢?? 謝謝!!我也是有這個困擾,但是想不到解決方法,不過我都是每支程式加自己的。
------
人生有夢,逐夢而行 人若為善,福雖未至,禍已遠離 人若為惡,禍雖未至,福已遠離 http://www.taconet.com.tw/jieshu/ |
||
ccchen
版主 發表:61 回覆:940 積分:1394 註冊:2002-04-15 發送簡訊給我 |
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 發送簡訊給我 |
謝謝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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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的指導!! 謝謝!! ^__^ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |