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

窗体调用

答題得分者是:jow
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-04-28 11:10:56 IP:218.80.xxx.xxx 訂閱

[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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-04-28 11:31:13 IP:59.114.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-04-28 11:34:07 IP:218.80.xxx.xxx 訂閱
试过了。没有用?老样子。
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
老大仔
尊榮會員


發表:78
回覆:837
積分:1088
註冊:2006-07-06

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-04-28 12:43:49 IP:59.114.xxx.xxx 未訂閱
請問您的cannot focus a disabled or invisibled window是停在哪一行上?
還是做了什麼動作後才發生這個問題呢?
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-04-28 12:45:19 IP:218.80.xxx.xxx 訂閱
没有动过。就停留在
Form3.LoadData; 这行上面
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-04-28 12:48:55 IP:59.112.xxx.xxx 訂閱
這寫法本身有問題
當 呼叫 ShowModal 後程式會轉到Form3 去執行,等Form3結束後才會回到 底下那行 Form3.LoadData
這樣就會發生錯誤, 因為 form3已經關閉, 要達成你程式的邏輯的話, 把 LoadData 放在 Form3 的 OnShow 裡面呼叫就可以
------
額有朝天骨,眼中有靈光
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-04-29 17:37:39 IP:218.80.xxx.xxx 訂閱
谢谢小苏可大大,但是还有一个问题,如果在写在ONSHOW事件中,那么我如果在点击按钮弹出的窗口就是LOADDATA的内容,但是其实,新增资料和修改资料我都用了同一个FORM,这样不是就错了吗?
比如说我单击按钮-》edit1.text:='ok',当我吧LOADDATA放在ONSHOW时间中之后,我的EDIT1.TEXT设置为‘error’,那么当我重新再单击时,又变成ERROR了。有没有是么办法,或者在结束后,取消ONSHOW的内容?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-04-29 18:43:04 IP:59.112.xxx.xxx 訂閱
這個好解決, 因為你在呼叫 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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-04-29 21:27:40 IP:222.70.xxx.xxx 訂閱
大大,前面的EDIT,NEW是什么意思啊?我在那里设定啊?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-04-30 08:43:01 IP:59.112.xxx.xxx 訂閱
你誤會我的意思了
我是說在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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-04-30 22:24:34 IP:124.77.xxx.xxx 訂閱
好像不对,像是要重新初始化代码的,以下是我的部分程序

[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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2009-04-30 23:23:09 IP:59.112.xxx.xxx 訂閱
說明原因.....這要先解釋 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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2009-05-01 23:51:01 IP:116.230.xxx.xxx 訂閱
大大,我知道道理,但是为是么还是不对啊?就像我上面的代码,您看看改怎么改才能正常运行呢?难道是上面还要加上,edit1.text:='edit1'好像更加不对了吧
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
編輯記錄
zhouying82 重新編輯於 2009-05-01 23:51:45, 註解 無‧
小傑克
資深會員


發表:5
回覆:209
積分:357
註冊:2009-02-16

發送簡訊給我
#14 引用回覆 回覆 發表時間:2009-05-02 08:47:37 IP:59.112.xxx.xxx 訂閱
針對上面問題,很多方法可以選
1. form2 不要用自動create , 可以每次使用都create ,showmodal, 結束時 free;
2. 可以在form2 onShow 裡面先寫好所有元件的初值
3. 在close的時候清空元件上的值
------
額有朝天骨,眼中有靈光
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#15 引用回覆 回覆 發表時間:2009-05-04 09:03:59 IP:218.80.xxx.xxx 訂閱
那么就是我上面说的做法喽?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
jow
尊榮會員


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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2009-05-04 11:38:40 IP:203.70.xxx.xxx 未訂閱

[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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2009-05-04 18:41:06 IP:59.112.xxx.xxx 訂閱
樓上的大大, 您在f3.ShowModal  (是會卡在畫面最上層的ShowModal喔)之後才執行 f3.LaodData 
LoadData 裡面有物件做 SetFocus 這樣是會錯誤的, 而且提問者的LoadData的原意好像也不是
在 f3 "關閉"後才執行的, 應該是f3 出現的時候給初始值用的
------
額有朝天骨,眼中有靈光
jow
尊榮會員


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

發送簡訊給我
#18 引用回覆 回覆 發表時間:2009-05-04 19:30:43 IP:123.193.xxx.xxx 未訂閱
樓上的大大, 原回帖的程式碼是引用提問者post的"原版程式"碼

其實我想要說的是, 在自定類別 TForm1,TForm2...中
使用變數 Form1,Form2,... 不是很好的程式習慣.

類別間的相互關連, 應該稍作安排

個人觀點, 僅供參考 ^_^




嘿, 最近專案稍有空檔, 上來多嘴一下
編輯記錄
jow 重新編輯於 2009-05-04 19:49:50, 註解 無‧
jow 重新編輯於 2009-05-04 19:51:39, 註解 無‧
系統時間:2024-05-17 2:47:35
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!