一個關於焦點控制的問題 |
|
vincent_siu
一般會員 發表:4 回覆:9 積分:2 註冊:2005-01-20 發送簡訊給我 |
|
danny
版主 發表:100 回覆:522 積分:595 註冊:2002-03-11 發送簡訊給我 |
這是因為 showmessage() 也是一個 Form 之故, 並且 OnEnter 是取得 focus 之初就馬上失去 focus, 因此, 必需在 showmessage() 後再加上 TEdit(Sender).SetFocus 再度取得 focus
各位大大, 小弟現有一個難題, 在tfrom 內有兩個 edit 欄位(edit1, edit2), 在edit1 之 onenter 會showmessage程式如下 procedure TForm1.Edit1Enter(Sender: TObject); 用滑鼠按edit1後, 再表確定後, 鍵盤不能在edit1內輸入東西, 要用滑鼠按一下edit1 或轉到第二個程式再轉回來才行
不知什麼原因.
------
將問題盡快結案也是一種禮貌! |
vincent_siu
一般會員 發表:4 回覆:9 積分:2 註冊:2005-01-20 發送簡訊給我 |
謝謝 danny 之提點. 但加了 tedit(sender).serfocus 後問題依然一樣, 但如果用Tab鍵就沒有這問題. 程式如下 unit Unit1; Vincent |
mike0518
一般會員 發表:1 回覆:12 積分:7 註冊:2002-07-11 發送簡訊給我 |
|
vincent_siu
一般會員 發表:4 回覆:9 積分:2 註冊:2005-01-20 發送簡訊給我 |
|
g9221712
高階會員 發表:145 回覆:344 積分:162 註冊:2006-07-06 發送簡訊給我 |
我用PostMessage(TEdit(Sender).Handle,WM_SETFOCUS,0,0); 可以啊!不過不太清楚你要達到的目的! unit Unit1; interface uses type var implementation {$R *.dfm} procedure TForm1.Edit1Enter(Sender: TObject); end; end.
------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」 程式寫的越久,卻發現自己越來越不會寫程式! |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
你好,我有疑問,我了解SendMessage與PostMessage的不同,但還是不了解為什麼! 可否講深入一點呢? 謝謝。
二者的不同: 一個送到queue然後被Get或Peek後進入WndProc,另一個則是直接叫WndProc。 一個呼叫後就立刻return,一個等候處理完畢return。 但這有影響到這個問題嗎? 最後都是由WndProc處理了,中間也沒有任何的queue hook。 查了所有的vcl代碼,也沒發現有任何用SendMessage(WM_SETFOCUS...)的話。vcl除com元件類外,幾乎都是用自己perform的方法呼叫自己的WndProc,這樣省了windows API的一個過程,僅管二者的原理是一樣的。 查代碼關於setfocus,追到最後關鍵function是: procedure TCustomForm.SetWindowFocus; var FocusControl: TWinControl; begin if (FActiveControl <> nil) and (FDesigner = nil) then FocusControl := FActiveControl else FocusControl := Self; Windows.SetFocus(FocusControl.Handle); if GetFocus = FocusControl.Handle then FocusControl.Perform(CM_UIACTIVATE, 0, 0); end; 看不出來為何PostMessage可以SnedMessage就不可以的理由。因為手中沒有delphi,無法測若改SendMessage(TEdit(Sender).Handle,WM_SETFOCUS,0,0); 可以嗎? 或TEdit(Sender).Perform(WM_SETFOCUS,0,0);行嗎? 一定要用PostMessage?? 感覺問題根源好像不是SendMessage或是PostMessage的問題… 想要多了解一下。 PS 我使用BCB,並沒有這個題目的問題,一切都很正常,所以無法測。 ===================引 用 文 章=================== 把你的 TEdit(sender).setfocus; 改成 PostMessage(TEdit(Sender).Handle,WM_SETFOCUS,0,0); 應該就可以了 .... 直接setfocus , 是利用SendMessage去丟的 , 去看看SendMessage 跟 PostMessage的不同 , 大概就可以了解為什麼了
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
寫完上個問題後,想到一個在VCL中PostMessage與SendMessage的不同處,但這問題僅有VCL才有,所有其他windows程式幾乎沒這問題。就是… 當PostMessage 給form中的control元件時,control會再把訊息再傳回給TApplication,做一些OnMessage等的filter處理。就control本身來說僅差在若是post 而來的它就要回報給TApplication,這也是為何只是要post的msg一定可以在TApplication.OnMessage上做hook。
每個元件,包含主form,都有自己的WndProc,訊息都是由系統直接給元件,元件則不一定要回報給主WndProc。 若說有人試出非PostMessage不可,Send不行,Perform也不行,那只有一種可能就是回報給TApplicaiton後,TApplication加料或是再給其他的訊息回給子control。 但這也不是Send,與Post本質上不同的關係,而是VCL架構上的問題。 就我的了解,VCL的訊息架構是TApplication是主WndProc他先使用系統的DefWindProc register class,然後再SetWindowLong hook自己的WndProc,再來主form也有自己的WndProc,其他的元件也是有自己的WndProc。多數的情形是訊息至元件,元件視不同情形而回報TApplication,不過就我的了解,所有關於PostMessage的部份元件都得要回報給它,不然OnMessage就沒用了! OnMessage是發生在 Application.Run上,屬於ProcessMessage的部份,在PeekMessage後觸發OnMessage(若有指定)。 自己求解寫了一堆,還是希望樓上的可以指教一下是為什麼。另外,也請有delphi的人幫忙測一下,謝謝
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
vincent_siu
一般會員 發表:4 回覆:9 積分:2 註冊:2005-01-20 發送簡訊給我 |
謝謝各位大大的指教. 我的問題是在以下之情況發生 (delphi 7.0 win xp sp2) 1. 程式在執行之時, 會顯示 testing message. 按確定後, edit1內可輸入文字 要在 form1上按一按滑鼠才可輸入.
謝謝各位對小弟之提點 |
vincent_siu
一般會員 發表:4 回覆:9 積分:2 註冊:2005-01-20 發送簡訊給我 |
謝謝各位大大的指教. 我的問題是在以下之情況發生 (delphi 7.0 win xp sp2) 1. 程式在執行之時, 會顯示 testing message. 按確定後, edit1內可輸入文字 要在 form1上按一按滑鼠才可輸入.
謝謝各位對小弟之提點 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |