TCreator
Материал из GedeminWiki
(Различия между версиями)
SYSDBA (обсуждение | вклад) (→Исходный код) |
SYSDBA (обсуждение | вклад) |
||
| Строка 3: | Строка 3: | ||
=== Пример использования === | === Пример использования === | ||
| − | < | + | <syntaxhighlight lang="vbnet"> |
Option Explicit | Option Explicit | ||
Sub MyProcedure | Sub MyProcedure | ||
| Строка 17: | Строка 17: | ||
End Sub | End Sub | ||
| − | </ | + | </syntaxhighlight> |
См. также статью [[Реализация конструкции try-finally на VBScript]]. | См. также статью [[Реализация конструкции try-finally на VBScript]]. | ||
Версия 15:55, 13 апреля 2010
Класс TCreator служит для создания объектов и гарантирует освобождение объекта по выходу из области видимости. При использовании GetObject освобождение объектов непосредственно в скрипт-функции не требуется.
Пример использования
Option Explicit Sub MyProcedure Dim Creator, F Set Creator = new TCreator Set F = Creator.GetObject(Application, "usrf_MyForm", "MyName") F.ShowModal ' высвобождать форму F вручную не требуется, так как она будет ' уничтожена автоматически в процессе уничтожения объекта Creator ' по завершении процедуры MyProcedure End Sub
См. также статью Реализация конструкции try-finally на VBScript.
Исходный код
Class TCreator Private FCount Private FObjectArray() Private FFinallyCount Private FFinallyCode() Public Sub DestroyAllObjects for I = UBound(FObjectArray) to LBound(FObjectArray) step -1 if VarType(FObjectArray(I)) = vbObject then FObjectArray(I).DestroyObject FObjectArray(I) = Empty end if next FCount = -1 End Sub Public Function GetObject(Params, ClassName, Name) FCount = FCount + 1 if FCount > UBound(FObjectArray) then ReDim Preserve FObjectArray((UBound(FObjectArray) + 1) * 2 - 1) end if set FObjectArray(FCount) = Designer.CreateObject(Params, ClassName, Name) set GetObject = FObjectArray(FCount) End Function 'Используется, в случае необходимости, 'для уничтожения объктов созданных Креатором Public Sub DestroyObject(Object) for I = UBound(FObjectArray) to LBound(FObjectArray) step -1 if VarType(FObjectArray(I)) = vbObject then if Addr(FObjectArray(I)) = Addr(Object) then FObjectArray(I) = Empty Object.DestroyObject exit sub end if end if next call Exception.Raise("Exception", "В списке не найден переданный объект.") End Sub Public Function AddFinallyCode(ByRef S, ByRef Obj) FFinallyCount = FFinallyCount + 1 if FFinallyCount > UBound(FFinallyCode, 1) then _ ReDim Preserve FFinallyCode((UBound(FFinallyCode) + 1) * 2 - 1, 1) FFinallyCode(FFinallyCount, 0) = S if IsObject(Obj) then Set FFinallyCode(FFinallyCount, 1) = Obj else FFinallyCode(FFinallyCount, 1) = Obj end if AddFinallyCode = FFinallyCount End Function Public Sub DeleteFinallyCode(I) FFinallyCode(I, 0) = "" if IsObject(FFinallyCode(I, 1)) then _ Set FFinallyCode(I, 1) = Nothing End Sub Public Sub ExecFinallyCode Dim I For I = LBound(FFinallyCode, 1) To UBound(FFinallyCode, 1) if FFinallyCode(I, 0) > "" then Execute Replace(FFinallyCode(I, 0), "<X>", "FFinallyCode(I, 1)") DeleteFinallyCode I end if Next End Sub Private Sub Class_Initialize ReDim FObjectArray(7) FCount = -1 ReDim FFinallyCode(1, 1) FFinallyCount = -1 End Sub Private Sub Class_Terminate ExecFinallyCode DestroyAllObjects End Sub End Class