如何在程式一啟動時讓CapsLock大寫鍵亮起來? |
答題得分者是:careychen
|
cindyliu
一般會員 ![]() ![]() 發表:16 回覆:18 積分:6 註冊:2008-09-17 發送簡訊給我 |
我程式的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 發送簡訊給我 |
呵,我有找到你使用的 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 發送簡訊給我 |
|
careychen
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:41 回覆:580 積分:959 註冊:2004-03-03 發送簡訊給我 |
這個是列舉,你可以把這個寫在 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 發送簡訊給我 |
我有試著換了很多位置了..結果還是不行耶~
錯誤訊息是: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 發送簡訊給我 |
[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 發送簡訊給我 |
那我說明一下好了
第一種方式: 如果 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 TKeyType = ............. procedure TForm1.SetLedState(KeyCode: TKeyType .... begin end; 這樣的解釋不知道您明白嗎?
------
價值的展現,來自於你用哪一個角度來看待它!! |
cindyliu
一般會員 ![]() ![]() 發表:16 回覆:18 積分:6 註冊:2008-09-17 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |