Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[54.163.218.81] |
|
Сообщ.
#1
,
|
|
|
Прикреплённая картинка
Прикреплённая картинка
Прикреплённая картинка
Уважаемые господа!Каким образом из программы узнать состав проекта в 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г. Лодя Прикреплённая картинка
|
Сообщ.
#2
,
|
|
|
Узнать количество frm файлов в проекте можно проанализировав содержание vbp файла. Данный подход работает полько в проекте. В скомполированном приложении он работать не будет.
|
Сообщ.
#3
,
|
|
|
Анализ директории может дать неверный результат, т.к. В проект можно добавлять файлы из любой директории.
|
Сообщ.
#4
,
|
|
|
Уважаемые господа!
Переформулирую свой вопрос. Для VB6. Как указать программно (из кода) на одну из форм проекта, если форма еще не загружена и ее еще нет в коллекции Forms. Но известны все имена форм, включенных в проект. Эти имена найдены из просмотра файла проекта .vbp и просмотра файлов форм .frm ( в файлах форм - чтение строки Begin VB.Form ). Эти имена - строковые переменные. Такое указание или поименование должно позволить узнать свойства формы, состояние видимости и позволить загрузить ее если это необходимо. С уважением, Лодя. 31 октября 2017г. |
Сообщ.
#5
,
|
|
|
Цитата Лоля @ Как указать программно (из кода) на одну из форм проекта, если форма еще не загружена и ее еще нет в коллекции Forms. Но известны все имена форм, включенных в проект. Загрузить, потом указывать. Ибо указывать на то, чего нет, о чём только известно, что оно бывает - бессмысленно. Добавлено Цитата Лоля @ Каким образом из программы узнать состав проекта в VB6? Например, получить список всех форм проекта. Подчеркиваю, не загруженных форм, а форм, включенных в проект через меню Project, Add Form и т.д. и показанных в Project Explorer. Загрузить инстанс проекта и энумеровать все его ресурсы. Муторно. API. |
Сообщ.
#6
,
|
|
|
Лоля, тебе действительно интересен функционал проекта и неинтересно как ето будет работать в скомпилированном приложении?
|
Сообщ.
#7
,
|
|
|
Цитата "Лодя" Как указать программно (из кода) на одну из форм проекта, если форма еще не загружена и ее еще нет в коллекции Forms. Что значит указать? Цитата "Лодя" Такое указание или поименование должно позволить узнать свойства формы, состояние видимости и позволить загрузить ее если это необходимо. При первом доступе к форме она будет загружена. Вообще можно узнать список всех модулей (классов, форм, юзерконтролов и т.д.) как в IDE так и в скомпилированном виде через код, без разбора vbp файла. |
Сообщ.
#8
,
|
|
|
А если ещё учесть варианты типа
Dim Form123 As New Form1 |
Сообщ.
#9
,
|
|
|
Уважаемые господа!
Прошу закончить. С уважением, Лодя 01 ноября 2017г |
Сообщ.
#10
,
|
|
|
Уважаемые господа!
Поясняю ситуацию, пусть в проекте имеется насколько форм. Загружена одна - две формы (например MDIForm1 + Form9). Вызвана подпрограмма из модуля. Желательно в коде этой подпрограммы получить ответ имеется ли в проекте, скажем “Form8” без загрузки этой формы, а загружать ее только в отдельных случаях. С уважением, Лодя, 01 ноября 2017г Постскриптум В коллекции форм Forms – только загруженные формы. |
Сообщ.
#11
,
|
|
|
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 |