UpDown元件使用的問題 |
答題得分者是:wameng
|
zxy666666
中階會員 ![]() ![]() ![]() 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
|
wameng
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
RedSnow
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
zxy666666 妳好: 妳要的動作可以使用 Caret 來模擬,我剛才以 BCB 做過測試確定可行,但是 Delphi 我不熟悉,不知道改寫後是否正確?妳試試看吧:
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType); var X, Y: Integer; begin CreateCaret(UpDown1.Handle, NULL, UpDown1.Width-4, (UpDown1.Height div 2)-4); X := 2; if Button = Comctrls::btNext then Y := 2; else Y := (UpDown1.Height div 2) 3; end; ShowCaret(UpDown1.Handle); SetCaretPos(X, Y); end; 以下是我的 BCB 敘述,如果上述改寫的 Delphi 有誤的話,妳可以對照著修改一下: void __fastcall TForm1::UpDown1Click(TObject *Sender, TUDBtnType Button) { CreateCaret(UpDown1->Handle, NULL, UpDown1->Width-4, (UpDown1->Height/2)-4); int X=2; int Y; if(Button == Comctrls::btNext){ Y = 2; }else{ // Button = btPrev Y = (UpDown1->Height/2) 3; } ShowCaret(UpDown1->Handle); SetCaretPos(X, Y); } |
supman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
您好:
小弟幫忙翻譯一下.
procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType); var X, Y: Integer; CaretBmp:TBitmap; CaretColor:int64; begin CaretColor:=clBlue; CaretBmp:=TBitmap.Create; With CaretBmp do begin Width:=UpDown1.Width-4; Height:=(UpDown1.Height div 2)-4; Canvas.Brush.Color := CaretColor; Canvas.FillRect(Canvas.ClipRect); end; CreateCaret(UpDown1.Handle,CaretBmp.Handle,UpDown1.Width-4,(UpDown1.Height div 2)-4); X:=2; if (Button=Comctrls.btNext) then Y:=2 else Y:=(UpDown1.Height div 2) 3; ShowCaret(UpDown1.Handle); SetCaretPos(X, Y); end; |
RedSnow
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
|
supman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
|
wameng
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
補充: 倒是沒想到可以用ShowCaret 的方式。(並且好像誤會題意) 不過看了程式碼,有了一個小問題。
就是重複點擊,資源沒有正確的釋放可能會造成GDI資源不足。 我做了一點修改,RedSnow兄勿怪才是。
.... private CaretBmp : TBitmap; public end; ... procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType); var Y: Integer; begin With CaretBmp do begin Width := UpDown1.Width-4; Height := (UpDown1.Height div 2) - 4; Canvas.Brush.Color := clBlue; Canvas.FillRect(Canvas.ClipRect); end; CreateCaret(UpDown1.Handle,CaretBmp.Handle ,UpDown1.Width-4,(UpDown1.Height div 2)-4); if (Button=Comctrls.btNext) then Y:=2 else Y:=(UpDown1.Height div 2) 3; ShowCaret(UpDown1.Handle); SetCaretPos(2, Y); end; procedure TForm1.FormCreate(Sender: TObject); begin CaretBmp := TBitmap.Create; end; procedure TForm1.FormDestroy(Sender: TObject); begin CaretBmp.Free; end;~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ 發表人 - wameng 於 2005/06/06 19:51:08 |
zxy666666
中階會員 ![]() ![]() ![]() 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
|
RedSnow
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:79 回覆:1322 積分:845 註冊:2003-12-15 發送簡訊給我 |
supman 您好: 聽您這麼一說,倒也勾起了我一些回憶,算算我也是屬於 "多修" 成員之一啦~我前前後後玩過的電腦語言也不下十種,但是全部都不精就是了,時間久了之後,全都仍到一邊去啦,僅留下些許回憶罷了....。 wameng 版主您好: 大家集思廣益、相互學習,我高興都來不及了,何怪之有?您不怪我這個 Delphi 的外行人來攪局就不錯啦....。 其實我原先的程式在 CreateCaret() 的 hBitmap 參數處以 NULL 來處理,其實也有點偷懶,也就是不想寫得太複雜,所以才會將 CreateCaret() 與 ShowCaret() 都寫在 OnClick 事件中,反正 Caret 使用的是共用的資源空間,應該不會有釋放資源與否的問題。 zxy666666 妳好: 妳發現的這個問題,也是我現在所困擾的,原先我以為是在某種未知的情形下使得 Focus 跑掉了,所以使用 SetFocus() 來強迫 UpDown 元件取得 Focus,但是後來發現當 Position 值等於 Min 的值,再點選向下鍵時 (或是 Position 值等於 Max 的值,再點選向上鍵時也是一樣的),根本就不會觸發 OnClick 事件。 我剛才試過將原處理程序改放到 OnMouseDown 或是 OnMouseUp 事件中,測試過程有點亂,我再重新將測試的敘述整理如下 (真對不起,我還是僅能提供 BCB Code,但是變動處不大,希望妳能看得懂):
void __fastcall TForm1::UpDown1MouseDown(TObject *Sender, TMouseButton Button, TShiftState Shift, int X, int Y) { int X2 = 2; int Y2; if(Y <= (UpDown1->Height/2)){ // 向上鍵被按下 Y2 = 2; }else{ Y2 = (UpDown1->Height/2) 3; } if(!ShowCaret(UpDown1->Handle)){ CreateCaret(UpDown1->Handle, NULL, UpDown1->Width-4, (UpDown1->Height/2)-4); ShowCaret(UpDown1->Handle); } SetCaretPos(X2, Y2); }因為工具種類與版本有差異,我不能確定在妳那邊執行的結果會不會有其它的問題?妳再試試看吧。 |
wameng
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
to RedSnow 兄 當然 Caret 是共用資源。可以不管它。
但 BITMAP 卻是要注意的。 to zxy666666
以下已改為 Delphi Code 並加入 SetFocus 的處理。
我以試過,應無問題。
procedure TForm1.UpDown1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var Y2 : Integer; begin if Visible and (Not UpDown1.Focused) then UpDown1.SetFocus; if Y<=(UpDown1.Height shr 1) then Y2 := 2 else Y2 := (UpDown1.Height shr 1) 3; if Not ShowCaret(UpDown1.Handle) then begin CreateCaret(UpDown1.Handle,0,UpDown1.Width - 4, (UpDown1.Height shr 1) - 4); ShowCaret(UpDown1.Handle); end; SetCaretPos(2, Y2); end;不過少了CareBMP ,畫面會是黑白閃爍。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~ |
supman
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:770 積分:924 註冊:2002-04-22 發送簡訊給我 |
|
zxy666666
中階會員 ![]() ![]() ![]() 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
|
wameng
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:31 回覆:1336 積分:1188 註冊:2004-09-16 發送簡訊給我 |
|
zxy666666
中階會員 ![]() ![]() ![]() 發表:108 回覆:150 積分:86 註冊:2005-01-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |