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

有關 DBGrid 的 問題

答題得分者是:timhuang
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-06-20 16:51:19 IP:61.219.xxx.xxx 未訂閱
我希望能固定 DBGrid1 的一個欄位,參考了相關文章的方法,有兩個方法 1. TStringGrid(DBGrid1).FixedCols := 2; 2. Declare a type THack = class(TDBGrid). Then in run-time, do THack(DBGrid1).FixedCols := 2. Of course, you'd have to set it to 1 if you exclude dgIndicator from the Options in the grid component. 這兩種我都試過了,在 Delphi 6.0 (Win 2000) 不是很理想 從這裡我有沿伸出一些問題想請教各位 1. 一般 按 Home DBGrid 它會回到第一個欄位,按 End 會到最後一個欄位,如何使按 Home 回到第二欄位 2. 如何讓滑鼠無法移到指定的欄位,例如滑鼠移到第一個欄位要按左鍵時如讓它失效 3. 如果在程式中控制 DBGrid 的 ScrollBar, 例如要執行什麼指命可使得 ScrollBar 的位置由中間回到最左邊 謝謝
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-06-21 13:05:45 IP:61.62.xxx.xxx 未訂閱
1. 這個可以使用 onColEnter 的事件之中來檢查, 並跳離到第二個 column 即可, 如下:
procedure TForm1.DBGrid1ColEnter(Sender: TObject);
begin
  if DBGrid1.SelectedIndex = 0 then
    DBGrid1.SelectedIndex := 1;
end;
2. 可以在 CellClick 的事件來檢查, 並跳開即可, 如下:
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  if DBGrid1.SelectedIndex = 0 then
    DBGrid1.SelectedIndex := 1;
  if (DBGrid1.SelectedIndex = 4) or (DBGrid1.SelectedIndex = 5) then
    DBGrid1.SelectedIndex := 6;
end;
3. 可以直接送出 message 的方式來進行, 如下:
procedure TForm1.Button3Click(Sender: TObject);
begin
  SendMessage(DBGrid1.Handle, WM_HSCROLL, SB_TOP, 0);
end;
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-06-21 13:09:55 IP:61.62.xxx.xxx 未訂閱
補充一下, 第 2 點的回答, 前篇是利用檢查到不想被選取的 column 時, 就跳開, 其實也可以不理會, 改用下面的方式比較符合你問題的答案:    
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
  if (DBGrid1.SelectedIndex = 0) or (DBGrid1.SelectedIndex = 4) or (DBGrid1.SelectedIndex = 5)
    then exit;
end;
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-06-22 00:07:50 IP:218.187.xxx.xxx 未訂閱
你提供的程式我都試過了,確實有達到效果,非常謝謝。 但有一個現象不知你是否有察覺,還是你那邊不會有這情況,就是當程式一啟動後直接將滑鼠移到第一個欄位按左鍵時,此時游標竟會停在第一欄,但移動過後就不會了。我一度以為是因為 Focus 的關係但是測試後也是如此,我用 debug 觀察發現當第一次啟動程式後直接將滑鼠移到第一個欄位按左鍵時竟然沒有觸發OnColEnter and OnCellClick。 我後來直接在 FormShow 時先執行 DBGrid 的 OnColEnter and OnCellClick。就不會有此現象了。
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-22 00:34:32 IP:61.62.xxx.xxx 未訂閱
是的. 確實是有發生你敍述的現象 先引述一段 help 中的敍述:    OnCellClick occurs when the user releases the mouse. To take action when the user clicks down on the mouse, use the OnColEnter event.    所以我們可以知道 oncellclick 是要放開滑鼠按鈕時觸發, oncolenter 則是在滑鼠按下時就觸發了. 另外, oncolenter 是要在變動 column 時才會發生, 所以滑鼠在同一個欄位換不同 record 按來按去都只會觸發 oncellclick 哦~    至於你說的現象就比較好解釋了, 當 dbgrid 的目前編輯 cell 為某一格時, 當 dbgrid 失去焦點後, 再回來時, 若直接點選最後離開的那一格時, 就不會觸發 oncellclick 哦~ 你可以自行試試看就知道了. 所以當程式一開始時, dbgrid 總是將 cell 設定在左上角那一格, 即使沒有焦點的狀況下, 所以你點 1, 1 那格時, 是什麼事件也不會觸發的. 若你是一開始就不希望 user 可以將焦點設在第一個 column 時, 可以在 form activate 時, 將 dbgrid 的 selectedindex 設開即可!! 這也就是你先跑 oncellclick 或是 oncolenter 都可以的原因! 
懷舊的人
高階會員


發表:28
回覆:152
積分:141
註冊:2003-01-08

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-22 09:35:00 IP:152.104.xxx.xxx 未訂閱
非常感謝 謝謝 ! 我另外有關於一個 DBGrid 的問題當時忘了放在這邊,所以我另外提問題好了 再次感謝熱心指導
系統時間:2024-05-18 11:52:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!