1 (изменено: Poltergeyst, 2015-06-06 22:48:44)

Тема: OOo & VBScript: Создание простого оконного интерфейса

Создание простого оконного интерфейса на VBScript из объектов Open Office - открытие диалога множественного выбора и заполнение списка формы набором выбранных файлов.
Open Office 2.x
WinXP

oogui.vbs



'---------------------------------------------------------------------------------------------
' Создание простого оконного интерфейса из объектов Open Office.
' Lang.:VBScript
' Open Office 2.x
' WinXP
'---------------------------------------------------------------------------------------------    

 Public Const WND_CLASS_TOP = 0 
 Public Const WND_ATTRIB_SHOW = 1
 Public Const WND_ATTRIB_FULLSIZE = 2
 Public Const WND_ATTRIB_OPTIMUMSIZE = 4
 Public Const WND_ATTRIB_MINSIZE = 8
 Public Const WND_ATTRIB_BORDER = 16
 Public Const WND_ATTRIB_SIZEABLE = 32
 Public Const WND_ATTRIB_MOVEABLE = 64
 Public Const WND_ATTRIB_CLOSEABLE = 128


 Public Const PosSizeX = 1
 Public Const PosSizeY = 2
 Public Const PosSizeWIDTH = 4
 Public Const PosSizeHEIGHT = 8
 Public Const PosSizePOS = 3
 Public Const PosSizeSIZE = 12
 Public Const PosSizePOSSIZE = 15  

 Public Const FILEOPEN_SIMPLE = 0
 Public Const FILESAVE_AUTOEXTENSION = 10
 Public Const CHECKBOX_AUTOEXTENSION = 100

'================================================================
 Public Const sAddress = "Standard.Module1"    'Адрес модуля обработки событий в библиотеке-контейнере
'================================================================

'---------------------------------------------------------------------------------------------
 Public oManager
 Public oScriptProvider
 Public exf

 Public oWnd
 Public oFrame
 Public oControl1, oControl2, oControl3
 Public xObj
 Public oScriptUrl

'---------------------------------------------------------------------------------------------
 Set oManager = WScript.CreateObject("com.sun.star.ServiceManager")
 Set objCoreReflection = oManager.CreateInstance("com.sun.star.reflection.CoreReflection")
 Set oScriptProvider = oManager.CreateInstance("com.sun.star.script.provider.MasterScriptProviderFactory")
 
 exf = False
 Set xObj = New OBJ

 CreateWindow()

'---------------------------------------------------------------------------------------------
 Do
    WScript.Sleep(100)
    If exf Then Exit Do
 Loop
'---------------------------------------------------------------------------------------------
 Set oScriptProvider = Nothing
 Set objCoreReflection = Nothing
 Set oManager = Nothing
 WScript.Quit()


'/Создание окна/
'---------------------------------------------------------------------------------------------
Sub CreateWindow()

 Dim oAwtToolkit
 Dim oWindowDesc
 Dim s_listener
 Dim sLocation
 Dim oScript


 'Создание окна-контейнера
 '--------------------------------------------------------------------------------------------
 Set oAwtToolkit = oManager.CreateInstance("com.sun.star.awt.Toolkit") 
 Set oWindowDesc = CreateStruct("com.sun.star.awt.WindowDescriptor") 
 
 With oWindowDesc 

    .Type = WND_CLASS_TOP
    .WindowServiceName = "" 
    .Parent = oAwtToolkit.getDesktopWindow() 
    .ParentIndex = -1
    .Bounds = MakeRectangle(30, 50, 600, 400) 
      
 End With

 oWindowDesc.WindowAttributes = WND_ATTRIB_SHOW + WND_ATTRIB_BORDER + WND_ATTRIB_MOVEABLE +WND_ATTRIB_CLOSEABLE
    
 Set oWnd = oAwtToolkit.CreateWindow(oWindowDesc)
 oWnd.Background = &H64acd2

 'Создание фрейма
 '--------------------------------------------------------------------------------------------
 Set oFrame = oManager.CreateInstance("com.sun.star.frame.Frame") 
 oFrame.initialize(oWnd) 
 oFrame.Title = "Выбор файлов" 

 'Создание элементов управления
 '--------------------------------------------------------------------------------------------
 Set oControl1 = CreateControl(oAwtToolkit, oWnd, "ListBox", MakeRectangle(10, 10, 580, 280), Array("DropDown","LineCount","MultiSelection"),Array(False,10,False))
 Set oControl2 = CreateControl(oAwtToolkit, oWnd, "Button",  MakeRectangle(10, 300, 280, 40), Array("Label"),Array("Выбрать файл/группу"))
 Set oControl3 = CreateControl(oAwtToolkit, oWnd, "Button",  MakeRectangle(310, 300, 280, 40), Array("Label"),Array("Выход"))

 'Регистрация обработчиков событий в библиотеке-контейнере
 '--------------------------------------------------------------------------------------------
 Set oScript = GetScript("vnd.sun.star.script:" & sAddress & ".SetObjJScript?language=Basic&location=application")
 oScript.invoke Array(xObj),Array(),Array()    
 
 Set oScript = GetScript("vnd.sun.star.script:" & sAddress & ".AddItemListener?language=Basic&location=application")
 oScript.invoke Array("ListBox1_", oControl1), Array(), Array()

 Set oScript = GetScript("vnd.sun.star.script:" & sAddress & ".AddMouseListener?language=Basic&location=application")
 oScript.invoke Array("Button1_", oControl2), Array(), Array()
 oScript.invoke Array("Button2_", oControl3), Array(), Array()

 Set oScript = GetScript("vnd.sun.star.script:" & sAddress & ".AddCloseListener?language=Basic&location=application")
 oScript.invoke Array("Frame_", oFrame), Array(), Array()

 Set oScript = Nothing

 Set oScriptUrl = GetScript("vnd.sun.star.script:" & sAddress & ".FromUrl?language=Basic&location=application")

End Sub

'/Вспомогательные функции/
'--------------------------------------------------------------------------------------------
Function GetScript(sLocation)
    Set GetScript = oScriptProvider.createScriptProvider("").getScript(sLocation)
End Function

Function FromUrl(sPath)
    FromUrl = oScriptUrl.invoke(Array(sPath), Array(), Array())
End Function


'/Класс-контейнер для функций обработчиков событий/
'--------------------------------------------------------------------------------------------
Class OBJ

    Private Sub Class_Initialize
    End Sub
    
    Private Sub Class_Terminate
    End Sub

    '------------------------------------------------------------------------------------    
    Public Sub ListBox1_ItemStateChanged(oEvent)
        Dim oCnt1
        Set oCnt1 = oEvent.Source
        If oCnt1.SelectedItemPos = -1 Then Exit Sub
        MsgBox CStr(oCnt1.getSelectedItem()), vbSystemModal + vbInformation, "Reply"
    End Sub

    'Заполнение списка путями файлов
    '------------------------------------------------------------------------------------
    Public Sub Button1_MousePressed(oEvent)

        Dim i, u, x
        Dim sFileArr
        Dim sFileDir

        Dim sFileURL
        Dim sFileName

        'Диалог открытия файла 
        '------------------------------------------------------------------------
        u = 0
        sFileArr = FileDlg(True, "*.*", "")

        u = UBound(sFileArr)

        If u = -1 Then Exit Sub

        If u = 0 Then
            x = 1
        Else
            x = 0
            sFileDir = sFileArr(0)    
        End If

        'Добавление файлов в список
        '------------------------------------------------------------------------
        For i = 1 - x To u
            
            If u = 0 Then
                sFileURL = sFileArr(0)            'Один файл
            Else
                sFileURL = sFileDir & "/" & sFileArr(i)    'Массив файловых имен
            End If
            oControl1.AddItem FromUrl(sFileURL), -1
        
        Next
    End Sub

    '------------------------------------------------------------------------------------
    Public Sub Button2_MousePressed(oEvent)
        oFrame.Close(True)
    End Sub

    '------------------------------------------------------------------------------------
    Public Sub Frame_Disposing(oEvent)
        exf = True
        MsgBox "Завершение работы...", vbSystemModal + vbInformation, "Reply"
    End Sub

End Class
'--------------------------------------------------------------------------------------------


'/Создание элемента управления/
'------------------------------------------------------------------------------------------------
Function CreateControl(oAwtToolkit, oWindow, s_type, oPosSizeRect, aPropNames, aPropValues) 

    Dim s_model, s_object
    Dim oModel, oCtrl

    s_model = "com.sun.star.awt.UnoControl" & s_type & "Model" 
    s_object = "com.sun.star.awt.UnoControl" & s_type 

    '----------------------------------------------------------------------------------------
    Set oModel = oManager.CreateInstance(s_model) 
    Set oCtrl = oManager.CreateInstance(s_object) 
    
        oCtrl.setModel oModel 
    oCtrl.createPeer oAwtToolkit, oWindow 
    
    '----------------------------------------------------------------------------------------
    oModel.setPropertyValues aPropNames, aPropValues
    oCtrl.setPosSize oPosSizeRect.X, oPosSizeRect.Y, oPosSizeRect.Width, oPosSizeRect.Height, PosSizePOSSIZE
    
    Set CreateControl = oCtrl 

End Function 


'/Получение структуры RECT с заполненными полями/
'------------------------------------------------------------------------------------------------
Function MakeRectangle(nX, nY, nWidth, nHeight)

    Dim oRectangle

    Set oRectangle = CreateStruct("com.sun.star.awt.Rectangle") 
    With oRectangle 
        .X = nX 
        .Y = nY 
        .Width = nWidth 
        .Height = nHeight 
    End With 
    Set MakeRectangle = oRectangle 

End Function 

'/Создание структуры/
'---------------------------------------------------------------------------------------------
Function CreateStruct(strTypeName)

    Dim aStruct
    Dim oStructClass
    
    Set oStructClass = objCoreReflection.forName(strTypeName)
    oStructClass.CreateObject aStruct
    Set CreateStruct = aStruct

End Function


'/Диалог открытия файла/
'------------------------------------------------------------------------------------------------
Function FileDlg(bMult, sFilter, sDefaultName)

    Dim oPS
    Dim oFileDialog

    Set oPS = oManager.CreateInstance("com.sun.star.util.PathSettings")
    Set oFileDialog = oManager.CreateInstance("com.sun.star.ui.dialogs.FilePicker")
    oFileDialog.Initialize Array(FILEOPEN_SIMPLE)
    oFileDialog.SetValue CHECKBOX_AUTOEXTENSION, 0, True

    '--------------------------------------------------------------------------------------------
    Dim FilterNames(1)
    FilterNames(0) = sFilter
    oFileDialog.AppendFilter FilterNames(0), FilterNames(0)
    oFileDialog.SetCurrentFilter FilterNames(0)

    'Множественный выбор файлов
    '--------------------------------------------------------------------------------------------
    If bMult Then oFileDialog.setMultiSelectionMode(True)

    oFileDialog.setDefaultName sDefaultName 
    oFileDialog.setDisplayDirectory oPS.getPropertyValue("Work")

    '--------------------------------------------------------------------------------------------
    If oFileDialog.Execute() = 1 Then 
        If bMult then 
            FileDlg = oFileDialog.Files
        Else 
            FileDlg = oFileDialog.Files(0)
        End If    
    Else
        If bMult then 
            FileDlg = Array()
        Else 
            FileDlg = ""
        End If    
    End If
    
End Function

Чтобы сценарий заработал, нужно организовать обработчики событий формы в пространстве Open Office, для чего, например, в библиотеку Standard в модуль с именем Module1 следует добавить следующий код OOo Basic:


'------------------------------------------------------------------------------------------------
' Модуль обработки событий формы.
' Lang.: OOo Basic 
' Open Office 2.x
'------------------------------------------------------------------------------------------------

Global oScript
'------------------------------------------------------------------------------------------------
Sub SetObjJScript(byVal obj As Object)
        Set oScript = obj
End Sub
'------------------------------------------------------------------------------------------------
Function FromUrl(sFileURL$) As String
    FromUrl = ConvertFromUrl(sFileURL)
End Function

'/Добавление обработчика событий для мыши/
'------------------------------------------------------------------------------------------------
Sub AddMouseListener(ByVal sPrefix As String, ByVal oControl As Object)
    Dim oListener As Object
    oListener = CreateUnoListener(sPrefix, "com.sun.star.awt.XMouseListener") 
    oControl.addMouseListener(oListener)
End Sub

'/Добавление обработчика событий изменения пункта списка/
'------------------------------------------------------------------------------------------------
Sub AddItemListener(ByVal sPrefix As String, ByVal oControl As Object)
    Dim oListener As Object
    oListener = CreateUnoListener(sPrefix, "com.sun.star.awt.XItemListener") 
    oControl.addItemListener(oListener)
End Sub

'/Добавление обработчика событий закрытия окна/
'------------------------------------------------------------------------------------------------
Sub AddCloseListener(ByVal sPrefix As String, ByVal oFrame As Object)
    Dim oListener As Object
    oListener = CreateUnoListener("Frame_", "com.sun.star.util.XCloseListener") 
    oFrame.addCloseListener(oListener)
End Sub

'/Обработчик событий для списка/
'------------------------------------------------------------------------------------------------
Sub ListBox1_ItemStateChanged(ByVal oEvent As Object)
    oScript.ListBox1_ItemStateChanged(oEvent)
End Sub

'/Обработчик событий мыши для первой кнопки/
'------------------------------------------------------------------------------------------------
Sub Button1_MousePressed(ByVal oEvent As Object)
    oScript.Button1_MousePressed(oEvent)
End Sub

Sub Button1_MouseReleased(ByVal oEvent As Object) End Sub
Sub Button1_MouseEntered(ByVal oEvent As Object) End Sub
Sub Button1_MouseExited(ByVal oEvent As Object) End Sub

'/Обработчик событий мыши для второй кнопки/
'------------------------------------------------------------------------------------------------
Sub Button2_MousePressed(ByVal oEvent As Object)
    oScript.Button2_MousePressed(oEvent) 
End Sub

Sub Button2_MouseReleased(ByVal oEvent As Object) End Sub
Sub Button2_MouseEntered(ByVal oEvent As Object) End Sub
Sub Button2_MouseExited(ByVal oEvent As Object) End Sub

'/Обработчик событий закрытия фрейма/
'------------------------------------------------------------------------------------------------
Sub Frame_QueryClosing (ByVal oEvent As Object, ByVal GetsOwner As Boolean) End Sub
Sub Frame_NotifyClosing (ByVal oEvent As Object) End Sub

Sub Frame_Disposing(ByVal oEvent As Object)
    oScript.Frame_Disposing(oEvent)
End Sub

Вместо библиотеки Standard, можно использовать любую другую библиотеку, однако придется поменять адрес в исходном сценарии VBScript:


 sAddress = "Standard.Module1"    'Адрес модуля обработки событий в библиотеке-контейнере

 sAddress = "имя_библиотеки.имя_модуля"    'Адрес модуля обработки событий в библиотеке-контейнере