TCreator

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Исходный код)
 
Строка 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 FFinallyCount
+
   Private FID
  Private FFinallyCode()
+
  
 
   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).DestroyObject
+
         Designer.DestroyObject(FObjectArray(I))
         FObjectArray(I) = Empty
+
         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) = Empty
+
           Designer.DestroyObject(FObjectArray(I))
           Object.DestroyObject
+
           Set FObjectArray(I) = Nothing
 
           exit sub
 
           exit sub
 
         end if
 
         end if
Строка 63: Строка 73:
 
      
 
      
 
     call Exception.Raise("Exception", "В списке не найден переданный объект.")
 
     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
 
   End Sub
  
Строка 97: Строка 78:
 
     ReDim FObjectArray(7)
 
     ReDim FObjectArray(7)
 
     FCount = -1
 
     FCount = -1
     ReDim FFinallyCode(1, 1)
+
     FID = NextCreatorID
     FFinallyCount = -1
+
    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
    ExecFinallyCode
 
 
     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
Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты