создаст соответствующее количество объектов при объявлении массива или создаст ссылки на что-то
Полностью.Хакер писал(а):1) Смотря как "разложишь".
Хакер писал(а):2)создаст соответствующее количество объектов при объявлении массива или создаст ссылки на что-то
Кто создаст? Ссылки на что-то - что? О чём речь вообще?
Dim Arr(100) As StdFont
Sub mm()
Dim i As Long
For i = 1 To 100
Arr(i).Name = "Arial"
Arr(i).Bold = True
Arr(i).Italic = True
Arr(i).Size = i
Arr(i).Underline = False
Next
End Sub
если вы про New, позвольте заметить что и сто одинаковых элемента в массиве тоже никому не нужно.
вопрос с самого начала был конкретный, и касается занимаемого места в озу.
Хакер писал(а):Вообще, подобные алгоритмы надо тщательнейшим образом продумывать. Чтобы не перерисовывть лишнее.
функция объявлена в ActiveX
'константы смещения текста и фона относительно сетки
Const SmBkleft As Long = 1, SmBktop As Long = 1, SmBkright As Long = 0, SmBkbottom As Long = 0
Const SmTxleft As Long = 3, SmTxtop As Long = 3, SmTxright As Long = 2, SmTxbottom As Long = 0
'подготавливает размеры всего, что нужно рисовать сетка, выделенная область и т.д.
'здесь время не теряется, возвращается за 1-1,5 мс
MakeSizeTable
'Bgn ==============================================
SetBkMode hDC, 1
'заготовка для основной массы у которых ожидается что шрифт и фон одинаковый
BkLgf.lfHeight = (Font.Size * -20) / Screen.TwipsPerPixelY
BkLgf.lfFaceName = Font.Name & vbNullChar
BkFont_hWnd = CreateFontIndirect(BkLgf)
oldBkFont = SelectObject(hDC, BkFont_hWnd)
'Bkgrnd
Call OleTranslateColor(m_BackVrtor, 0, BkClr)
mBrush = CreateSolidBrush(BkClr)
SetRect rc, 20, 20, UserControl.ScaleWidth, UserControl.ScaleHeight
FillRect hDC, rc, mBrush
DeleteObject mBrush
For c = HeaderVrts To VisibleVrts
If iVrt(c) < m_Vrts And (Vrt_(c).Left + SmBkleft) < (Vrt_(c).Right + SmBkright) Then
For r = HeaderHrzs To VisibleHrzs
If IHrz(r) < m_Hrzs And (Hrz_(r).Top + SmBktop) < (Hrz_(r).Bottom - SmBkbottom) Then
'фон
BkClrMatrix = MatrixBackVrtor(IHrz(r), iVrt(c))
'при определенном условии фон темноват
If PtInRect(SLcRect, Vrt_(c).Left, Hrz_(r).Top) <> 0 And PtInRect(AtvRect, Vrt_(c).Left, Hrz_(r).Top) = 0 Then BkClrMatrix = BkClrMatrix - 100
mBrush = CreateSolidBrush(BkClrMatrix)
SetRect rc, Vrt_(c).Left + SmBkleft, Hrz_(r).Top + SmBktop, Vrt_(c).Right - SmBkright, Hrz_(r).Bottom - SmBkbottom
FillRect hDC, rc, mBrush
DeleteObject mBrush
End If
Next
End If
Next
'Draw Text ==============================================
Call OleTranslateColor(m_ForeVrtor, 0, TxClr)
For c = HeaderVrts To VisibleVrts
CL_ALIGN = VrtAlignment(iVrt(c))
For r = HeaderHrzs To VisibleHrzs
'текст
MatrixValue = CStr(Matrixs(IHrz(r), iVrt(c)))
'шрифт
Lgf.lfHeight = (MatrixFontSize(IHrz(r), iVrt(c)) * -20) / Screen.TwipsPerPixelY
Lgf.lfFaceName = MatrixFontName(IHrz(r), iVrt(c)) & vbNullChar
If MatrixFontBold(IHrz(r), iVrt(c)) = True Then Lgf.lfWeight = 700 Else Lgf.lfWeight = 0
'цвет текста
TxClrMatrix = MatrixForeColor(IHrz(r), iVrt(c))
If TxClr = TxClrMatrix Then SetTextColor hDC, TxClr Else SetTextColor hDC, TxClrMatrix
SetRect rc, Vrt_(c).Left + SmTxleft, Hrz_(r).Top + SmTxtop, Vrt_(c).Right - SmTxright, Hrz_(r).Bottom - SmTxbottom
If Lgf.lfFaceName = BkLgf.lfFaceName And Lgf.lfHeight = BkLgf.lfHeight And Lgf.lfWeight = BkLgf.lfWeight Then
DrawText hDC, MatrixValue, Len(MatrixValue), rc, CL_ALIGN
Else
'раз отличается то свой фонт
Font_hWnd = CreateFontIndirect(Lgf)
oldFont = SelectObject(hDC, Font_hWnd)
DrawText hDC, MatrixValue, Len(MatrixValue), rc, CL_ALIGN
DeleteObject SelectObject(hDC, oldFont)
End If
Next
Next
'дальше идет отрисовка очень многого чего-то, но на них почти время не уходит.
'...
'...
'...
Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hDC As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
Хакер писал(а):И ведь не судьба им использовать нормальный импорт.
А скорость вызова может увеличиться в 10 раз.
Так и делайв этом абсолютно согласен и наверно придется ввести свой “invalidate” те ячейки, которие изменились, чтобы не рисовать все.
Сейчас этот форум просматривают: Yandex-бот и гости: 104