VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

幫 Grid 加上列號
前往頁面 1, 2, 3  下一頁
 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
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 會拉到這麼多筆??
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
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才有的特異功能

Laughing
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
前往頁面 1, 2, 3  下一頁
1頁(共3頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作