cxGrid使用经验记录(本来放在blogspot,无奈现在不能访问)

1、在我參與的一個項目中,有使用cxGrid搭配TMS的officePager。踫到這樣的狀況:
1)、cxGrid.View.OptionBehavior中的alwaysShowEditor設為True;
2)、cxGrid的欄位足夠多,使得可以產生ScrollBar;
3)、將焦點focused到最右邊的一欄,此時左右拉動scrollbar,會出現畫面殘留的狀況;
此問題,後來查出,是因爲TMS的關係,說要改控件。後來總監建議在View.LeftPosChange事件中,加此代碼即可:
View.Invalidate(True);
2、欄位檢查 + 點擊ScrollBar的問題
在我們的項目中,經常會在欄位離開時做檢查,若檢查不通過,則會abort並再focus到此欄位。此做法與一般控件結合,還ok。但與cxGrid結合,當點擊cxScrollBar時,若欄位檢查失敗,則不會focus到cxgird,abort之後會出現mouse被capture的狀況,連程式都不能關閉。
下面先説明一下,focus問題,以利理解問題產生的原因:
在delphi中,兩個元件(有焦點的)之間焦點的切換,如A-〉B,會經過以下過程:
1、A收到消息WM_KillFocus,只是做了輸入法的切換;
2、B收到消息WM_SetFocus,先Form.SetFocusedControl(Self),然後執行輸入法切換;
3、Form.SetFocusedControl(Self)首先執行維護Screen全局對象的成員數據,然後
FocusHandle := FFocusedControl.Handle;
FFocusedControl := FFocusedControl.Parent;
SendFocusMessage(FocusHandle, CM_EXIT)
FFocusedControl 是form的成員,此時還是上一個獲得焦點的控件,所以先通知cm_Exit;
4、A控件收到CM_Exit,觸發離開事件,進而執行我們的程式碼;

以上是大致過程,由於cxScrollBar在滾動前會setCapture,但之後出發了A控件的Exit,而Abort。所以後續恢復capture的動作丟失,導致此狀況的發生。
解決方式是,在cxGrid.View.LeftPosChange事件加此代碼 ReleaseCapture即可

目前操作 GRID 可行作法
控制Cell 可否編輯
在以下兩個地方同時設置 Column .Options.Focusing 的屬性值
cxGridDBTableView.OnFocusedItemChanged
cxGridDBTableView.OnFocusedRecordChanged

控制 Cell 顏色
(比如可輸入不可輸入的顏色區別)
cxGridDBTableViewColumn.OnStylesGetContentStyle

控制 Cell 顯示字串
(比如 輸入 “1” 顯示 “借” 輸入 “2” 顯示 “貸”)
cxGridDBTableViewColumn.On GetDisplayText

同一Column依據不同的資料顯示不同的輸入元件
(比如部分要出現 Button , 部分不要)
cxGridDBTableViewColumn.OnBtnPrvGetProperties
搭配 TcxEditRepository 使用

控制 Cell 輸入檢查
cxGridDBTableViewColumn. OnValidate
DisplayValue 有很大的機會會是null , 要使用 DisplayValue :=
VarToStr(DisplayValue)

增行
cxGrid.FocusedView.DataController.Append;
刪行
cxGrid.FocusedView.DataController.DeleteSelection;
模組會自動判斷刪到最後一行時會自動再執行一次增行
插行
cxGrid.FocusedView.DataController.Insert;

停止編修狀態
儲存前要呼叫 , 最後一個編修欄位的值才會存入 , 多餘的空白行才會刪除
cxGrid.FocusedView.DataController.CheckBrowseMode;


判斷目前哪一個 Grid 有 Focuse
cxGridOne.IsFocused

如何不引發錯誤的狀況下 , 不離開該 Cell 並forus自己
比如提示使用者選擇 Yes No, 選擇 Yes 離開 , 選擇 No 不離開
Error := True;
Abort

Focus Other Cell 沒辦法進edit(只會匡住那個Cell)?
在 Before Post 不要舉發例外 , 改用 Abort 即可

要連代異動其它欄位時自己也要手動給值,不然會存不下來
比如在 FAC1017 的 OnValidate 要更新 FAC1007:
vtMaster.Edit;
vtMaster.FieldByName('FAC1017').AsString := DisplayValue;
vtMaster.FieldByName('FAC1007').AsString := '0';
vtMaster.Post;

一對多維護按修改兩次 , 第一次會停在 Grid 並有游標 , 第二次無法 Focus
在按下修改時強制設定 Grid.TabStop := True;
(未知情況此屬性被設成 False)
目前操作 GRID 遇到的問題
OnValidate 輸入檢查
1. DisplayValue 有很大的機會會是null 要特別處理 , VarToStr
2. Cell 一定要有修改才會觸發
(目前的解法是,OnValidate 照作, 在儲存前模組會呼叫共用函式
重新針對每個Cell 作檢查—每一筆每一列)

你可能感兴趣的:(null,button,Delphi)