На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> состав проекта VB6
    Прикреплённая картинка
    Прикреплённая картинка
    Прикреплённая картинка
    Прикреплённая картинка
    Прикреплённая картинка
    Прикреплённая картинка
    Уважаемые господа!

    Каким образом из программы узнать состав проекта в VB6?
    Например, получить список всех форм проекта. Подчеркиваю, не загруженных форм,
    а форм, включенных в проект через меню Project, Add Form и т.д. и показанных в
    Project Explorer.

    рис 1 Project Explorer

    1) Коллекция форм – Forms – дает только загруженные формы. Например,

    В форме, которую вызываем
    aaName = Me.Name
    Call КоллекцияФорм(aaName)
    В модуле
    Public aaName As String

    ' * * * * * * * * * * * * * * * * * * * * *
    Public Sub КоллекцияФорм(aaName As String)
    strAForms = "Forms.Count = > " & Forms.Count
    For IForms = 0 To Forms.Count - 1
    strAForms = strAForms & vbCrLf & _
    "Forms.Item(" & IForms & ")" & ".Name = > " & Forms.Item(IForms).Name
    Next IForms
    MsgBox strAForms, vbInformation, aaName
    End Sub
    ' * * * * * * * * * * * * * * * * * * * * *

    результат

    Рис 2 загруженные формы (вызван - каталог_диск).

    2) Eсли прочитать список файлов в FileListBox для соответствующей папки с текущим проектом
    в DirListBox, (поиск по расширению .frm), например

    в модуле
    Public strСписокФормFrm(1 To 64) As String, strСписокФорм(1 To 64) As String
    Public Nформ As Integer

    В форме (каталог_диск)

    ' * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
    '
    Dim J As Integer, I1 As Integer
    ' составление списка всех форм папки проекта
    '
    Nформ = 0
    For J = 0 To File1.ListCount - 1
    '
    File1.ListIndex = J
    strA = File1.List(File1.ListIndex)
    I1 = InStr(strA, ".frm") ' поиск расширения frm
    If I1 > 0 And I1 <= Len(strA) Then
    Nформ = Nформ + 1
    strСписокФормFrm(Nформ) = strA ‘ с расширением
    strСписокФорм(Nформ) = Left(strA, Len(strA)-4) ‘ без расширения
    End If
    '
    Next J
    '
    ‘ печать результата
    Text1.Text = Text1.Text & vbCrLf & _
    "найдено = > " & Nформ & " форм" & vbCrLf
    ' установить на конец текста
    каталог_диск.Text1.SelStart = Len(каталог_диск.Text1.Text)

    Результат

    Рис 3 поиск в каталоге

    Использовать полученные названия для уточнения включенных в проект форм
    проблематично. Например, нельзя спросить состояние видимости –
    типа Form1.Visible = = > strСписокФорм(Nформ).Visible < = = это ошибка
    или использовать для присвоения объектной переменной
    типа
    Dim frm As Form
    Set frm = strСписокФорм(Nформ) < = = это ошибка

    Как решить мой вопрос?

    28 октября 2017г. Лодя


    Прикреплённая картинка
    Прикреплённая картинка
      Узнать количество frm файлов в проекте можно проанализировав содержание vbp файла. Данный подход работает полько в проекте. В скомполированном приложении он работать не будет.
        Анализ директории может дать неверный результат, т.к. В проект можно добавлять файлы из любой директории.
          Уважаемые господа!


          Переформулирую свой вопрос. Для VB6.

          Как указать программно (из кода) на одну из форм проекта,

          если форма еще не загружена и ее еще нет в коллекции Forms.

          Но известны все имена форм, включенных в проект.

          Эти имена найдены из просмотра файла проекта .vbp и просмотра файлов форм .frm

          ( в файлах форм - чтение строки Begin VB.Form ). Эти имена - строковые переменные.

          Такое указание или поименование должно позволить узнать свойства

          формы, состояние видимости и позволить загрузить ее если это необходимо.

          С уважением, Лодя.

          31 октября 2017г.
            Цитата Лоля @
            Как указать программно (из кода) на одну из форм проекта, если форма еще не загружена и ее еще нет в коллекции Forms. Но известны все имена форм, включенных в проект.

            Загрузить, потом указывать. Ибо указывать на то, чего нет, о чём только известно, что оно бывает - бессмысленно.

            Добавлено
            Цитата Лоля @
            Каким образом из программы узнать состав проекта в VB6?
            Например, получить список всех форм проекта. Подчеркиваю, не загруженных форм,
            а форм, включенных в проект через меню Project, Add Form и т.д. и показанных в
            Project Explorer.

            Загрузить инстанс проекта и энумеровать все его ресурсы. Муторно. API.
              Лоля, тебе действительно интересен функционал проекта и неинтересно как ето будет работать в скомпилированном приложении?
                Цитата "Лодя"
                Как указать программно (из кода) на одну из форм проекта,
                если форма еще не загружена и ее еще нет в коллекции Forms.

                Что значит указать?
                Цитата "Лодя"
                Такое указание или поименование должно позволить узнать свойства
                формы, состояние видимости и позволить загрузить ее если это необходимо.

                При первом доступе к форме она будет загружена.
                Вообще можно узнать список всех модулей (классов, форм, юзерконтролов и т.д.) как в IDE так и в скомпилированном виде через код, без разбора vbp файла.
                  А если ещё учесть варианты типа
                  ExpandedWrap disabled
                    Dim Form123 As New Form1
                    Уважаемые господа!

                    Прошу закончить.

                    С уважением, Лодя
                    01 ноября 2017г
                      Уважаемые господа!

                      Поясняю ситуацию, пусть в проекте имеется насколько форм.
                      Загружена одна - две формы (например MDIForm1 + Form9).
                      Вызвана подпрограмма из модуля. Желательно в коде этой подпрограммы получить ответ
                      имеется ли в проекте, скажем “Form8” без загрузки этой формы,
                      а загружать ее только в отдельных случаях.
                      С уважением,
                      Лодя, 01 ноября 2017г

                      Постскриптум

                      В коллекции форм Forms – только загруженные формы.
                        ExpandedWrap disabled
                          Private Declare Sub EbGetExecutingProj Lib "vba6" (ByRef lpPrjObj As IUnknown)
                           
                          Private Sub Form_Load()
                              Dim objProj As IUnknown
                              Dim TLI     As TLI.TLIApplication
                              Dim LibInfo As TLI.TypeLibInfo
                              Dim typeLib As ITypeLib
                              Dim typeInf As TypeInfo
                              Dim index   As Long
                              ' // Get current project
                              EbGetExecutingProj objProj
                              ' // Get ITypeLib interfaces describes current project
                              Set typLib = objProj
                              ' // For help we used TLI library
                              Set TLI = New TLIApplication
                              Set LibInfo = TLI.TypeLibInfoFromITypeLib(typLib)
                              ' // Get each info
                              For Each typeInf In LibInfo.TypeInfos
                                  Dim member  As MemberInfo
                                  ' // Get name
                                  Debug.Print "Module: "; typeInf.Name
                                  ' // Get members
                                  For Each member In typeInf.Members
                                      ' // Skip private constants
                                      If member.MemberId <> -1 Then
                                          ' // Get Type member
                                          If member.DESCKIND = DESCKIND_VARDESC Then
                                              ' // Variable
                                              Debug.Print Tab(5); "Variable "; member.Name;
                                          ElseIf member.DESCKIND = DESCKIND_FUNCDESC Then
                                              Dim param   As ParameterInfo
                                              
                                              If member.INVOKEKIND = INVOKE_FUNC Then
                                                  If member.ReturnType.VarType = VT_VOID Then
                                                      Debug.Print Tab(5); "Sub "; member.Name;
                                                  Else
                                                      Debug.Print Tab(5); "Function "; member.Name;
                                                  End If
                                              ElseIf member.INVOKEKIND = INVOKE_PROPERTYGET Then
                                                  Debug.Print Tab(5); "Property Get "; member.Name;
                                              ElseIf member.INVOKEKIND = INVOKE_PROPERTYPUT Or member.INVOKEKIND = INVOKE_PROPERTYPUTREF Then
                                                  Debug.Print Tab(5); "Property Let/Set "; member.Name;
                                              End If
                                              
                                              Debug.Print "(";
                                              index = 0
                                              ' // Get parameters
                                              For Each param In member.Parameters
                                                  
                                                  If param.flags And PARAMFLAG_FOPT Then
                                                      Debug.Print "Optional ";
                                                  End If
                                                  
                                                  If param.flags And PARAMFLAG_FOUT Then
                                                      Debug.Print "ByRef ";
                                                  Else
                                                      Debug.Print "ByVal ";
                                                  End If
                                                  
                                                  Debug.Print param.Name;
                                                  Debug.Print GetStringTypeName(param.VarTypeInfo);
                                                  
                                                  If index < member.Parameters.Count - 1 Then
                                                      Debug.Print ", ";
                                                  End If
                                                  
                                                  index = index + 1
                                                  
                                              Next
                                              
                                              Debug.Print ")";
                                              
                                          End If
                                                  
                                          If member.ReturnType.VarType <> VT_VOID Then
                                              Debug.Print GetStringTypeName(member.ReturnType)
                                          Else
                                              Debug.Print
                                          End If
                           
                                      End If
                                  Next
                                  
                              Next
                              
                              Set objProj = Nothing
                              
                          End Sub
                           
                          Private Function GetStringTypeName(v As VarTypeInfo) As String
                              Dim locType As TliVarType
                              
                              locType = v.VarType
                              
                              If locType And VT_ARRAY Then
                                  GetStringTypeName = "()"
                                  locType = locType And Not VT_ARRAY
                              End If
                              
                              GetStringTypeName = GetStringTypeName & " As "
                              
                              Select Case locType
                              Case TliVarType.VT_BOOL:        GetStringTypeName = GetStringTypeName & "Boolean"
                              Case TliVarType.VT_BSTR:        GetStringTypeName = GetStringTypeName & "String"
                              Case TliVarType.VT_CY:          GetStringTypeName = GetStringTypeName & "Currency"
                              Case TliVarType.VT_DATE:        GetStringTypeName = GetStringTypeName & "Date"
                              Case TliVarType.VT_DISPATCH:    GetStringTypeName = GetStringTypeName & "Object"
                              Case TliVarType.VT_HRESULT:     GetStringTypeName = GetStringTypeName & "HRESULT"
                              Case TliVarType.VT_I2:          GetStringTypeName = GetStringTypeName & "Integer"
                              Case TliVarType.VT_I4:          GetStringTypeName = GetStringTypeName & "Long"
                              Case TliVarType.VT_R4:          GetStringTypeName = GetStringTypeName & "Single"
                              Case TliVarType.VT_R8:          GetStringTypeName = GetStringTypeName & "Double"
                              Case TliVarType.VT_UI1:         GetStringTypeName = GetStringTypeName & "Byte"
                              Case TliVarType.VT_UNKNOWN:     GetStringTypeName = GetStringTypeName & "IUnknown"
                              Case TliVarType.VT_VARIANT:     GetStringTypeName = GetStringTypeName & "Variant"
                              Case TliVarType.VT_VOID:        GetStringTypeName = GetStringTypeName & "Any"
                              Case TliVarType.VT_EMPTY
                              
                                  If Not v.TypeInfo Is Nothing Then
                                      GetStringTypeName = GetStringTypeName & v.TypeInfo.Name
                                  End If
                                  
                              End Select
                              
                          End Function

                        Получить список сущностей в IDE.
                        В референсах подключить TypeLib Information и Edanmo's OLE Interfaces and functions
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0417 ]   [ 21 queries used ]   [ Generated: 19.03.24, 11:54 GMT ]