1. 程式人生 > 實用技巧 >出口UI控制元件從“形式”Excel表方面的資訊

出口UI控制元件從“形式”Excel表方面的資訊

執行概要 在這篇文章中,我們將看到如何以一種簡單的方式將VB表單的控制細節匯出到Excel表格中。 如今,市場上有許多工具(線上的和獨立的)可以用於升級程式碼,或者將程式碼從一種程式語言轉換為另一種程式語言等等,但是它們也專注於UI層嗎?答案是可疑的。 是的,UI外觀通常被認為是最不重要的,它確實消耗了75%的時間。它們具有外觀價值,可以為使用者提供美學效果,因為它們會很容易地分散客戶的注意力,因為終端使用者可能已經習慣了他們通常期望的遺留螢幕。 ASP ASP。NET升級是Visual Studio的內建元件。 介紹 在VB應用程式的轉換中,將其重寫為另一種語言確實需要在UI層上付出巨大的努力,主要是在外觀和感覺方面。通常,開發人員開啟VB窗體,獲取每個控制元件的每個屬性,並在轉換後的程式碼中應用相同的屬性。 目的 而不是開啟一個VB形式(介面層)手動高度,寬度(屬性)和其他風格的每個控制,我們可以以程式設計方式使用一個簡單的VB程式碼匯出到一個Excel表,與表單名稱表格名稱,並使用重寫的負債狀況的影響,設定控制值/再造工程/程式檔案遷移到保持一致性的UI的外觀和感覺。 如何使用它? 在窗體中複製以下程式碼,並在單擊按鈕事件中呼叫它,以生成具有控制元件設定資訊的Excel表。 隱藏,收縮,複製Code

Private Function GetFormData(ByRef xi_astrData As String) As String

    Call LetPropertyType

    'On Error GoTo LoadFormErr
    Dim p_strLine               As String
    Dim p_astrData()            As String
    Dim p_objFSO                As FileSystemObject
    Dim p_objTextStream         As TextStream

    '
This is the data Dim p_strControlDetail As String Dim p_strFormName As String Dim p_sFormName As String Dim p_sTOP As String Dim p_sLeft As String Dim p_sHEIGHT As String Dim p_sWIDTH As String
Dim p_sIndex As String Dim p_sTabIndex As String Dim p_strCntrlName As String Dim p_strCntrlType As String Dim p_sCaption As String Dim p_skipControl As String Dim p_strControlName As String Dim p_strControl As String Dim p_strControlProperties As String Dim p_strControlTypes() As String Dim p_strControlType As String ' ------------------------------------------ ' Clear the textbox ' ------------------------------------------ p_strControlDetail = vbNullString p_strControlProperties = vbNullString ' ------------------------------------------ ' Open the file ' ------------------------------------------ On Error GoTo LoadFormErr2 Set p_objFSO = New FileSystemObject Set p_objTextStream = p_objFSO.OpenTextFile(fileName:=xi_astrData, _ IOMode:=ForReading, _ Create:=False) On Error GoTo LoadFormErr Do While Not p_objTextStream.AtEndOfStream p_strLine = p_objTextStream.ReadLine() p_astrData = Split(p_strLine, "=") If Len(Trim$(p_strLine)) > 0 Then '=============================================== ' Getting Control type of the Form '================================================= If UCase$(Left$(Trim$(p_strLine), 6)) = "BEGIN " Then rsForm.AddNew rsForm!FormName = p_sFormName rsForm!ControlType = p_strCntrlName rsForm!ControlName = p_strCntrlType If (Len(p_sIndex) > 0) Then rsForm![ControlName] = p_strCntrlType + _ "(" + p_sIndex + ")" End If rsForm!Caption = p_sCaption rsForm!Index = p_sIndex rsForm!Top = p_sTOP If (Len(p_sTOP) > 0) Then rsForm![Top(*065)] = _ Conversion.CStr((Conversion.Int(p_sTOP) * 0.065)) End If rsForm!Width = UCase$(Trim$(p_sWIDTH)) If (Len(p_sWIDTH) > 0) Then rsForm![WIDTH(*065)] = _ Conversion.CStr((Conversion.Int(p_sWIDTH) * 0.065)) End If rsForm!Left = UCase$(Trim$(p_sLeft)) If (Len(p_sLeft) > 0) Then rsForm![Left(*065)] = _ Conversion.CStr((Conversion.Int(p_sLeft) * 0.065)) End If rsForm!Height = UCase$(Trim$(p_sHEIGHT)) If (Len(p_sHEIGHT) > 0) Then rsForm![Height(*065)] = _ Conversion.CStr((Conversion.Int(p_sHEIGHT) * 0.065)) End If rsForm!TabIndex = UCase$(Trim$(p_sTabIndex)) rsForm.Update rsForm.MoveFirst p_sCaption = "" p_sTOP = "" p_sLeft = "" p_sHEIGHT = "" p_sWIDTH = "" p_sIndex = "" p_strCntrlName = "" p_strCntrlType = "" p_sTabIndex = "" p_strControl = UCase$(Trim$(p_strLine)) p_strControl = UCase$(Replace(p_strControl, "BEGIN ", _ "", 1, -1, vbBinaryCompare)) p_strControl = UCase$(Replace(p_strControl, " ", _ ",", 1, -1, vbBinaryCompare)) p_strControlTypes = Split(p_strControl, ",") p_strControlType = p_strControlTypes(0) + ":" + _ p_strControlTypes(1) p_strCntrlName = p_strControlTypes(0) p_strCntrlType = p_strControlTypes(1) If (p_strControlTypes(0) = "VB.FORM") Then p_sFormName = p_strControlTypes(1) End If End If Select Case UCase$(Trim$(p_astrData(0))) Case "CAPTION" p_sCaption = p_astrData(1) Case "CLIENTHEIGHT" p_sHEIGHT = UCase$(Trim$(p_astrData(1))) Case "CLIENTWIDTH" p_sWIDTH = UCase$(Trim$(p_astrData(1))) Case "CLIENTTOP" p_sTOP = UCase$(Trim$(p_astrData(1))) Case "CLIENTLEFT" p_sLeft = UCase$(Trim$(p_astrData(1))) Case "INDEX" p_sIndex = UCase$(Trim$(p_astrData(1))) Case "TABINDEX" p_sTabIndex = UCase$(Trim$(p_astrData(1))) Case "HEIGHT" p_sHEIGHT = UCase$(Trim$(p_astrData(1))) Case "WIDTH" p_sWIDTH = UCase$(Trim$(p_astrData(1))) Case "TOP" p_sTOP = UCase$(Trim$(p_astrData(1))) Case "LEFT" p_sLeft = UCase$(Trim$(p_astrData(1))) Case "NAME" p_strControlProperties = p_strControlProperties + _ vbCrLf + "NAME : " + p_astrData(1) ' Case "ICON" ' Case "KEYPREVIEW" ' Case "LINKTOPIC" ' Case "ENABLED" ' Case "ALIGN" ' Case "ALIGNMENT" ' Case "DRAGICON" Case "USEIMAGELIST" ' Case "PICTUREBACKGROUNDUSEMASK" ' Case "HASFONT" ' Case "IMAGELIST" ' Case "DATAFIELDLIST" Case Else 'do nothing End Select End If Loop p_objTextStream.Close Set p_objFSO = Nothing GetFormData = "" ' p_strControlType + _ vbCrLf + p_strControlProperties Exit Function LoadFormErr: MsgBox "Error in LoadForm function" & vbCrLf & _ "Error was: " & Err.Number & _ ", " & Err.Description Exit Function LoadFormErr2: MsgBox "Error opening the Form, " & xi_astrData & vbCrLf & _ "Error: " & Err.Number & ", " & Err.Description End Function

上述方法的Helper方法用預期的fieldname構建一個記錄集物件來儲存控制元件屬性值,並建立一個Excel表來從記錄集匯出資料。 下面是我們如何在記錄集中新增必需的屬性作為欄位名: 隱藏,收縮,複製Code

Private Function Buildrs() As ADODB.Recordset//

    Dim rs As ADODB.Recordset

    Set rs = New ADODB.Recordset
    rs.CursorLocation = adUseClient
    rs.CursorType = adOpenStatic
    rs.Fields.Append "FormName", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "ControlType", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "ControlName", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "CAPTION", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "HEIGHT", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "HEIGHT(*065)", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "WIDTH", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "WIDTH(*065)", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "TOP", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "TOP(*065)", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "LEFT", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "LEFT(*065)", adVarChar, 100, adFldIsNullable
    rs.Fields.Append "INDEX", adVarChar, 3, adFldIsNullable
    rs.Fields.Append "TABINDEX", adVarChar, 5, adFldIsNullable

   ' rs.Fields.Append "PropertyValue(*065)", _
   '                  adVarChar, 100, adFldIsNullable
    rs.Open

    Set Buildrs = rs
End Function

下面是我們如何建立一個Excel表格來繫結記錄集: 隱藏,收縮,複製Code

////
Public Function CreateExcelSS(ByVal objRs As ADODB.Recordset)

    Dim rst As ADODB.Recordset
    Dim xlApp As Excel.Application
    Dim xlBook As Excel.Workbook
    Dim xlSheet As Excel.Worksheet
    Dim xl2Sheet As Excel.Worksheet
    Dim fileName()  As String
    Dim conSheetName  As String
    Dim i As Integer
    Dim FC As Byte ' # fields from crosstab query.

On Error GoTo HandleErr

    ' Create Excel Application object
    Set xlApp = New Excel.Application
    ' Create a new workbook
    Set xlBook = xlApp.Workbooks.Add

    xlApp.DisplayAlerts = False
    xlApp.DisplayAlerts = True
    xlApp.Worksheets.Add

    ' Capture reference to first worksheet
    Set xlSheet = xlBook.ActiveSheet
    fileName = Split(m_strFileName, "\")
    conSheetName = fileName(UBound(fileName) - 1)
    xlSheet.Name = conSheetName    ' Change the worksheet name

    ' Create recordset
    Set rst = New ADODB.Recordset
    Set rst = objRs
    FC = rst.Fields.Count

    With xlSheet
        For i = 1 To FC
            ' Copy field names to Excel using count of fields, which is
            ' necessary because the number of output fields 
            ' in a crosstab query is not fixed.
            ' Bold the column headings and insert field names. Starting
            ' position A1. The variable 'i' advances the cursor one cell 
            ' to the right for each additional field.

            With .Cells(1, i)
                .Value = rst.Fields(i - 1).Name
                .Font.Bold = True
            End With
        Next

        ' Copy all the data from the recordset into the spreadsheet.
        .Range("A2").CopyFromRecordset rst
        
        ' Format the data
        ' Causes all columns to autofit.
        For i = 1 To FC
            .Columns(i).AutoFit
        Next
    End With

    rst.Close

    'Stop
    'Display the Excel chart
    xlApp.Visible = True
    ' xlApp.close

ExitHere:
    On Error Resume Next
    ' Clean up
    rst.Close
    Set rst = Nothing
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    Exit Function

HandleErr:
    MsgBox Err & ": " & Err.Description, , _
           "Error in CreateExcelSS"
    Resume ExitHere
    Resume

End Function

它是做什麼的? 該程式碼將VB窗體檔案開啟到一個閱讀器流中,並讀取它以獲得所有控制元件所需的屬性,並將相同的屬性寫入Excel表中。 結論 這篇文章將幫助你以一種簡單的方式將VB窗體的控制元件細節匯出到Excel表格中。 本文轉載於:http://www.diyabc.com/frontweb/news2180.html