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

如何在按下F1快捷鍵後,取得目前游標所在物件的名稱?

答題得分者是:Fishman
g9221712
高階會員


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2006-08-19 13:35:12 IP:220.134.xxx.xxx 訂閱

因為想做各個輸入的help說明,要如何在按下F1快捷鍵後,取得目前游標所在物件的名稱呢?

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


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#2 引用回覆 回覆 發表時間:2006-08-22 08:48:34 IP:210.65.xxx.xxx 未訂閱

1.拉一個 ApplicationEvens 元件(在 Additional TAB 中)在 Form 上

2.在其 OnMessage 事件中加入以下程式碼

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
function IsMouseOver (Control: TControl): boolean;
var p: TPoint;
begin
{ get absolute coordinates }
if GetCursorPos (p) then begin
{ convert to relative coordinates of component }
p := Control.ScreenToClient (p);
{ coordinates within Control? }
Result := (p.x >= 0) and (p.x <= Control.Width) and
(p.y >= 0) and (p.y <= Control.Height);
end
else
{ this should never happen, but who knows... }
Result := False;
end;
var
i : integer;
begin
if ((Msg.message = WM_KEYDOWN) and (Msg.wParam = VK_F1)) then
begin
Handled := True;
for i := 0 to Self.ControlCount - 1 do
begin
if IsMouseOver(Self.Controls[i]) then
begin
ShowMessage(Self.Controls[i].Name);
Exit;
end;
end;
end;
end;

參考資料:http://www.chmaas.handshake.de/delphi/tipsmain.htm


Fishman

------
Fishman
g9221712
高階會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2006-08-23 12:15:19 IP:220.134.xxx.xxx 訂閱

感續前輩的回覆:

您的程式確實可用,支援滑鼠移動到物件上方,按下F1確實可以取得物件的名稱,但是有一個限制

不知道前輩是否有解!因為使用者可能會按下TAB按鍵來切換游標的位置,不知道程式要如何修改,

才可以支援鍵盤移動游標FOCUS的操作方式。

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


發表:120
回覆:1949
積分:2163
註冊:2006-10-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2006-08-23 13:38:17 IP:210.65.xxx.xxx 未訂閱

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
function IsMouseOver (Control: TControl): boolean;
var p: TPoint;
begin
{ get absolute coordinates }
if GetCursorPos (p) then begin
{ convert to relative coordinates of component }
p := Control.ScreenToClient (p);
{ coordinates within Control? }
Result := (p.x >= 0) and (p.x <= Control.Width) and
(p.y >= 0) and (p.y <= Control.Height);
end
else
{ this should never happen, but who knows... }
Result := False;
end;
var
i : integer;
P : TPoint;
begin
if (Msg.message = WM_KEYDOWN) then
begin
case Msg.wParam of
VK_F1 :
begin
Handled := True;
for i := 0 to Self.ControlCount - 1 do
begin
if IsMouseOver(Self.Controls[i]) then
begin
ShowMessage(Self.Controls[i].Name);
Exit;
end;
end;
end;
VK_TAB :
begin
Perform(WM_NEXTDLGCTL, 0, 0);
P.x := Round(Self.ActiveControl.Width / 2);
P.y := Round(Self.ActiveControl.Height / 2);
P := Self.ActiveControl.ClientToScreen(P);
SetCursorPos(P.x,P.y);
Handled := True;
end;
end;
end;
end;




Fishman

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