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

動態create form 的問題

尚未結案
cd109
一般會員


發表:23
回覆:33
積分:11
註冊:2003-12-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-01-13 09:40:25 IP:203.66.xxx.xxx 未訂閱
請問各位大哥: 我有三個form=>> MAIN,TR,TRNAME main當主體,TR動態create出來panel在main上面,然後TR在動態呼叫TRNAME,TR的全域變數就無法使TRNAME看見了,請問有沒有解決問題的方法或方向, PS:我在TR上建一個button裡面寫showmessage(TR.name)會發生錯誤,改寫成showmessage(self.name)就ok,所以我想是因為TR沒有建立起來的緣故. 謝謝
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-01-13 10:43:31 IP:210.69.xxx.xxx 未訂閱
看不到就當參數傳過去
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-01-13 11:04:38 IP:203.73.xxx.xxx 未訂閱
可以請問一下是用什麼方式動態Create Form的呢 我是用以下方法,在各個Form之間的Public宣告變數,都可以看到,都沒問題。 可能要請你列出你的方式。 TR:=TTR.Create(Nil); TR.Show;
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
cd109
一般會員


發表:23
回覆:33
積分:11
註冊:2003-12-22

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-01-13 12:14:05 IP:203.66.xxx.xxx 未訂閱
大哥你好:
function FormShowChild( sId: String; eWindowState: TWindowState;Pent:TWinControl): THandle;
var
  form : TForm;
  i, formTag : Integer;
begin
  if sId='' then exit;
  form := nil;
  for i := 0 to Screen.FormCount - 1 do
  begin
    if UpperCase(Screen.Forms[i].ClassName) = UpperCase('Tfrm'   sId) then
    begin
      form := Screen.Forms[i];
      form.BringToFront;
      break;
    end;
  end;
  if form = nil then
  begin
    formTag:= AuthorizeCode(sId);
    if formTag = -1 then exit ;
    form := TFormClass( FindClass('Tfrm'   sId)).Create(Application);
    form.Tag := formTag;
  end;
 // form.WindowState:= eWindowState;
  form.Show;
  form.BorderStyle := bsNone;
  form.Parent := Pent;
  form.Align := alClient;
  Result := form.Handle;
  
end;
//maim
procedure Tfrmmain.FormCreate(Sender: TObject);
begin
  FormShowChild(TR,wsMaximized,pnlMain);
end;
//TR
 frmToolGroupName := TfrmToolGroupName.Create(Self);
//TRNAME
procedure TfrmToolGroupName.FormCreate(Sender: TObject);
begin
    TR.btnName <<==TR 全域變數
end; 
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-01-13 14:09:39 IP:203.73.xxx.xxx 未訂閱
經過測試,是因為您動態產生的function是用Create(Application),如果改為Creat(Self)就可以了,Creat(Self)或Create(Application)。如果Owner是屬於別的視窗或控制項的話,當它的Owner被釋放的時候,該Owner所擁有的也會被釋放。關鍵的區別是由誰來管理該表單的資源。用第一種方法創建,該表單的資源由編程者來負責管理;用第二種方法創建,該表單的資源由Application來管理。 如果不想改為Creat(Self)的話,可以用下列方式取得變數 showmessage(TfrmTR(Application.FindComponent('frmTR')).btnName); 發表人 - shinjie 於 2005/01/13 14:16:13
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
cd109
一般會員


發表:23
回覆:33
積分:11
註冊:2003-12-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-01-13 15:40:11 IP:203.66.xxx.xxx 未訂閱
function FormShowChild( sId: String; eWindowState: TWindowState;Pent:TWinControl): THandle;
var
  form : TForm;
  i, formTag : Integer;
begin
  if sId='' then exit;
  form := nil;
  for i := 0 to Screen.FormCount - 1 do
  begin
    if UpperCase(Screen.Forms[i].ClassName) = UpperCase('Tfrm'   sId) then
    begin
      form := Screen.Forms[i];
      form.BringToFront;
      break;
    end;
  end;
  if form = nil then
  begin
    formTag:= AuthorizeCode(sId);
    if formTag = -1 then exit ;
    form := TFormClass( FindClass('Tfrm'   sId)).Create(Application);<==請問大哥你是說這裡改成self嗎? 好像沒有這個關鍵字ㄝ
    form.Tag := formTag;
  end;
 // form.WindowState:= eWindowState;
  form.Show;
  form.BorderStyle := bsNone;
  form.Parent := Pent;
  form.Align := alClient;
  Result := form.Handle;
  
end;    
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-01-13 16:04:49 IP:61.59.xxx.xxx 未訂閱
當然沒有,因為你用的是Function,如果要用的話,要把Self傳進Function裡面 要用TComponent的型態
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
cd109
一般會員


發表:23
回覆:33
積分:11
註冊:2003-12-22

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-01-13 16:19:00 IP:203.66.xxx.xxx 未訂閱
謝謝大哥回應,不好意思斗膽請問一下,是要在哪更改.
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-01-13 16:49:02 IP:203.73.xxx.xxx 未訂閱
如果不想改為Creat(Self)的話,可以用下列方式取得變數 showmessage(TfrmTR(Application.FindComponent('frmTR')).btnName); 傳Self要改三個地方 function FormShowChild( sId: String; eWindowState: TWindowState;Pent:TWinControl;AOwner: TComponent): THandle; form := TFormClass( FindClass('Tfrm' sId)).Create(AOwner); FormShowChild(TR,wsMaximized,pnlMain,Self);
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
cd109
一般會員


發表:23
回覆:33
積分:11
註冊:2003-12-22

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-01-13 17:15:53 IP:203.66.xxx.xxx 未訂閱
showmessage(TfrmTR(Application.FindComponent('frmTR')).btnName); 請問大哥上面這一句是可以取得參數,但是我用self的方法,設中斷點還是會出現TR.btnName=nil
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-01-13 18:51:22 IP:203.67.xxx.xxx 未訂閱
以下是幾篇討論動態Create Form的問題,希望能幫你離一些 觀念,理論上來說,在Form Class中加入Global的物件指標變 數,有些狀況必須要多加考量,尤其在架構整個程式的UI部分, 更要在初期就架構清楚.    http://delphi.ktop.com.tw/topic.php?TOPIC_ID=61566 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=62015 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=62150
shinjie
資深會員


發表:12
回覆:275
積分:287
註冊:2003-03-19

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-01-14 08:14:10 IP:203.73.xxx.xxx 未訂閱
因為我測試都正常,所以只能提供你測試方法 將Function拿掉,在FormCreate裡面動態Create Form就可以直接傳Self了
------
我將在茫茫人海中尋訪我唯一之靈魂伴侶。
得之;我幸。不得;我命。
cd109
一般會員


發表:23
回覆:33
積分:11
註冊:2003-12-22

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-01-14 08:45:31 IP:203.66.xxx.xxx 未訂閱
謝謝 shinjie 大哥辛苦回覆,真是讓我獲益匪淺.
系統時間:2024-05-21 22:05:01
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!