請問如何將MainForm 改為每個form載入formname |
缺席
|
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
延續上一個問題,本以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 發送簡訊給我 |
|
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
引言: 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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 借用同事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 發送簡訊給我 |
|
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
|
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
引言: 原程式: 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 發送簡訊給我 |
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 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
nick167
中階會員 發表:86 回覆:133 積分:53 註冊:2003-02-12 發送簡訊給我 |
引言: 還是有問題? 後來看到範例,就可以解結我的問題,很簡單程式,提供日後像我這樣新手參考 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不厭倦為我解答,謝謝 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |