窗体调用 |
答題得分者是:jow
|
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
[code delphi] procedure TForm3.LoadData; begin groupbox1.caption:='修改类型:'; if (form1.abstable1.fieldbyname('内容').asstring='关机!') then begin ComboBox2.SetFocus ; combobox2.itemindex:=4; combobox2.OnChange(Self); DateTimePicker2.Time :=form1.abstable1.fieldbyname('提醒时间').asdatetime; edit3.text:=form1.abstable1.fieldbyname('提醒人').asstring; end; end; procedure TForm1.N13Click(Sender: TObject); begin CLeft:=self.Left Toolbutton2.Width 8; CTop:= self.Top Toolbutton2.top 28; with form3 do begin left:=CLeft; Top:=CTop; showmodal; Form3.LoadData; end; end; [/code] 总是提示“cannot focus a disabled or invisibled window”,我的FORM3是放在auto-create里面的。大大帮我看看,是什么原因啊?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi ! |
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
procedure TForm3.LoadData;
begin groupbox1.caption:='修改类型:'; if (form1.abstable1.fieldbyname('内容').asstring='关机!') then begin //ComboBox2.SetFocus ;<--這行拿掉試看看 combobox2.itemindex:=4; combobox2.OnChange(Self); DateTimePicker2.Time :=form1.abstable1.fieldbyname('提醒时间').asdatetime; edit3.text:=form1.abstable1.fieldbyname('提醒人').asstring; end; end;
編輯記錄
老大仔 重新編輯於 2009-04-28 11:32:38, 註解 無‧
|
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
老大仔
尊榮會員 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
|
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
|
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
谢谢小苏可大大,但是还有一个问题,如果在写在ONSHOW事件中,那么我如果在点击按钮弹出的窗口就是LOADDATA的内容,但是其实,新增资料和修改资料我都用了同一个FORM,这样不是就错了吗?
比如说我单击按钮-》edit1.text:='ok',当我吧LOADDATA放在ONSHOW时间中之后,我的EDIT1.TEXT设置为‘error’,那么当我重新再单击时,又变成ERROR了。有没有是么办法,或者在结束后,取消ONSHOW的内容?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi ! |
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
這個好解決, 因為你在呼叫 ShowModal 之前 form3 就已經是存在的, 只是沒顯示畫面而已, 還是可以傳遞變數
但你要控制 focused 一定要有畫面才能作用 , 所以應該照下面這樣處理才能通用 在form3 的public 放一個變數 CallType:String ; 然後在 form3.FormShow 裡面寫 if CallType = 'EDIT' then begin LoadData ; end; if CallType = 'New' then Begin // 新增的時候需要預先處理的工作 End; 然後form1 中要呼叫form3的地方改成 Form3.CallType = 'EDIT' ; Form3.ShowModal ; 這樣 新增跟編輯 就不會混在一起 當然,最好在Form3.FormClose 裡面要記得寫 CallType=''; 把變數清掉 避免其他地方再呼叫form3 沒有先傳CallType 的時候, calltype 還保留在上一次的狀態 ===================引 用 zhouying82 文 章=================== 谢谢小苏可大大,但是还有一个问题,如果在写在ONSHOW事件中,那么我如果在点击按钮弹出的窗口就是LOADDATA的内容,但是其实,新增资料和修改资料我都用了同一个FORM,这样不是就错了吗? 比如说我单击按钮-》edit1.text:='ok',当我吧LOADDATA放在ONSHOW时间中之后,我的EDIT1.TEXT设置为‘error’,那么当我重新再单击时,又变成ERROR了。有没有是么办法,或者在结束后,取消ONSHOW的内容?
------
額有朝天骨,眼中有靈光
編輯記錄
小傑克 重新編輯於 2009-04-29 18:44:26, 註解 無‧
|
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
你誤會我的意思了
我是說在Form3 自定一個變數 TForm3 = class(TForm) procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } CallType:String; //在這邊自定一個變數, 記得變數要排在 procedure , function 上面,不然會編譯錯誤 procedure LoadData; end; procedure TForm3.FormShow(Sender: TObject); begin if CallType = '1234' then //在Form3 OnShow 事件裏用這個變數來判斷是否要執行 LoadData begin LoadData ; end; end; procedure TForm1.Button1Click(Sender: TObject); begin FORM3.CallType := '1234' ; //在 Form1 裡面呼叫 Form3 ShowModel 之前先把CallType 指定好,這樣就會去跑LoadData, 我寫'EDIT' 那只是個字串, 以後維護比較容易看 FORM3.ShowModal; end; procedure TForm1.Button2Click(Sender: TObject); begin FORM3.CallType := '567' ; // 假設Button2 也是要呼叫Form3 ,但功能跟button1不同,不要執行LoadData 那就這樣就可以 FORM3.ShowModal; end; // 最後, 最好在Form3 OnClose事件中 把CallType:='' 清空, 避免別的地方共用Form3 的時候,沒有先給CallType值 , 但是CallType 卻保留上一次被使用的值 procedure TForm3.FormClose(Sender: TObject; var Action: TCloseAction); begin CallType := ''; end; 這種做法在多功能共用同一個Form的時候很方便, 給你參考
------
額有朝天骨,眼中有靈光
編輯記錄
小傑克 重新編輯於 2009-04-30 08:46:29, 註解 增加一些說明‧
|
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
好像不对,像是要重新初始化代码的,以下是我的部分程序
[code delphi] procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction); begin calltype:=''; end; procedure TForm2.FormShow(Sender: TObject); begin if CallType = '1234' then //在Form3 OnShow 事件裏用這個變數來判斷是否要執行 LoadData begin LoadData ; end; end; procedure TForm2.loaddata; begin edit1.text:='hello,this is a text!'; end; end. procedure TForm1.Button1Click(Sender: TObject); begin FORM2.CallType := '1234' ; //在 Form1 裡面呼叫 Form3 ShowModel 之前先把CallType 指定好,這樣就會去跑LoadData, 我寫'EDIT' 那只是個字串, 以後維護比較容易看 FORM2.ShowModal; end; procedure TForm1.Button2Click(Sender: TObject); begin FORM2.CallType := '567'; form2.ShowModal ; end; end. [/code] 当我按好button1键之后,在按BUTTON2,EDIT1.TEXT里面还是显示的是'hello,this is a text!,而不是程序开始默认的'edit1',除非让我在FORMCLOSE事件中,手动加上这一行。 请问是和原因啊?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi ! |
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
說明原因.....這要先解釋 form close , create , destroy , show 的不同
close 相對於 show , create 相對於 destroy , 當create 之前,form 不存在的, create 的時候,form會把上面的元件都產生出來 , destroy 的時候, form會先清除所有元件, 然後form才消滅 , form show 是把已經存在的form 顯示到畫面上 , close 是把畫面上的form 再隱藏起來 基於上述你就可以理解 如果沒先create ,就直接呼叫 show 就會有access violation 的錯誤 (除非你project 設定auto create form) 當showmodal 以後 點選form關閉, form只是隱藏了,不是消滅了, form上面所有元件上的狀態都還保留著, 只要呼叫show 就又會跑出來 呼~這樣教下去要開班授課了, 你可能要先找個身邊的老手學一下, 不然你維護的那個程式我還蠻擔心的
------
額有朝天骨,眼中有靈光 |
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
大大,我知道道理,但是为是么还是不对啊?就像我上面的代码,您看看改怎么改才能正常运行呢?难道是上面还要加上,edit1.text:='edit1'好像更加不对了吧
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
編輯記錄
zhouying82 重新編輯於 2009-05-01 23:51:45, 註解 無‧
|
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
|
zhouying82
高階會員 發表:150 回覆:272 積分:189 註冊:2004-03-16 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
[code delphi] procedure TForm3.LoadData; var f1: TForm1; begin if Owner = TForm1 then begin f1 := TForm1(Owner); groupbox1.caption:='修改類型:'; if (f1.abstable1.fieldbyname('內容').asstring='關机!') then begin ComboBox2.SetFocus ; combobox2.itemindex:=4; combobox2.OnChange(Self); DateTimePicker2.Time := f1.abstable1.fieldbyname('提醒時間').asdatetime; edit3.text := f1.abstable1.fieldbyname('提醒人').asstring; end; end; end; procedure TForm1.N13Click(Sender: TObject); var f3: TForm3; begin f3 := TForm3.Create(Self) try CLeft := self.Left Toolbutton2.Width 8; CTop := self.Top Toolbutton2.top 28; f3.left := CLeft; f3.Top := CTop; f3.Showmodal; f3.LoadData; finally FreeAndNil(f3); end; [/code] |
小傑克
資深會員 發表:5 回覆:209 積分:357 註冊:2009-02-16 發送簡訊給我 |
|
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |