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

ComboBox的下拉選單的起始位置

缺席
shininggod
一般會員


發表:16
回覆:20
積分:17
註冊:2009-05-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-09-21 03:07:04 IP:99.243.xxx.xxx 訂閱
例如這個combobox.items有
-10
-9
-8
...
0
...
8
9
10

21個item,在使用者點個三角形的時候如何去改他下拉的起始位置,讓他可以從0開始選
可是又不動到原來的值(就跟滑鼠區拉那個scrollbar一樣)

如果改 itemindex, 連 .text 都會一起改

現在是想要從下拉的中間開始列,讓使用者自己去拉,因為常選的都是接近0那幾個
但是點下去之前又不能改到原來的值..
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-09-21 11:44:09 IP:61.66.xxx.xxx 訂閱
抱歉不懂你的意思!!
------
======================
昏睡~
不昏睡~
不由昏睡~
編輯記錄
ko 重新編輯於 2011-09-20 21:46:39, 註解 無‧
shininggod
一般會員


發表:16
回覆:20
積分:17
註冊:2009-05-13

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-09-21 14:01:14 IP:99.226.xxx.xxx 訂閱
的確形容的跟....一樣orz,而且是dbcombobox,不是標準的combobox orz...

dbcombobox右邊有一個向下的三角形,按下去會跳出一個listbox
如何控制這個listbox的預帶位置

點下去,他會從第一筆開始列
1.我想要他反白的直接選到中間那一筆(ex:第11筆),可是又不會改到他dbcombobox.text原本的資料
就跟滑鼠點下去自己拉那個scrollbar一樣

如果改dbcombobox.itemindex := 11, 他會掉到第11筆,可是dbcombobox.text也會變成第11筆的資料

2.更進一步,把第11筆擺在listbox的中間

例如dropdowncount 是7的話,點下去直接帶成這樣(右邊有scrollbar)
-3
-2
-1
0 <-這一行擺在listbox中間 反藍
1
2
3

我試過用postmessage在onDropDown模擬鍵盤的3上3下,實際用鍵盤按有效,他會往回三筆,反藍的又會再進到我想要的那一筆
可是在程式裡面寫就無效...往上3個ok,往下3個確會把整個往下scroll, 不是只把反藍的scroll,變成0還是在list的最上面

[code delphi]
procedure Tform1.TDBComboBox1DropDown(Sender: TObject);
begin
if (DBComboBox1.Text = '') then
begin
TDBComboBox1.ItemIndex := TDBComboBox1.Items.IndexOf('0');
//這是第11筆,不過會把原本的值改掉,所以只做空白...

//3上3下,不過失敗
PostMessage(TDBComboBox1.Handle, WM_KEYDOWN, VK_UP, 0);
PostMessage(TDBComboBox1.Handle, WM_KEYDOWN, VK_UP, 0);
PostMessage(TDBComboBox1.Handle, WM_KEYDOWN, VK_UP, 0);

PostMessage(TDBComboBox1.Handle, WM_KEYDOWN, VK_DOWN, 0);
PostMessage(TDBComboBox1.Handle, WM_KEYDOWN, VK_DOWN, 0);
PostMessage(TDBComboBox1.Handle, WM_KEYDOWN, VK_DOWN, 0);
end;
end;
[/code]

能不能取得那個listbox的屬性,能的話就很好調了Orz
編輯記錄
shininggod 重新編輯於 2011-09-21 00:01:54, 註解 無‧
shininggod 重新編輯於 2011-09-21 00:02:31, 註解 無‧
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-09-21 14:42:01 IP:61.66.xxx.xxx 訂閱
基本上按下三角下拉後list也是出現在輸入攔正下方
只要滑鼠指向要到你說的位置,注意是滑鼠非index喔
除非你把下拉的動作改成右鍵..
在改用popup來設定可能可行喔
------
======================
昏睡~
不昏睡~
不由昏睡~
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-09-28 22:36:32 IP:118.169.xxx.xxx 未訂閱
你這個理論就好像是我要開車, 但不能用輪子一樣的予盾, 為什麼呢?

dbcombobox 本身就已與 datasoruce 連接在一起連動了(除非你不指定datasource),移動了index, bcombobox就會動記錄指標,
你想做到所要的功能, 請你改為 combobox 很容易就可以達成
否則, 不論你用什麼方式來指定, 一定都會與datasource 同步,
除非有我不知道的隱藏版功能存在, 或者採用其他第三方控件的元件來做
===================引 用 shininggod 文 章===================
例如這個combobox.items有
-10
-9
-8
...
0
...
8
9
10

21個item,在使用者點個三角形的時候如何去改他下拉的起始位置,讓他可以從0開始選
可是又不動到原來的值(就跟滑鼠區拉那個scrollbar一樣)

如果改 itemindex, 連 .text 都會一起改

現在是想要從下拉的中間開始列,讓使用者自己去拉,因為常選的都是接近0那幾個
但是點下去之前又不能改到原來的值..
編輯記錄
P.D. 重新編輯於 2011-09-28 08:38:14, 註解 無‧
shininggod
一般會員


發表:16
回覆:20
積分:17
註冊:2009-05-13

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-09-29 12:42:49 IP:99.226.xxx.xxx 訂閱
如果按下三角形,然後只用滑鼠拉那個scroll並不會動到TDBcombobox.Field.AsString
只是沒辦法直接對那個dropdown box做直接位置控制
這是我想要的結果,當然元件我絕對寫不出來...(核爆)

我當初的想法是用.handle去模擬鍵盤的上下,移到我要的位置就好
菜鳥一個,沒能力去改元件,只有想想偷懶(?)的辦法
PostMessage 不行, SendMessage也不行,keyboard event 竟然可以...orz
單純只移動,不會動到Field.AsString

[code delphi]
keybd_event(VK_UP,0,0,0);
keybd_event(VK_UP,0,KEYEVENTF_KEYUP,0);

keybd_event(VK_Down,0,0,0);
keybd_event(VK_Down,0,KEYEVENTF_KEYUP,0);
[/code]

onDropDown的時候會強制移動到現在的Field.AsString,
如果要移到0,要算距離中間值差多少index,好麻煩XD
如果值不存在於items裡面,又會從第一筆列

算差幾個是很簡單,但是下拉開的慢又有人會問...Orz

===================引 用 P.D. 文 章===================
你這個理論就好像是我要開車, 但不能用輪子一樣的予盾, 為什麼呢?

dbcombobox 本身就已與 datasoruce 連接在一起連動了(除非你不指定datasource),移動了index, bcombobox就會動記錄指標,
你想做到所要的功能, 請你改為 combobox 很容易就可以達成
否則, 不論你用什麼方式來指定, 一定都會與datasource 同步,
除非有我不知道的隱藏版功能存在, 或者採用其他第三方控件的元件來做
===================引 用 shininggod 文 章===================
例如這個combobox.items有
-10
-9
-8
...
0
...
8
9
10

21個item,在使用者點個三角形的時候如何去改他下拉的起始位置,讓他可以從0開始選
可是又不動到原來的值(就跟滑鼠區拉那個scrollbar一樣)

如果改 itemindex, 連 .text 都會一起改

現在是想要從下拉的中間開始列,讓使用者自己去拉,因為常選的都是接近0那幾個
但是點下去之前又不能改到原來的值..
senso
高階會員


發表:5
回覆:126
積分:226
註冊:2003-11-27

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-09-30 16:57:26 IP:61.219.xxx.xxx 訂閱
看到你用key_event,用滑鼠會不會比較簡單
雖然是ComboBox1自己改一下應該不難吧~

[code cpp]
void __fastcall TForm1::ComboBox1DropDown(TObject *Sender)
{
TPoint pt = ComboBox1->ClientToScreen(TPoint(0,0));
pt.x = ComboBox1->Width/2;
pt.y = ComboBox1->Height ComboBox1->ItemHeight*(ComboBox1->DropDownCount/2 0.5);
SetCursorPos(pt.x,pt.y);
}
[/code]
系統時間:2024-04-25 23:59:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!