FP專案技術收穫總結

ljm0211發表於2012-07-02
1、取得絕對行數的兩種方法;
     a.grdDetail.AddItemRowIndex(grdDetail.FirstRow) + grdDetail.Row
     b.grdDetail.AddItemRowIndex(grdDetail.BookMark)
    其中b方法只有當grdDetail處於AddItem模式時,才起作用。而且當要取得最後一行處於編輯狀態的行的絕對行數,應採用a方法,因為處於新增 狀態的行的BookMark透過grdDetail.BookMark,grddetail.AddItemBookmark是取不到的,而它的絕對行數 可以取到。在Update前新增行的BookMark可以說是沒有。當Update後新增行的BookMark產生,而它的絕對行數可以取到。

2、 在BeforeColUpdate事件中通常作一些資料格式的check動作;在AfterColUpdate事件中通常作一些根據某些已新增欄位向另一 個欄位插值的動作;在KeyPress事件中通常作一些輸入限制的動作和自動向某個欄位插入預設值的動作;在BeforeDelete事件中通常可以作給 使用者傳送友好的確認資訊的動作;
    程式碼如下:
'********************************************************************
'* Module             : SCMMSFD:grdDetail_BeforeDelete()
'* Author             : HI1\Kevin L Li
'* Function           : send a friendly message to user
'* Date Created       : 2005-8-26
'* Date Modified      :
'* Maint. Log         :
'********************************************************************
'* Input              :
'* Output             :
'* Process Flow       :
'********************************************************************
Private Sub grdDetail_BeforeDelete(Cancel As Integer, DispPromptMsg As Integer)
    
     ''' declare variable
     Dim lngC        As Long
     Dim vBkMark     As Variant
    
     Cancel = 1
     If MsgBox("Are you sure to delete the lines!", vbOKCancel + vbInformation, "Information Message:") = vbCancel Then
         Exit Sub
     Else
         For lngC = (grdDetail.SelBookmarks.count - 1) To 0 Step -1
             vBkMark = grdDetail.SelBookmarks(lngC)
             grdDetail.RemoveItem (grdDetail.AddItemRowIndex(vBkMark))
         Next lngC
     End If
End Sub

3、在ssdbgrid中Enter鍵vbReturn可以在KeyPress事件中捕獲到,然後KeyAscii = 0,再SendKeys "{tab}"。
   程式碼如下:
        If KeyAscii = vbKeyReturn Then
               KeyAscii = 0
               SendKeys "{tab}"
        End If

4、check資料出錯後,選中出錯行,使用到grdDetail.SelBookmarks.Add grdDetail.AddItemBookmark(IntI),其中IntI是絕對行數。為便於理解附程式碼如下:

    For IntI = grdDetail.Rows - 1 To 0 Step -1
        If Trim(grdDetail.Columns("flag").CellText(IntI)) = "E" Then
            Exit For
        Else
            If Len(Trim(grdDetail.Columns("Part Number").CellText(IntI))) = 0 Then
                Screen.MousePointer = vbDefault
                MsgBox "the 'Part Number' column is not nullable!", vbInformation, "Information Message:"
                grdDetail.SelBookmarks.Add grdDetail.AddItemBookmark(IntI)
                Exit Sub
            ElseIf Len(Trim(grdDetail.Columns("Quantity").CellText(IntI))) = 0 Then
                Screen.MousePointer = vbDefault
                MsgBox "the 'Quantity' column is not nullable!", vbInformation, "Information Message:"
                grdDetail.SelBookmarks.Add grdDetail.AddItemBookmark(IntI)
                Exit Sub
            End If
           
        End If
    Next IntI

5、在BeforeColUpdate事件中check資料不符合格式提示出錯後,將焦點定位到出錯位置,先MsgBox,再Cancel= 1,最後Call SetGridFocus;
        Case "Quantity"
            If Len(Trim(grdDetail.Columns("Quantity").Text)) = 0 Then
                MsgBox "Quantity column is not nullable!", vbInformation, "Information Message:"
                Cancel = 1
                Call SetGridFocus(grdDetail, grdDetail.AddItemRowIndex(grdDetail.Bookmark) + 1, ColIndex + 1, 0)
                Exit Sub
            End If

'********************************************************************
'* Input              : grdObject->SSDBGrid,IntRow->Currrent Row ID,intCol->Next Column,intLockUnVis->Locked Number
'* Output             :
'* Process Flow       :
'********************************************************************
Private Sub SetGridFocus(grdObject As SSDBGrid, intRow As Long, intCol As Long, intLockUnVis As Long)
     grdObject.SetFocus
     SendKeys "^{HOME}{DOWN " & intRow & "}{RIGHT " & Abs(intCol - intLockUnVis) & "}", True
     grdObject.ActiveCell.SelStart = 0
     grdObject.ActiveCell.SelLength = Len(grdObject.ActiveCell.Text)
End Sub

6、SQL語句中WHERE條件的順序
   在SQL語句中WHERE後的條件是從後向前執行的,所以為提高SQL語句的執行效率,應該把能過濾掉較多記錄的條件寫在後邊,這樣在執行前面的條件時需要操作的記錄數就會少很多,效率自然會有所提高。

7、Error處理
   在相對複雜或有對資料庫進行操作的函式里都應該有Error處理程式碼;在函式級Error處理程式碼中應該Call Err.Raise(Err.Number, "getFileFromRemote", Err.Description)將Error向上拋;在UI級Error處理中應該Call ShowError直接將錯誤資訊發給使用者;在函式中有對資料庫進行操作的程式碼,在Error處理時都應該Set rsDB = Nothing來釋放資源。

8、FP中FTP實現
   相關內容可參考FP FTP help.doc;

9、在一個Form中MsgBox儘量風格一致;
   如:MsgBox "the file can't be found!", vbInformation, "Information Message:"

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11411056/viewspace-734283/,如需轉載,請註明出處,否則將追究法律責任。

相關文章