2013-04-16 2 views
0

Моя функция используется для замены апострофа, то есть ' в любом из свойств объекта. Функция использует библиотеку TypeLib для достижения этой цели, обернув через всех членов объекта, т.е.Для каждого не инициализируется

Public Function EscapeWildCards(ByRef obj As Object, _ 
           Optional ByVal bEscape As Boolean = True) As Boolean 
    On Error GoTo EscapeWildCards_Err 
    Dim tTLI As TLIApplication 
    Dim tMem As MemberInfo 
    Dim tInvoke As InvokeKinds 
    Dim tName As String  'used as lower case.... 
    Dim tString As String 

1 Set tTLI = New TLIApplication 
    '... if True, we are setting else we are getting 
2 tInvoke = IIf(bEscape, VbGet, VbLet) 

3 If obj Is Nothing Then Exit Function 
4 For Each tMem In TLI.InterfaceInfoFromObject(obj).Members 
5  'tName = LCase$(tMem.Name) 
6  If tMem.InvokeKind = tInvoke Then 'And tMem.Parameters.Count = 0 
      'could be object/something else that can't handle 
      On Error Resume Next 
      ' get the oobject property value 
7   tString = CallByName(obj, tMem.Name, VbGet) 
8   If tInvoke = VbGet Then 
9    If IndexOf(tString, "'") > 0 Then 
10     tString = Replace$(tString, "'", "`") 
11     CallByName obj, tMem.Name, VbLet, tString 
       End If 
      Else 
       '... set data replacing aposthrophe 
12    If IndexOf(tString, "'") > 0 Then 
13     tString = Replace$(tString, "`", "'") 
14     CallByName obj, tMem.Name, VbLet, tString 
       End If 
      End If 
      'Debug.Print tName, " = ", tString 
      On Error GoTo EscapeWildCards_Err 
     End If 
    Next 

    Exit Function 

EscapeWildCards_Err: 
    ErrReport Err.Description, "modCommon.EscapeWildCards", Erl 
    Resume Next 
End Function 

Когда я проверить код в IDE, я не получаю никаких ошибок. Но когда я компилирую и тестирую как EXE, я получаю следующие ошибки:

Object doesn't support this action. LineNo 4 
Object variable or With block variable not set. LineNo 5 
Object variable or With block variable not set. LineNo 6 
For loop not initialized. LineNo 14 

Почему я не получаю ошибки, когда приложение работает в IDE, но я при компиляции? Может ли кто-нибудь указать мне, что я делаю неправильно?

+0

1. Как вы добираетесь до строки № 5, если у вас уже есть ошибка в строке # 4? 'Продолжить дальше'? Но тогда только ошибка в строке №4 представляет интерес. 2. Вероятно, в ваших интересах разместить полный фрагмент кода (подсказка: в вашем фрагменте нет метки 'EscapeWildCards_Err'). 3. Вероятно, в ваших интересах объяснить, какие ссылки должны быть добавлены в проект. –

+0

привет, я скорректировал код. вы можете видеть, что я прокомментировал некоторые фрагменты кода. – Smith

+0

Просто предположите, но попробуйте 'Dim tTLI As TLI.InterfaceInfo' вместо TLIApplication. – jac

ответ

2

Прежде всего, вы не поможете себе справиться с ошибками. Выполнение резюме Далее, не выполняя некоторую проверку фактической ошибки, является универсальным способом путаницы и ошибки города. Ваш заголовок вводит в заблуждение - это не утверждение «Для каждого», которое вызывает проблему. Это:

TLI.InterfaceInfoFromObject(obj).Members 

Чтобы быть точным, это свойство членов, которое терпит неудачу. (О, и вы, очевидно, не сделали прямую копию и вставку, потому что я предполагаю, что «TLI» должен быть «tTLI».). Причина этого, вероятно, в том, что объект, который вы пытаетесь использовать, не имеет открытого интерфейса, зарегистрированного в библиотеке типов.

Я предполагаю, что вы пытаетесь сделать это с помощью внутреннего класса VB, такого как форма или частный класс. Во время выполнения VB IDE создает информацию о библиотеке времени выполнения во время работы (как вы думаете, вы можете использовать uncompiled DLL-проекты во время выполнения?). Хотя в среде IDE VB создает информацию типа lib для вашего класса, на лету. Но при компиляции эта информация не существует, поэтому ошибка.

Если это так, вам придется создавать интерфейсы для ваших частных классов вручную, создавая DLL, которая предоставляет интерфейс, который вы хотите использовать. Этот интерфейс затем будет реализован в частный класс. К сожалению, вы не можете сделать это с экземплярами Form.

+0

спасибо за информацию, но если я поместил класс в dll activeX и ссылаюсь на dll, это решит проблему, и есть ли какой-либо ресурс для создания интерфейсов, о которых вы говорили? – Smith

+0

@Smith Если ваш класс становится общедоступным в DLL ActiveX, то для вашего класса действительно создается информация о библиотеке типов. Вам не нужно использовать ресурс для создания интерфейсов, отличных от VB6. Просто позвоните в интерфейс своего класса, как IMyInterface, а затем используйте «Implements IMyInterface» в вашем реальном классе, чтобы вытащить интерфейс. –

+0

Мне нужен интерфейс, закодированный в dll или vb, это я переведу класс из моего проекта в DLL ActiveX? – Smith

Смежные вопросы