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

ListView & ScrollBar 的配合問題

答題得分者是:RaynorPao
dotdot
版主


發表:29
回覆:142
積分:64
註冊:2002-08-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-28 11:08:32 IP:211.22.xxx.xxx 未訂閱
我的ListView 使用 vsReport 模式 在我新增Item時他會向下跑出一個Item 但是資料超出ListView 範圍時 他右邊的ScrollBar就會跑出來  但是他不會跟著我新增的Item往下跑     而我想要達到的目的就像是我程式設定哪個Item的Selected=true時 ScrollBar就會跑去顯示那個Item    有點像是在ListBox上的做法: ListBox1->ItemIndex=ListBox1->Items->Add("TEST")//這樣ScorllBar會跟著新增的Item跑 或是由USER直接指定    但是ListView 做得到嗎我試了好久 也找不到此應用範例 可否有相關經驗的大大指點範例
dotdot
版主


發表:29
回覆:142
積分:64
註冊:2002-08-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-28 18:24:06 IP:211.22.xxx.xxx 未訂閱
天阿~解不出來捏~我只試到 新增Item時把 scrollbar保持在最下面的地方 ListView1->Perform(WM_VSCROLL , SB_BOTTOM ,0); 或是SendMessage(ListView1->Handle, WM_VSCROLL, SB_LINEDOWN, NULL);    但是如果用程式指定讓某一Item的Selected=true要讓ScrollBar自動"滑" 過去還沒想到如何解
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-28 22:48:31 IP:61.221.xxx.xxx 未訂閱
引言: 天阿~解不出來捏~我只試到 新增Item時把 scrollbar保持在最下面的地方 ListView1->Perform(WM_VSCROLL , SB_BOTTOM ,0); 或是SendMessage(ListView1->Handle, WM_VSCROLL, SB_LINEDOWN, NULL); 但是如果用程式指定讓某一Item的Selected=true要讓ScrollBar自動"滑" 過去還沒想到如何解 < face="Verdana, Arial, Helvetica"> dotdot 你好: 試試看這樣做可不可以呢?? >>>>>>
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
dotdot
版主


發表:29
回覆:142
積分:64
註冊:2002-08-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-28 23:29:06 IP:61.70.xxx.xxx 未訂閱
解了解了~~跟我一樣費心找api的朋友們 不用浪費時間了 自己演算比較快 提供心得給大家 ~此做法不管你是用在 TMemo , ListBox ,ListView 只要有scrollbar的地方都 可以繁衍出很多做法跟功能~ 此ListView1=vsReport以下範例為假設你選擇某Item但是scrollbar已經移到別處 按下button後就會"滑"到該選取處 void __fastcall TForm1::Button9Click(TObject *Sender) { int sel_index = ListView1->Selected->Index;//被選擇的Index int scr_pos = GetScrollPos( ListView1->Handle, SB_VERT );//目前ScorllBar的pos(所在值) int ItemMax =ListView1->Items->Count;//Item的總數 int nu; if(ItemMax >= 16)//此16代表ListView1的高度可以容納16行 {// if(sel_index < scr_pos )//up area {nu = scr_pos - sel_index; for(int s=1 ; s <=nu; s ) ListView1->Perform(WM_VSCROLL,SB_LINEUP ,0); } if(sel_index > scr_pos )//down area {nu = sel_index - (scr_pos 15); for(int s=1 ; s<=nu ; s ) ListView1->Perform(WM_VSCROLL,SB_LINEDOWN ,0); } } } 觀念算法很簡單 稍稍做解釋不難發現ScrollBar的pos值就是目前在ListView上面看得到的第一行的Index值所以就歸類如下條件就通了 if 被選擇的index < Pos 則被選擇的資料在可視框框上方 if 被選擇的index > Pos (可視框框的總行數)則資料在可視框框下方 相信這兩個判斷條件就夠了^^
dotdot
版主


發表:29
回覆:142
積分:64
註冊:2002-08-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-28 23:30:58 IP:61.70.xxx.xxx 未訂閱
對了^^也感謝RaynorPao大大熱情回應
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-29 01:52:43 IP:61.221.xxx.xxx 未訂閱
引言: 解了解了~~跟我一樣費心找api的朋友們 不用浪費時間了 自己演算比較快 提供心得給大家 ~此做法不管你是用在 TMemo , ListBox ,ListView 只要有scrollbar的地方都 可以繁衍出很多做法跟功能~ 此ListView1=vsReport以下範例為假設你選擇某Item但是scrollbar已經移到別處 按下button後就會"滑"到該選取處 void __fastcall TForm1::Button9Click(TObject *Sender) { int sel_index = ListView1->Selected->Index;//被選擇的Index int scr_pos = GetScrollPos( ListView1->Handle, SB_VERT );//目前ScorllBar的pos(所在值) int ItemMax =ListView1->Items->Count;//Item的總數 int nu; if(ItemMax >= 16)//此16代表ListView1的高度可以容納16行 {// if(sel_index < scr_pos )//up area {nu = scr_pos - sel_index; for(int s=1 ; s <=nu; s ) ListView1->Perform(WM_VSCROLL,SB_LINEUP ,0); } if(sel_index > scr_pos )//down area {nu = sel_index - (scr_pos 15); for(int s=1 ; s<=nu ; s ) ListView1->Perform(WM_VSCROLL,SB_LINEDOWN ,0); } } } 觀念算法很簡單 稍稍做解釋不難發現ScrollBar的pos值就是目前在ListView上面看得到的第一行的Index值所以就歸類如下條件就通了 if 被選擇的index < Pos 則被選擇的資料在可視框框上方 if 被選擇的index > Pos (可視框框的總行數)則資料在可視框框下方 相信這兩個判斷條件就夠了^^
dotdot 你好: 也很感謝你的熱心分享喔 --
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
系統時間:2024-05-03 5:17:10
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!