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

UpDown元件使用的問題

答題得分者是:wameng
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-06 15:24:40 IP:219.132.xxx.xxx 未訂閱
大家好!我又來一個問題了(最近習作老是遇到一些問題的說) 請問 > 謝謝!
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-06 16:32:37 IP:61.222.xxx.xxx 未訂閱
估計有點難度。 需重寫 TUPDOWN 元件。 TScrollBar 能夠做到的原因,猜想應為 Windows 內部處理。 若要做到可利用 SetTimer 當 MouseEnter 時啟動。 並每隔一秒刷新元件畫面。 不過估計若要像 TScrollBar 閃爍,應該會很難看。黑黑一團與箭頭混淆。 建議效果 滑鼠移至箭頭,HighLight 顯示。 較容易。並且不影響程式效能。 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-06 17:53:55 IP:219.137.xxx.xxx 未訂閱
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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-06 18:17:16 IP:61.70.xxx.xxx 未訂閱
您好: 小弟幫忙翻譯一下.
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-06 18:37:10 IP:219.137.xxx.xxx 未訂閱
多謝 supman 的熱心轉譯,原來您也是 Delphi 與 BCB 的雙修高手啊,呵呵~好個真人不露相,希望我也能像您一樣精通雙語,那用 BCB 寫起程式就能更加的得心應手囉~
supman
尊榮會員


發表:29
回覆:770
積分:924
註冊:2002-04-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-06 19:38:05 IP:203.204.xxx.xxx 未訂閱
RedSnow大人過獎啦~小弟是混口飯吃,以前本來就是寫C的,後來退伍找了Delphi的工作@@,用一用感覺Delphi真好,編譯速度跟BCB差了10萬八千里,就比較少再用BCB了,目前在修C# VS.Net,多少也要接觸VB.Net,以後可能要n修了...>"< 不過多學多種語言比較好啦,上班寫一種,下班接案,寫n種...
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-06 19:48:40 IP:219.86.xxx.xxx 未訂閱
補充:    倒是沒想到可以用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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-06 20:29:04 IP:219.130.xxx.xxx 未訂閱
首先感謝wameng版主大人,RedSnow大大,supman大大的熱心回答.    測試報告:    我用Edit與UpDown結合用.將UpDown的屬性associate設為Edit1, 然後參考大大的程式,編譯運行,首先感歎效果比我想像中的要好 但是有發現一個問題,當一開始是 >
RedSnow
版主


發表:79
回覆:1322
積分:845
註冊:2003-12-15

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-06 22:53:19 IP:219.137.xxx.xxx 未訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-07 10:49:39 IP:61.222.xxx.xxx 未訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-07 11:01:51 IP:61.70.xxx.xxx 未訂閱
再插花一下: wameng大人抱歉,BitMap不是RenSnow的原意,是小弟嫌他醜才加上去的,剛寫的時候有想到要去釋放他,寫玩了,也忘了...@@"拍謝..
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-07 13:43:19 IP:219.130.xxx.xxx 未訂閱
非常感謝wameng版主大人與RedSnow,supman兩位大大的幫助,問題解決了! 效果還不錯! 謝謝謝謝謝謝!
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-07 17:07:00 IP:61.222.xxx.xxx 未訂閱
to RedSnow 及 supman 兄: sorry ! 最近老是迷迷糊糊的。 不過黑白閃爍效果,沒錯!是有點難看。 to zxy666666 : 這題給分,應為RedSnow 兄。 畢竟是RedSnow 兄所提供的 Caret作法。(我也沒想到) 卻是沒幫上什麼忙!頂多搖旗吶喊。呵呵..... ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
zxy666666
中階會員


發表:108
回覆:150
積分:86
註冊:2005-01-14

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-06-07 17:31:34 IP:219.130.xxx.xxx 未訂閱
wameng版主大人您好!    其實我很感謝RedSnow大大與supman大大,當然還有您老人家了.每次都承蒙您們的照顧.    辛苦幾位了,雖然我到現在還不太明白大大們說的什麼Caret作法,但是我一定會再去好好查資料學習.真都不知如何答謝~真想給每個人都加分~    這次還請RedSnow大大與supman大見諒啦!    
系統時間:2024-06-30 23:14:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!