|
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
ckp6250
註冊時間: 2004-07-30 文章: 1644
第 1 樓
|
發表於: 星期六 九月 07, 2013 4:40 pm 文章主題: 幫 Grid 加上列號 |
|
|
這篇太爛啦,已被狠狠拋棄,請改看http://vfp.sunyear.com.tw/viewtopic.php?t=6184
幫 Grid 加上列號,如圖,第一欄『列次』那一欄即是列號
不用大動作修改您的程式,列號不受 set filter 或 se deleted 或 set order 影響,都能正確地從一而終
程式碼不大,不到50行,使用方法也簡單,只有三個動作
procedure grid.init
.......
您自己的程式碼
......
AddRowNo4Grid(this,1) &&加上這一行
endproc
另外
procedure grid.mouseup
.......
您自己的程式碼
......
this.setfocus &&加上這一行
endproc
procedure grid.MouseWheel
.......
您自己的程式碼
......
&&加上底下這三行
nodefault
this.DoScroll(IIF(nDirection>0,2,3))
this.SetFocus
endproc[/quote]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
這支程式有4個大中小缺點
1.小缺點:列號那一欄,若 mouse 點進去時,列號會變成空白,不知道有沒有辦法抑止使用者點進去?(感謝sean27 指點,此項已解決)
2.中缺點:用pageup , pagedown , 捲軸 來移動列數,都能即時呈現列號,但如果是用 mouse 的滾輪來捲動的話,新頁的列號會暫時空白,必需等 grid被 setfocus 時,才會秀出列號,雖然不是很嚴重,但總是不很專業(感謝garfield指點,這也解決了)
3.大缺點,如果 Reccount()在超過一萬筆以上時,越捲到後面(比如捲到8,9千筆時),螢幕顯示速度會拖慢
4.小缺點:如果暫時離開Grid,比如去點Form上的某個物件時,所在列的該列列號會暫時空白,必需等返回grid時,才會再秀出列號
以上這四項缺點,想請各位先進幫忙改進,或者您有更佳方案,也請不吝指教
最後,向板主抱怨一下,圖檔限制100K,實在太小氣了,(好歹也要100M才是)為了符合規範,又縮又裁,弄得醜不拉嘰
代碼: |
*!* ShowRowType4Grid = 0 不顥示 1 在第一欄 2 在最後一欄
Function AddRowNo4Grid
Lparameters oGrid,ShowRowType4Grid
If ShowRowType4Grid = 0 Or Reccount()=0
Return .F.
Endif
ShowRowType4Grid = Iif(Reccount()>10000,2,ShowRowType4Grid) &&若資料量大於10000筆時,將其置右,以免拖慢顯示速度
With oGrid
.AddColumn(.ColumnCount)
With .Columns(.ColumnCount)
.Bound = .F.
.ControlSource = "Thisform."+oGrid.name+".ActiveRow"
.FontSize=12
.FontName = "Times New Roman"
.FontBold = .T.
.ForeColor = Rgb(139,139,139)
.BackColor =Rgb(240,240,240)
.Enabled = .F.
.ReadOnly=.T.
.SelectOnEntry = .F.
.Alignment=2
.InputMask = '@Z 999999'
.Width=Max((Len(Transform(Reccount()))*.FontSize) , 42)
.ColumnOrder = .Parent.ColumnCount
.DynamicFontBold = "Mod(this.ActiveRow,10)=0 AND this.ActiveRow>0"
.DynamicBackColor = "icase(Mod(this.ActiveRow,10)=0 AND this.ActiveRow>0,RGB(220,220,220),this.ActiveRow=0,RGB(255,255,255),RGB(240,240,240))"
.text1..ControlSource = "Thisform."+oGrid.name+".ActiveRow"
With .Header1
.Caption="列次"
.FontSize=12
.FontName = "細明體"
.Alignment=2
.ForeColor = Rgb(139,139,139)
.BackColor = Rgb(240,240,240)
Endwith
Endwith
*!* 將列號調到第一欄
If ShowRowType4Grid = 1
For i = 1 To .ColumnCount
.Columns(i).ColumnOrder = Iif(i=.ColumnCount,1,i+1)
Next
.LockColumns = .LockColumns + 1
Endif
Endwith
Return .T.
|
ckp6250 在 星期日 九月 15, 2013 10:33 am 作了第 11 次修改 |
|
回頂端 |
|
|
sean27
註冊時間: 2008-08-17 文章: 49
第 2 樓
|
發表於: 星期六 九月 07, 2013 10:19 pm 文章主題: |
|
|
>>1.小缺點:列號那一欄,若 mouse 點進去時,列號會變成空白,不知道有沒有辦法抑止使用者點進去?
這個問題可以將 .ControlSource = "This.ActiveRow"
改成 .ControlSource = "ThisFORM.GRID_NAME.ActiveRow"
GRID_NAME 是該 GRID 的NAME 如 grid1 ,
Function AddRowNo4Grid 是公用程式, 可將 grid name 用變數傳入
另可在 With .Columns(.ColumnCount) 下加上 .text1.enabled=.f. _________________ foxpro & php 初學者 |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1644
第 3 樓
|
發表於: 星期六 九月 07, 2013 10:41 pm 文章主題: |
|
|
感謝sean27
您提的這二項,當初就都試過了,行不通地
我把 enabled , when , click , mousedown ...都試過一遍了,就是沒法控制不讓使用者點入
又,我的grid 本來就是用物件帶進去的
AddRowNo4Grid(this,1) |
|
回頂端 |
|
|
sean27
註冊時間: 2008-08-17 文章: 49
第 4 樓
|
發表於: 星期六 九月 07, 2013 11:33 pm 文章主題: |
|
|
這個問題可以將 .ControlSource = "This.ActiveRow"
改成 .ControlSource = "ThisFORM.GRID_NAME.ActiveRow"
如圖所示! _________________ foxpro & php 初學者 |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1644
第 5 樓
|
發表於: 星期日 九月 08, 2013 10:12 am 文章主題: |
|
|
十分感謝sean27
這個問題解決了,程式碼也一併修正了
另外二點,能再幫忙解決嗎? |
|
回頂端 |
|
|
DennisTsai
註冊時間: 2005-07-26 文章: 176
第 6 樓
|
發表於: 星期一 九月 09, 2013 8:03 am 文章主題: |
|
|
用.ACTIVEROW,2,3項絕對不可能解決
CURSOR先算好才是正途 |
|
回頂端 |
|
|
jerryclt
註冊時間: 2009-03-10 文章: 334 來自: 佛心來的
第 7 樓
|
發表於: 星期一 九月 09, 2013 8:20 am 文章主題: |
|
|
可否在 列次 的地方用一個 透明的container 複蓋在上面? |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1644
第 8 樓
|
發表於: 星期一 九月 09, 2013 9:41 am 文章主題: |
|
|
DennisTsai 寫到: | 用.ACTIVEROW,2,3項絕對不可能解決
CURSOR先算好才是正途 |
絕對不能用 RecNo()做列次,我搜尋了許多文章,也都這麼教,但這根本行不通!
只要執行時,一個 set filter , set order , set delete , 就全玩完了
其次,grid 的來源,也不必然是 cursor , 若是實體table呢? |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1644
第 9 樓
|
發表於: 星期一 九月 09, 2013 9:42 am 文章主題: |
|
|
jerryclt 寫到: | 可否在 列次 的地方用一個 透明的container 複蓋在上面? |
請道其詳 |
|
回頂端 |
|
|
garfield Site Admin
註冊時間: 2003-01-30 文章: 2157
第 10 樓
|
發表於: 星期一 九月 09, 2013 11:04 am 文章主題: |
|
|
缺點2改進方式
procedure grid.MouseWheel
.......
您自己的程式碼
......
nodefault
this.DoScroll(IIF(nDirection>0,2,3))
this.SetFocus
endproc _________________ 利用>>搜尋<<的功能會比問的還要快得到答案. |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1644
第 11 樓
|
發表於: 星期一 九月 09, 2013 11:46 am 文章主題: |
|
|
感謝garfield指點
這可行,又解決了一個問題
其實,我之前也有用到grid.MouseWheel,
但我只想到 this.SetFocus
沒想到上二行指令耶
還剩下二個缺點(找到第四項啦),請幫幫忙 |
|
回頂端 |
|
|
saint
註冊時間: 2003-07-14 文章: 211
第 12 樓
|
發表於: 星期一 九月 09, 2013 2:06 pm 文章主題: Re: 幫 Grid 加上列號 |
|
|
ckp6250 寫到: |
3.大缺點,如果 Reccount()在超過一萬筆以上時,越捲到後面(比如捲到8,9千筆時),螢幕顯示速度會拖慢
|
user 會拉到這麼多筆?? |
|
回頂端 |
|
|
ckp6250
註冊時間: 2004-07-30 文章: 1644
第 13 樓
|
發表於: 星期一 九月 09, 2013 3:11 pm 文章主題: |
|
|
回saint
比如存貨代碼流覽,超過一二萬筆很正常,
如果是網頁程式或讀取遠端Sql Server的話,我們當然會做分頁
可是在桌面軟體上,讀取dbf , VFP流覽幾十萬筆都很快,沒必要搞分頁
問題就來了,加上列號後,捲到越後面時,螢幕反應就變很慢啦 |
|
回頂端 |
|
|
jerryclt
註冊時間: 2009-03-10 文章: 334 來自: 佛心來的
第 14 樓
|
發表於: 星期二 九月 10, 2013 9:36 am 文章主題: |
|
|
小弟很好奇,
這個列次的實際用途為何?
另外,
上文小弟提到的 container 是為了解決第一個缺點的小小建議,
把 列次 蓋住了,
使用者就點不到它, 不是嗎? |
|
回頂端 |
|
|
saint
註冊時間: 2003-07-14 文章: 211
第 15 樓
|
發表於: 星期二 九月 10, 2013 10:44 am 文章主題: |
|
|
ckp6250 寫到: | 回saint
可是在桌面軟體上,讀取dbf , VFP流覽幾十萬筆都很快,沒必要搞分頁
問題就來了,加上列號後,捲到越後面時,螢幕反應就變很慢啦
|
這果然是VFP才有的特異功能
|
|
回頂端 |
|
|
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|