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

一個關於焦點控制的問題

 
vincent_siu
一般會員


發表:4
回覆:9
積分:2
註冊:2005-01-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-09-13 15:40:25 IP:59.37.xxx.xxx 訂閱

各位大大,

小弟現有一個難題, 在tfrom 內有兩個 edit 欄位(edit1, edit2), 在edit1 之 onenter 會showmessage程式如下

procedure TForm1.Edit1Enter(Sender: TObject);
begin
showmessage('testing message');
end;

用滑鼠按edit1後, 再表確定後, 鍵盤不能在edit1內輸入東西, 要用滑鼠按一下edit1 或轉到第二個程式再轉回來才行

不知什麼原因.

danny
版主


發表:100
回覆:522
積分:595
註冊:2002-03-11

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-09-14 10:56:13 IP:211.76.xxx.xxx 未訂閱

這是因為 showmessage() 也是一個 Form 之故, 並且 OnEnter 是取得 focus 之初就馬上失去 focus,

因此, 必需在 showmessage() 後再加上 TEdit(Sender).SetFocus 再度取得 focus


===================引 用 文 章===================

各位大大,

小弟現有一個難題, 在tfrom 內有兩個 edit 欄位(edit1, edit2), 在edit1 之 onenter 會showmessage程式如下

procedure TForm1.Edit1Enter(Sender: TObject);
begin
showmessage('testing message');
end;

用滑鼠按edit1後, 再表確定後, 鍵盤不能在edit1內輸入東西, 要用滑鼠按一下edit1 或轉到第二個程式再轉回來才行

不知什麼原因.

------
將問題盡快結案也是一種禮貌!
vincent_siu
一般會員


發表:4
回覆:9
積分:2
註冊:2005-01-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-09-14 12:23:39 IP:203.85.xxx.xxx 訂閱

謝謝 danny 之提點.

但加了 tedit(sender).serfocus 後問題依然一樣, 但如果用Tab鍵就沒有這問題. 程式如下

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
procedure Edit1Enter(Sender: TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Edit1Enter(Sender: TObject);
begin
Showmessage('記錄已被更改, 是否儲存 ? ');
Tedit(sender).SetFocus;
end;
end.

Vincent

mike0518
一般會員


發表:1
回覆:12
積分:7
註冊:2002-07-11

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-09-14 16:57:40 IP:60.28.xxx.xxx 未訂閱
把你的 TEdit(sender).setfocus;
改成 PostMessage(TEdit(Sender).Handle,WM_SETFOCUS,0,0);

應該就可以了 .... 直接setfocus , 是利用SendMessage去丟的 ,
去看看SendMessage 跟 PostMessage的不同 , 大概就可以了解為什麼了
vincent_siu
一般會員


發表:4
回覆:9
積分:2
註冊:2005-01-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2006-09-15 14:35:23 IP:59.37.xxx.xxx 訂閱

謝謝 mike0518 的指點.

但同題仍然存在. 但用tab 鍵進入 edit1 完全沒有問題, 如用滑鼠 click edit1 後, 輸入不到任何東西, 要在form1上 click 一吓或用 alt tab來轉換程式後 就沒有問題.

不知什麼原因

Vincent

g9221712
高階會員


發表:145
回覆:344
積分:162
註冊:2006-07-06

發送簡訊給我
#6 引用回覆 回覆 發表時間:2006-09-16 05:51:25 IP:220.134.xxx.xxx 未訂閱

我用PostMessage(TEdit(Sender).Handle,WM_SETFOCUS,0,0); 可以啊!不過不太清楚你要達到的目的!

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
procedure Edit1Enter(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Edit1Enter(Sender: TObject);
begin
showmessage('testing message');
// Edit1.SetFocus;
PostMessage(TEdit(Sender).Handle,WM_SETFOCUS,0,0);

end;

end.

------
「人們所以覺得寂寞,是因為他們會築牆,卻不會搭橋。」
程式寫的越久,卻發現自己越來越不會寫程式!
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2006-09-16 17:35:06 IP:61.229.xxx.xxx 未訂閱
你好,我有疑問,我了解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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2006-09-16 17:56:23 IP:61.229.xxx.xxx 未訂閱
寫完上個問題後,想到一個在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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2006-09-18 10:16:45 IP:203.85.xxx.xxx 訂閱

謝謝各位大大的指教.

我的問題是在以下之情況發生 (delphi 7.0 win xp sp2)

1. 程式在執行之時, 會顯示 testing message. 按確定後, edit1內可輸入文字
2 用滑鼠按edit2 (把 focus 移到edit2)
3. 用滑鼠再按edit1 (把 focus 移回edit1)
4. 這時testing message 會跳出來,
5. 按確定後, 浮標會在edit1內跳動, 但用鍵盤輸入不到任何東西

要在 form1上按一按滑鼠才可輸入.


問題是為什麼程式一開始時按 showmessage 之確定後可在edit1 做輸入
而用滑鼠把focus 移到 edit1後按 showmessage 之確定後不可輸入, 而是要在form1 上按一下才可輸入

謝謝各位對小弟之提點
Vincent

vincent_siu
一般會員


發表:4
回覆:9
積分:2
註冊:2005-01-20

發送簡訊給我
#10 引用回覆 回覆 發表時間:2006-09-18 10:17:17 IP:203.85.xxx.xxx 訂閱

謝謝各位大大的指教.

我的問題是在以下之情況發生 (delphi 7.0 win xp sp2)

1. 程式在執行之時, 會顯示 testing message. 按確定後, edit1內可輸入文字
2 用滑鼠按edit2 (把 focus 移到edit2)
3. 用滑鼠再按edit1 (把 focus 移回edit1)
4. 這時testing message 會跳出來,
5. 按確定後, 浮標會在edit1內跳動, 但用鍵盤輸入不到任何東西

要在 form1上按一按滑鼠才可輸入.


問題是為什麼程式一開始時按 showmessage 之確定後可在edit1 做輸入
而用滑鼠把focus 移到 edit1後按 showmessage 之確定後不可輸入, 而是要在form1 上按一下才可輸入

謝謝各位對小弟之提點
Vincent

系統時間:2024-05-12 10:10:53
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!