VB6: Как передать временную функцию в Visual Basic 6

В C++ возможно передать аргумент временного объекта в функцию:

struct Foo
{
    Foo(int arg);
    // ...
}

void PrintFoo(const Foo& f);

PrintFoo(Foo(10))

Я пытаюсь реализовать нечто подобное в Visual Basic 6:

'# Scroll bar params
Public Type ScrollParams
    sbPos As Long
    sbMin As Long
    sbMax As Long
End Type

Public Function MakeScrollParams(pos As Long, min As Long, max As Long)
    Dim params As ScrollParams
    With params
        .sbPos = pos
        .sbMin = min
        .sbMax = max
    End With
    Set MakeScrollParams = params
End Function

'# Set Scroll bar parameters
Public Sub SetScrollParams(sbType As Long, sbParams As ScrollParams)
    Dim hWnd As Long
    ' ...

End Sub

Тем не мение, Call SetScrollParams(sbHorizontal, MakeScrollParams(3, 0, 10)) выдает ошибку: несоответствие типа аргумента ByRef. Зачем?

2 ответа

Решение

Может быть?

Открытая функция MakeScrollParams(как долго, как минимум, как долго, как максимум) как ScrollParams

Пара вещей должна измениться из вашего существующего кода:

  1. Вы должны строго ввести объявление MakeScrollParams функция.

    Возвращает экземпляр ScrollParams тип, так что вы должны указать это явно в объявлении. Вот так:

    Public Function MakeScrollParams(pos As Long, min As Long, max As Long) As ScrollParams
    
  2. Вы должны удалить Set ключевое слово из последней строки в этой функции, чтобы избежать ошибки компиляции "Требуется объект". Вы можете использовать только Set с объектами, такими как экземпляры классов. Для обычных типов значений вы вообще опускаете это:

    MakeScrollParams = params
    


Таким образом, полное объявление функции будет выглядеть так:

Public Function MakeScrollParams(pos As Long, min As Long, max As Long) As ScrollParams
    Dim params As ScrollParams
    With params
        .sbPos = pos
        .sbMin = min
        .sbMax = max
    End With
   MakeScrollParams = params
End Function

И называя это так:

Call SetScrollParams(sbHorizontal, MakeScrollParams(3, 0, 10))

сейчас работает отлично.

Другие вопросы по тегам