設計單一元件之程式流程

    點選在元件設計表單的FileListBox(元件列表)後,FileListBox下方的TextBox會依照使用者所選擇的元件不同而隨之改變,同時主程式會去讀取元件文字檔的資訊並將元件代表圖形顯現在Img1上如圖1-10 所示。TextBox上的文字改變後就會驅動Text1_Change事件:

1-10  點選元件

 

Private Sub Text1_Change()

    Dim buf1, buf2, buf3, buf4 As String         

Open File1.Path & "\" & File1.filename For Input As #10  ' 開啟輸出檔案。

    Input #10, buf1, buf2, buf3, buf4  ß此項所代表的依序分別是元件名稱、元件代表圖形檔名與圖形的長和寬。

    Close #10

    Img1.Picture = LoadPicture(File1.Path & "\" & buf2)  ß將讀到的元件圖形showImg1

    LabCom.Caption = buf1

End Sub

    使用者選擇了欲使用之元件後,在設計表單上點一下滑鼠左鍵即會觸動Form_MouseDown事件:

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

  If PlBegin = False And MDIForm1.Text1.Text <> "" Then

    If Left$(MDIForm1.Text1.Text, 1) <> "*" And MDIForm1.Text1.Text <> "" Then

    NewComponent X, Y, MDIForm1.File1.Path & "\" & MDIForm1.Text1.Text, "aa"

    MDIForm1.Text1.Text = ""

    End If

  End If

If PlBegin = True Then

     Plinepoint X, Y

  End If

End Sub

在此Form_MouseDown事件有兩種情況,即使用者是欲畫連接線或是欲產生設計元件在設計表單上,而在此我們只討論產生元件部分,即是PlBegin = False部分,而在PlBegin = False部分將會呼叫副程式NewComponent,所謂NewComponent副程式即是只產生新元件於設計表單的意思。

Private Sub NewComponent(ByVal X%, ByVal Y%, ByVal filename$, ByVal ComLable$)

    On Error GoTo Errormasseg

    ComponentNum = ComponentNum + 1

    Load Com1(ComponentNum)

    Com1(ComponentNum).ComLable = ComLable

    Com1(ComponentNum).ReadComInfor filename

    Com1(ComponentNum).ComName = filename

    Com1(ComponentNum).Width = Com1(ComponentNum).ComWidth

    Com1(ComponentNum).Height = Com1(ComponentNum).ComHeight

    Com1(ComponentNum).show2

    Com1(ComponentNum).Top = Y - 50

    Com1(ComponentNum).Left = X - Com1(ComponentNum).Width / 2

    Com1(ComponentNum).Visible = True

    Com1(ComponentNum).comnum = ComponentNum

    Set Com1(ComponentNum).Frmname = Frmname

    Exit Sub

Errormasseg:

    ComponentNum = ComponentNum - 1

    msgtext = " " & Err.Number & "  錯誤發生"

    If Err.Number = 7 Then msgtext = "記憶體不夠了"

    MsgBox msgtext, vbExclamation

End Sub

這段程式碼主要目的是產生一個使用者已選擇的元件在設計表單上。而主程式將所有的元件皆以VB中的”使用者控制項”來表示,我們命名為Com1( ),當中的各個屬性,如ReadComInfor、ComName、Width、show2等等都是主程式設計人員自行開發。Com1( )中的各個屬性皆由元件文字檔中讀取,但現在並無任何元件的資訊給Com1( ),所以下一各動作即是去讀取在元件文字檔內的各項屬性。

    在VB裡設計一般的應用程式時,我們會以表單來裝載我們所需要的物件,

然後再透過各種事件及程式碼來完成程式,在VB的自制控制項上裡的設計環境與設計一般的應用程式類似,他也會提供一個類似表單的UserControl,它與Form的功能是相同的,也就是可以讓我們在裡面放上物件及程式碼

,所以我們可以把它〝看成〞一般的表單。

Public Sub ReadComInfor(ByVal FileName1$)

Open FileName1 For Input As #10  

    Input #10, str, buf, ComHeight, ComWidth

    Debug.Print str, buf

    If ComLable = "aa" Then

        title.Text = str

         ComLable = title.Text

    Else

        title.Text = ComLable

    End If

    element.ToolTipText = "執行" & str & "運算"

    element.Picture = LoadPicture(GetFilePath(FileName1) & buf)

    element.Width = ComWidth

    title.Width = ComWidth

    element.Height = ComHeight

    ComWidth = element.Width + Imginpoint(0).Width * 1

    ComHeight = ComHeight + title.Height

Line Input #10, buf

    buf = ""

    Do While Left$(buf, 2) <> "**"

        Input #10, buf, buf1, buf2, buf3

        Debug.Print buf, buf1, buf2

        If Left$(buf, 2) <> "**" Then

            Component.AddInputItem buf, buf1, buf2, buf3

        End If

    Loop

    buf = ""

    Do While Left$(buf, 2) <> "**"

        Input #10, buf, buf1, buf2, buf3

        Debug.Print buf, buf1, buf2

        If Left$(buf, 2) <> "**" Then

            Componentout.AddInputItem buf, buf1, buf2, buf3

        End If

    Loop

str = ""

    Do While Not EOF(10)

        Line Input #10, buf

        Debug.Print buf

        For i = 1 To Len(buf)

            If Mid$(buf, i, 1) = "'" Then buf = Left$(buf, i - 1): Exit For

        Next

        Debug.Print buf

        str = str & " : " & buf

    Loop   

     InpointItem = Componentout.InputItemNum

    For i = 1 To InpointItem

     buf = "Componentout.value(" & i - 1 & ") = " & Componentout.code(i - 1)

        str = str & ":" & buf

    Next

    str = str & ":" & "end sub"

    Debug.Print str

    Close #10 ' 關閉檔案。

    Set Runsc = CreateObject("scriptcontrol")

    Runsc.Language = "vbscript"

    Runsc.AddCode str

    Runsc.AddObject "Component", Component

    Runsc.AddObject "Componentout", Componentout   

    Runsc.AddObject "Fun", fs, True

End Sub

str = ""

    Do While Not EOF(10)

        Line Input #10, buf

        Debug.Print buf

        For i = 1 To Len(buf)

            If Mid$(buf, i, 1) = "'" Then buf = Left$(buf, i - 1): Exit For

        Next

        Debug.Print buf

        str = str & " : " & buf

    Loop

   

     InpointItem = Componentout.InputItemNum

    For i = 1 To InpointItem

     buf = "Componentout.value(" & i - 1 & ") = " & Componentout.code(i - 1)

        str = str & ":" & buf

 Next

    str = str & ":" & "end sub"

    Debug.Print str

    Close #10 ' 關閉檔案。

    Set Runsc = CreateObject("scriptcontrol")

    Runsc.Language = "vbscript"

    Runsc.AddCode str

    Runsc.AddObject "Component", Component

    Runsc.AddObject "Componentout", Componentout   

    Runsc.AddObject "Fun", fs, True

End Sub

以上一大段程式即是讀取Com1( )所需要的各項元件資訊,由於元件文字檔在主程式設計之初即規劃好元件文字檔的格式,所以若有新元件開發成功只要將已完成的元件文字檔加入任何地方即可使用。 

讀取元件的各項資訊完成之後即是顯現的位置了。

   Com1(ComponentNum).Top = Y - 50

   Com1(ComponentNum).Left = X - Com1(ComponentNum).Width / 2

   Com1(ComponentNum).Visible = True

   Com1(ComponentNum).comnum = ComponentNum

以上就完成了設計單一元件的程式流程,結果如圖1-11 所示: