TCreator
Материал из GedeminWiki
(Различия между версиями)
SYSDBA (обсуждение | вклад) (→Исходный код) |
SYSDBA (обсуждение | вклад) (→Исходный код) |
||
| Строка 23: | Строка 23: | ||
=== Исходный код === | === Исходный код === | ||
| − | < | + | <source lang="vbnet"> |
Class TCreator | Class TCreator | ||
Private FCount | Private FCount | ||
| Строка 106: | Строка 106: | ||
End Sub | End Sub | ||
End Class | End Class | ||
| − | </ | + | </source> |
[[Category:VBScript]] | [[Category:VBScript]] | ||
Версия 12:28, 23 мая 2009
Класс 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