TCreator
Материал из GedeminWiki
(Различия между версиями)
SYSDBA (обсуждение | вклад) |
SYSDBA (обсуждение | вклад) (→Исходный код) |
||
| Строка 24: | Строка 24: | ||
<source lang="vbnet"> | <source lang="vbnet"> | ||
| + | 'Класс служит для создания объектов методом GetObject. | ||
| + | 'Класс гарантирует освобождение объекта по завершению скрипта. | ||
| + | 'При использьзовании GetObject освобождение объектов непосредственно в скрипт-функции не требуется, | ||
| + | 'оно происходит автоматически при завершению скрипт-функции. | ||
| + | |||
| + | Private NextCreatorID | ||
| + | Private CreatorCnt | ||
| + | |||
| + | NextCreatorID = 0 | ||
| + | CreatorCnt = 0 | ||
| + | |||
Class TCreator | Class TCreator | ||
Private FCount | Private FCount | ||
Private FObjectArray() | Private FObjectArray() | ||
| − | Private | + | Private FID |
| − | + | ||
Public Sub DestroyAllObjects | Public Sub DestroyAllObjects | ||
for I = UBound(FObjectArray) to LBound(FObjectArray) step -1 | for I = UBound(FObjectArray) to LBound(FObjectArray) step -1 | ||
if VarType(FObjectArray(I)) = vbObject then | if VarType(FObjectArray(I)) = vbObject then | ||
| − | FObjectArray(I) | + | Designer.DestroyObject(FObjectArray(I)) |
| − | FObjectArray(I) = | + | Set FObjectArray(I) = Nothing |
end if | end if | ||
next | next | ||
| Строка 55: | Строка 65: | ||
if VarType(FObjectArray(I)) = vbObject then | if VarType(FObjectArray(I)) = vbObject then | ||
if Addr(FObjectArray(I)) = Addr(Object) then | if Addr(FObjectArray(I)) = Addr(Object) then | ||
| − | FObjectArray(I) | + | Designer.DestroyObject(FObjectArray(I)) |
| − | + | Set FObjectArray(I) = Nothing | |
exit sub | exit sub | ||
end if | end if | ||
| Строка 63: | Строка 73: | ||
call Exception.Raise("Exception", "В списке не найден переданный объект.") | call Exception.Raise("Exception", "В списке не найден переданный объект.") | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
End Sub | End Sub | ||
| Строка 97: | Строка 78: | ||
ReDim FObjectArray(7) | ReDim FObjectArray(7) | ||
FCount = -1 | FCount = -1 | ||
| − | + | FID = NextCreatorID | |
| − | + | CreatorCnt = CreatorCnt + 1 | |
| + | NextCreatorID = NextCreatorID + 1 | ||
| + | System.AddLogRecord "TCreator", "Created #" & FID & ", Total: " & CreatorCnt, 1, -1, "", False | ||
End Sub | End Sub | ||
Private Sub Class_Terminate | Private Sub Class_Terminate | ||
| − | |||
DestroyAllObjects | DestroyAllObjects | ||
| + | CreatorCnt = CreatorCnt - 1 | ||
| + | System.AddLogRecord "TCreator", "Destroyed #" & FID & ", Total: " & CreatorCnt, 1, -1, "", False | ||
End Sub | End Sub | ||
End Class | End Class | ||
Текущая версия на 15:44, 20 декабря 2021
Класс 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.
[править] Исходный код
'Класс служит для создания объектов методом GetObject. 'Класс гарантирует освобождение объекта по завершению скрипта. 'При использьзовании GetObject освобождение объектов непосредственно в скрипт-функции не требуется, 'оно происходит автоматически при завершению скрипт-функции. Private NextCreatorID Private CreatorCnt NextCreatorID = 0 CreatorCnt = 0 Class TCreator Private FCount Private FObjectArray() Private FID Public Sub DestroyAllObjects for I = UBound(FObjectArray) to LBound(FObjectArray) step -1 if VarType(FObjectArray(I)) = vbObject then Designer.DestroyObject(FObjectArray(I)) Set FObjectArray(I) = Nothing 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 Designer.DestroyObject(FObjectArray(I)) Set FObjectArray(I) = Nothing exit sub end if end if next call Exception.Raise("Exception", "В списке не найден переданный объект.") End Sub Private Sub Class_Initialize ReDim FObjectArray(7) FCount = -1 FID = NextCreatorID CreatorCnt = CreatorCnt + 1 NextCreatorID = NextCreatorID + 1 System.AddLogRecord "TCreator", "Created #" & FID & ", Total: " & CreatorCnt, 1, -1, "", False End Sub Private Sub Class_Terminate DestroyAllObjects CreatorCnt = CreatorCnt - 1 System.AddLogRecord "TCreator", "Destroyed #" & FID & ", Total: " & CreatorCnt, 1, -1, "", False End Sub End Class