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

如何在程式一啟動時讓CapsLock大寫鍵亮起來?

答題得分者是:careychen
cindyliu
一般會員


發表:16
回覆:18
積分:6
註冊:2008-09-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-09-18 00:09:08 IP:118.166.xxx.xxx 訂閱
我程式的TEdit原本都有設CharCase屬性為ecUpperCase,讓使用者都輸入大寫~
但是最近有個新需求是:
程式還是預設大寫,但是使用者還是可以按CapsLock隨時切換大小寫

也就是讓程式一開啟FormCreat的時候大寫鍵(CapsLock)就亮起來
如果使用者打到一半想輸入小寫的時候再自己按掉切換

我在網路上找到下面這段控制CapsLock的程式碼
我把程式碼貼在FormCreate做測試
可是會錯在第8行....CapsLockStatus := KeyState;
註解掉這行的話程式雖然可以預設大寫,不過CapsLock並沒有亮起來
這時候如果自已按CapsLock讓燈亮起來的話反而卻變成小寫,完全相反了~

不曉得問題是出在哪裡?

這是第一次發表文章,如果有po錯地方的話~請大家指正~謝謝^^


[code delphi]
procedure TMainForm.StudentLookupEnter(Sender: TObject);
Var Level : Integer;
KeyState : TKeyBoardState;
begin
{check if caps-lock is on - if not turn it on}
Level := GetKeyState(VK_CAPITAL);
GetKeyboardState(KeyState);
CapsLockStatus := KeyState;
If Level = 0 then
begin
KeyState[VK_CAPITAL] := 1;
setKeyboardState(KeyState);
end;
end;

[/code]
編輯記錄
cindyliu 重新編輯於 2008-09-18 00:16:22, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-18 00:26:52 IP:59.126.xxx.xxx 訂閱
呵,我有找到你使用的 Sample Code
不過,用 Google 搜尋的話,請記得多看幾篇,因為你找的位置再往下一點就是這篇了
你 Copy 的這篇有個地方可能是作者沒注意,他的寫法是用在【非 NT 】 平台的,
所以你用了之後會錯應該是這個原因

http://en.allexperts.com/q/Delphi-1595/Turning-Caps-Lock-Num.htm

===================引 用 cindyliu 文 章===================
我程式的TEdit原本都有設CharCase屬性為ecUpperCase,讓使用者都輸入大寫~
但是最近有個新需求是:
程式還是預設大寫,但是使用者還是可以按CapsLock隨時切換大小寫

也就是讓程式一開啟FormCreat的時候大寫鍵(CapsLock)就亮起來
如果使用者打到一半想輸入小寫的時候再自己按掉切換

我在網路上找到下面這段控制CapsLock的程式碼
我把程式碼貼在FormCreate做測試
可是會錯在第8行....CapsLockStatus := KeyState;
註解掉這行的話程式雖然可以預設大寫,不過CapsLock並沒有亮起來
這時候如果自已按CapsLock讓燈亮起來的話反而卻變成小寫,完全相反了~

不曉得問題是出在哪裡?

這是第一次發表文章,如果有po錯地方的話~請大家指正~謝謝^^


[code delphi]
procedure TMainForm.StudentLookupEnter(Sender: TObject);
Var Level : Integer;
KeyState : TKeyBoardState;
begin
{check if caps-lock is on - if not turn it on}
Level := GetKeyState(VK_CAPITAL);
GetKeyboardState(KeyState);
CapsLockStatus := KeyState;
If Level = 0 then
begin
KeyState[VK_CAPITAL] := 1;
setKeyboardState(KeyState);
end;
end;

[/code]
------
價值的展現,來自於你用哪一個角度來看待它!!
cindyliu
一般會員


發表:16
回覆:18
積分:6
註冊:2008-09-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-09-20 01:59:40 IP:118.166.xxx.xxx 訂閱
careychen~很謝謝您的幫忙...

今天下班回家抽控測試一下~
您po的網址的第一行程式:
type TKeyType = (ktCapsLock, ktNumLock, ktScrollLock);

我不懂這句的意思以及要寫在哪裡耶...
編輯記錄
cindyliu 重新編輯於 2008-09-20 02:00:26, 註解 無‧
cindyliu 重新編輯於 2008-09-20 02:02:12, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-09-20 09:27:47 IP:218.210.xxx.xxx 訂閱
這個是列舉,你可以把這個寫在  uses xxxx 的下面,
例如:

uses windows, Message, Sysutils........;

type
TForm1=Class(TForm)
.....
...
end;

TKeyType = (ktCapsLock, ktNumLock, ktScrollLock); // 加在這邊


===================引 用 cindyliu 文 章===================
careychen~很謝謝您的幫忙...

今天下班回家抽控測試一下~
您po的網址的第一行程式:
type TKeyType = (ktCapsLock, ktNumLock, ktScrollLock);

我不懂這句的意思以及要寫在哪裡耶...
------
價值的展現,來自於你用哪一個角度來看待它!!
cindyliu
一般會員


發表:16
回覆:18
積分:6
註冊:2008-09-17

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-09-20 23:05:30 IP:118.166.xxx.xxx 訂閱
我有試著換了很多位置了..結果還是不行耶~
錯誤訊息是:Expected ':' but '=' found.

[code delphi]
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
TKeyType = (ktCapsLock, ktNumLock, ktScrollLock);
procedure Button1Click(Sender: TObject);
procedure SetLedState(KeyCode: TKeyType; bOn: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
{$R *.dfm}[/code]
pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-21 06:59:49 IP:220.141.xxx.xxx 訂閱

[code delphi]
unit Unit1;

interface

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

type
TKeyType = (ktCapsLock, ktNumLock, ktScrollLock);
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton; procedure SetLedState(KeyCode: TKeyType; bOn: Boolean);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;





var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SetLedState(KeyCode: TKeyType; bOn: Boolean);

var
KBState: TKeyboardState;
Code: Byte;
begin
case KeyCode of
ktScrollLock: Code := VK_SCROLL;
ktCapsLock: Code := VK_CAPITAL;
ktNumLock: Code := VK_NUMLOCK;
end;
GetKeyboardState(KBState);
if (Win32Platform = VER_PLATFORM_WIN32_NT) then
begin
if Boolean(KBState[Code]) <> bOn then
begin
keybd_event(Code,
MapVirtualKey(Code, 0),
KEYEVENTF_EXTENDEDKEY,
0);

keybd_event(Code,
MapVirtualKey(Code, 0),
KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP,
0);
end;
end
else
begin
KBState[Code] := Ord(bOn);
SetKeyboardState(KBState);
end;
end;

// Led全部打開
procedure TForm1.Button1Click(Sender: TObject);
begin
SetLedState(ktCapsLock, True); // CapsLock on
SetLedState(ktNumLock, True); // NumLock on
SetLedState(ktScrollLock, True); // ScrollLock on
end;

// Led全部關掉
procedure TForm1.Button2Click(Sender: TObject);
begin
SetLedState(ktCapsLock, false); // CapsLock off
SetLedState(ktNumLock, false); // NumLock off
SetLedState(ktScrollLock, false); // ScrollLock off
end;

end.

[/code]
------
努力會更接近成功
編輯記錄
pceyes 重新編輯於 2008-09-21 07:03:06, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-09-21 17:52:51 IP:59.126.xxx.xxx 訂閱
那我說明一下好了

第一種方式:
如果 Type 的定義內容,你是如 Sample code 的方式來寫的話

也就是寫在 implementation 底下的話,其實是沒有 TForm1 的 Class 哦!!

Sample Code

implementation

type
TKeyType = .............

procedure SetLedState... // 注意,本 procedure 並沒有 TForm1 當開頭!!!
begin
.........
end;

procedure TForm1.Button1Click........
begin
// 呼叫上面的 procedure 就可以直接叫用!!!!
SetLedState(ktCapsLock, true);
end;


第二種方式,如你自己的程式與 pceyes 大的程式

在上面的宣告是如此
type
TKeyType = (ktCapsLock, ktNumLock, ktScrollLock); // 因為這邊有宣告
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure SetLedState(KeyCode: TKeyType; bOn: Boolean); // 所以這邊才認的到!!!!
private
{ Private declarations }
public
{ Public declarations }
end;

implementation

type
TKeyType = .............
// 這邊就不必了,因為轉到上面去了


procedure TForm1.SetLedState(KeyCode: TKeyType ....
begin
end;


這樣的解釋不知道您明白嗎?
------
價值的展現,來自於你用哪一個角度來看待它!!
cindyliu
一般會員


發表:16
回覆:18
積分:6
註冊:2008-09-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-09-21 23:02:25 IP:118.166.xxx.xxx 訂閱
careychen~
二種方式我都run過囉..終於ok了~
很謝謝您的幫忙!! ^^

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