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

請問如何將MainForm 改為每個form載入formname

缺席
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-03 01:37:40 IP:61.228.xxx.xxx 未訂閱
延續上一個問題,本以test ok 但如今遇到問題了 ? 題目: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27637 function OpenForm(FormClass: TFormClass; fm : TForm; AOwner:TComponent) : TForm; var i:integer;     Child:TForm; begin   result := fm;   for i := 0 to Screen.FormCount -1 do       if Screen.Forms[i].ClassType = FormClass then begin          Child:=Screen.Forms[i];          if Child.WindowState=wsMinimized then             ShowWindow(Child.handle,SW_SHOWNORMAL)             else             ShowWindow(Child.handle,SW_SHOWNA);             if (not Child.Visible) then begin                Child.Visible:=True;                Child.BringToFront;                Child.Setfocus;                child.OnClose := MainForm2.ChildFormClose;                exit;                end;   end;   result:=TForm(FormClass.NewInstance);   result.Create(AOwner);   result.OnClose := MainForm2.ChildFormClose; **** //// *****   我大約知道出現錯誤應該為MainForm2 => result.OnClose :=      MainForm2.ChildFormClose;    請問Justmade如何將MainForm2 改為每個form載入formname ?    end; 當 loginunit1 到 FormComp1 沒問題 FormComp1 := TFormComp1(OpenForm(TFormComp1,FormComp1,self)); 但 FormComp1 到 DisForm1 出現 錯誤 message  DisForm1 := TDisForm1(OpenForm(TDisForm1,DisForm1,self)); [Error] Undeclared identifier: 'DisForm1' [Error] Undeclared identifier: 'TDisForm1' [Error] Undeclared identifier: 'OpenForm'
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-03 09:14:02 IP:218.16.xxx.xxx 未訂閱
這些錯誤只顥示你沒 use 相關的 Unit 1. File->Use Unit 2. 加入 放著 OpenForm function 的 unit 3. 加入 DisForm1 的 unit 應就可以了。 將 MainForm2.ChildFormClose 給其他 Form 的 onClose 事件是可以的
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-03 15:12:44 IP:61.228.xxx.xxx 未訂閱
引言: Justmade Sorry 沒有敘述清楚 loginunit2 unit(MainForm2) 裡放Function OpenForm unit loginunit2; ...... implementation uses frm2comp; Function OpenForm(FormClass: TFormClass; fm : TForm; AOwner:TComponent) : TForm; begin ..... end; procedure TMainForm2.HmbBitBtn2Click(Sender: TObject); begin FormComp1 := TFormComp1(OpenForm(TFormComp1,FormComp1,self)); end; << 可以沒問題>> unit frm2comp; ...... ..... implementation uses loginunit2,District; procedure TFormComp1.F2ComboBox3Exit(Sender: TObject); begin DistrictForm1 := TDistrictForm1(OpenForm(TDistrictForm1,DistrictForm1,self)); end; run 就會出現 [Error] Undeclared identifier: 'DistrictForm1' [Error] Undeclared identifier: 'TDistrictForm1' [Error] Undeclared identifier: 'OpenForm' 再請Justmade1幫我看看錯在那兒?謝謝
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-03 15:21:40 IP:211.74.xxx.xxx 未訂閱
procedure TFormComp1.F2ComboBox3Exit(Sender: TObject); begin   DistrictForm1 := TDistrictForm1(OpenForm(TDistrictForm1,DistrictForm1,self)); end; 改成這樣.. procedure TFormComp1.F2ComboBox3Exit(Sender: TObject); begin FormComp1 := TFormComp1(MainForm2.OpenForm(TFormComp1,FormComp1,self)); end; TRY TRY SEE
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-03 15:34:36 IP:218.16.xxx.xxx 未訂閱
unit frm2comp; ...... ..... implementation uses loginunit2,District;    procedure TFormComp1.F2ComboBox3Exit(Sender: TObject); begin DistrictForm1 := TDistrictForm1(OpenForm(TDistrictForm1,DistrictForm1,self)); end;    run 就會出現 [Error] Undeclared identifier: 'DistrictForm1' [Error] Undeclared identifier: 'TDistrictForm1' 1. 會不會是 TDistrictForm 及 DistrictForm, 沒有 1 字 (亂估) 2. 你肯定該 Unit 叫 District 嗎? 還是 DistrictUnit ? [Error] Undeclared identifier: 'OpenForm' 在 implementation 前的 var 要宣告 OpenForm, 別的 unit 才能使用。 unit loginunit2; ...... var ...... Function OpenForm(FormClass: TFormClass; fm : TForm; AOwner:TComponent) : TForm; implementation
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-03 18:04:34 IP:61.228.xxx.xxx 未訂閱
引言: 借用同事lilisn電腦,以至發表人錯誤,更正 經 Justmade 指點錯在我,unit district , Formname 也用 district 相同以至於造成上述錯誤,可是 MainForm2 do Formcomp1 Formcomp1 do Formcomp2 FormComp2 直接回去 MainForm2 無法回到上一層 Formcomp1 該如何修改function OpenForm裡的 child.OnClose := MainForm2.ChildFormClose; 讓它回上一層,而非MainForm2
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-03 19:21:31 IP:218.16.xxx.xxx 未訂閱
試試 : procedure TMainForm2.ChildFormClose(Sender: TObject; var Action: TCloseAction); begin TForm(TForm(Sender).Owner).Show; end;
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-03 23:57:14 IP:61.228.xxx.xxx 未訂閱
引言: 試試 : procedure TMainForm2.ChildFormClose(Sender: TObject; var Action: TCloseAction); begin // 原本程式 show TForm(TForm(Sender).Owner).Show; // 用了此行 error message:abstract error 謝謝 end;
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-04 10:01:32 IP:218.16.xxx.xxx 未訂閱
若AOwner是 TForm,那句是可行的。 你不是在 mainform 也用這個 ChildFormClose 罷?? 或許你的 AOwner 不是 Form ? 你自己想想,要 Show 的 Form不一定是 Mainform2, 又不是 AOwner,你的程式甚知道應 Show 甚麼。
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-04-04 10:37:33 IP:61.228.xxx.xxx 未訂閱
引言: 原程式: procedure TMainForm2.ChildFormClose(Sender: TObject; var Action: TCloseAction); begin show; end; mainform 去do Formcomp1 後離開回mainform 正常 改為 procedure TMainForm2.ChildFormClose(Sender: TObject; var Action: TCloseAction); begin TForm(TForm(Sender).Owner).Show; end; 之後mainform 去do Formcomp1 後離開回mainform也出現 error message:abstract error 可否將 TForm(TForm(Sender).Owner) 結果用label or showmessage 顯示出來? 謝謝
發表人 - nick167 於 2003/04/04 10:52:00
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-04-04 11:26:37 IP:218.16.xxx.xxx 未訂閱
procedure TMainForm2.HmbBitBtn2Click(Sender: TObject); begin FormComp1 := TFormComp1(OpenForm(TFormComp1,FormComp1,self)); end; function OpenForm(FormClass: TFormClass; fm : TForm; AOwner:TComponent) : TForm; ... result:=TForm(FormClass.NewInstance); result.Create(AOwner); result.OnClose := MainForm2.ChildFormClose; procedure TMainForm2.ChildFormClose(Sender: TObject; var Action: TCloseAction); begin ShowMessage(TComponent(Sender).Name); // FormComp1 或 FormComp1_1 等 ShowMessage(TComponent(Sender).Owner.Name); // MainForm2 //TForm(TForm(Sender).Owner).Show; end; 這樣簡單的測試也要我寫嗎?
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-04-04 12:30:14 IP:61.228.xxx.xxx 未訂閱
引言: procedure TMainForm2.HmbBitBtn2Click(Sender: TObject); begin FormComp1 := TFormComp1(OpenForm(TFormComp1,FormComp1,self)); 原本就是self end; procedure TMainForm2.ChildFormClose(Sender: TObject; var Action: TCloseAction); begin // TForm(TForm(Sender).Owner).Show; ShowMessage(TComponent(Sender).Name); // 顯示 FormComp1 ShowMessage(TComponent(Sender).Owner.Name); // 沒有顯示formname空 白 ???? (formcomp1 上一層form是 MainForm2) end; Function OpenForm(FormClass: TFormClass; fm : TForm; AOwner:TComponent) : TForm; var i:integer; Child:TForm; begin result := fm; for i := 0 to Screen.FormCount -1 do if Screen.Forms[i].ClassType = FormClass then begin Child:=Screen.Forms[i]; if Child.WindowState=wsMinimized then ShowWindow(Child.handle,SW_SHOWNORMAL) else ShowWindow(Child.handle,SW_SHOWNA); if (not Child.Visible) then begin Child.Visible:=True; Child.BringToFront; Child.Setfocus; child.OnClose := MainForm2.ChildFormClose; exit; end; end; result:=TForm(FormClass.NewInstance); result.Create(AOwner); result.OnClose := MainForm2.ChildFormClose; end; 這樣簡單的測試也要我寫嗎? 不好意思,我慚愧,接觸delphi約3個月,書買7本,上一期資策會delphi課程 讓我學最多是delphi k.top,感謝所有人,謝謝大家熱心,
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-04-04 12:43:30 IP:218.16.xxx.xxx 未訂閱
Project->Options->Form 你的 FormComp1 在 Auto-create field 嗎? 應該是罷... 這樣的話 FormComp1 會於程式開始時自動新增並沒有設定 Owner 是 MainForm2 移掉它及其他不用自動 create 的 form 罷。 另一個方法是在 child.OnClose := MainForm2.ChildFormClose; 前加上 child.Owner := AOwner;
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-04-04 14:31:49 IP:61.228.xxx.xxx 未訂閱
引言: Project->Options->Form 你的 FormComp1 在 Auto-create field 嗎? 應該是罷...是 我的:Project-> Options-> Form main form -> mainform1,Auto-create forms有mainform1,mainform2,formcomp1,formcomp2,formcom3 這樣的話 FormComp1 會於程式開始時自動新增並沒有設定 Owner 是 MainForm2移掉它及其他不用自動 create 的 form 罷。怎麼移掉它? 另一個方法是在 child.OnClose := MainForm2.ChildFormClose; 前加上 child.Owner := AOwner; // 加這一行出現 // [Error] Cannot assign to a read-only property
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-04-04 14:51:39 IP:218.16.xxx.xxx 未訂閱
將那些不用 auto-create 的用 > 按過去 available form 呀.... 忘了 owner 是 readonly 的說。
nick167
中階會員


發表:86
回覆:133
積分:53
註冊:2003-02-12

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-04-04 17:03:59 IP:61.228.xxx.xxx 未訂閱
引言: 還是有問題? 後來看到範例,就可以解結我的問題,很簡單程式,提供日後像我這樣新手參考 Function FormExists(Form_name:String):Boolean; begin if Application.FindComponent(Form_name)=nil then result := False else result := True; end; Function Form_SHOW(T_Form:TForm;X,Y:Integer):Boolean; begin with T_Form as TForm do begin WINDOWSTATE:=wsNormal; POSITION:=poScreenCenter; FORMSTYLE:=FSNORMAL; if X >= 0 then LEFT := X; if Y >=0 then TOP := Y; Show; Result := True; end; end; if FormExists('FormComp1' )= False then Application.CreateForm(TFormComp1,FormComp1); Form_Show(FormComp1,-1,-1); 我還是非常謝謝Jusemade不厭倦為我解答,謝謝
系統時間:2024-11-23 2:23:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!