как хранить массив Font

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

как хранить массив Font

Сообщение Avtopic » 16.02.2008 (Сб) 16:13

Здравствуйте!

Посоветуйте, как лучше хранить для немаленького массива информацию о фонте для каждого элемента массива:
сделать один массив As Font, или разложить атрибуты фонта и хранить в разных массивах.

В частности, меня интересует, что будет экономнее в части озу, то, что в части кода второй вариант не экономичен, я уже убедился. :?
но на сколько экономным будет, хранит массив объекта Font, и что будет содержать этот массив:
создаст соответствующее количество объектов при объявлении массива или создаст ссылки на что-то. В двух словах, если можно.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.02.2008 (Сб) 17:38

1) Смотря как "разложишь".
2)
создаст соответствующее количество объектов при объявлении массива или создаст ссылки на что-то

Кто создаст? Ссылки на что-то - что? О чём речь вообще?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.02.2008 (Сб) 20:12

Хакер писал(а):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

это, аналог сохранения 100 структур членами которой являются
    Bold
    Charset
    Italic
    Name
    Size
    Strikethrough
    Underline
    Weight

или занимает больше ресурсов?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.02.2008 (Сб) 20:15

StdFont это класс. Налица полное незнание разницы между структурами и классами, а также неумение работать с классами (пример не рабочий).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.02.2008 (Сб) 20:55

если вы про New, позвольте заметить что и сто одинаковых элемента в массиве тоже никому не нужно.
вопрос с самого начала был конкретный, и касается занимаемого места в озу.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.02.2008 (Сб) 21:10

если вы про New, позвольте заметить что и сто одинаковых элемента в массиве тоже никому не нужно.

Смысл замечания не ясен.

вопрос с самого начала был конкретный, и касается занимаемого места в озу.

Ответ на поставленный вопрос всецело зависит от того, как будет реализован вариант с классами.

Напомню, тем всё-таки, что память отводится страницами по 4кб (в общем случае), и экономии в 4000 байт не может быть в принципе.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.02.2008 (Сб) 21:43

В двух словах опишу свою задачу:
имеется большая матрица, двухмерный массив. Размер выбирает клиент.
на экране он работает с маленькой частью этого массива, но в какую область переберется (этого массива), никто не знает. Скорость превыше всего, потому желательно все держать в памяти.
Для каждого элемента мне надо хранить шрифт. На этот момент у меня сделано Property Let, Property Get для всех свойств фонта, соответственно столько же массивов, сколько свойств. Только код этих Property Let и Get занимает половину полезного кода. Вот и подумал, не будет ли лучше сделать один массив фонта и через свойства класса запоминать и менять атрибуты фонта, только не знаю в размерах памяти компьютера, во что это превратится.
т.е.
Arr(4000,100) as font
во сколько будет отличатся от
FontName (4000,100) as String+ FontSize(4000,100) as long+ Font...

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.02.2008 (Сб) 22:25

Я не помнимаю. Вот ты говоришь, что тебе важна скорость. Почему же ты первым делом интересуешься об экономичности в плане использования ОЗУ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.02.2008 (Сб) 22:48

я не интересуюсь первым делом об экономичности в плане использования ОЗУ, первим делом меня беспокоит DrawText который рисует текст в четыре-пять раз медленнее, чем TextOut, который мне не подходит.
Но там сэкономит мне не удастся, но зато можно подготовить для CreateFontIndirect структуру логфонт побыстрее, и на этом секономить, и т.д. и т.п.
но еще раз добавлю вдруг клиент выберет большую матрицу для обработки, и вдело пойдет диск.
вот и хочу определится, на чем проиграть на чем выиграть. и в чем ограничит клиента.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.02.2008 (Сб) 22:51

Вот. Тут возникла мысль: обычно DrawText и ниже вызываются очень редко, при перерисовывании. У тебя так?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.02.2008 (Сб) 23:04

Если правильно понял вопрос, у меня вызываются при каждой перерисовке и столко же раз сколько ячеек.
потому что:
постоянно меняется цвет и содержание ячеек матрицы. Почти от положения курсора.
Только, умоляю, не советуйте мне DirectDraw :)

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 16.02.2008 (Сб) 23:08

А каждая перерисовка происходит (надеюсь) не по таймеру?

Вообще, подобные алгоритмы надо тщательнейшим образом продумывать. Чтобы не перерисовывть лишнее.

Да, и кстати. Как вызывается функция и как/где она объявлена?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 16.02.2008 (Сб) 23:19

нет не по таймеру, при изменении данных или региона или чегото еше что неприменно требует перерисовки

Хакер писал(а):Вообще, подобные алгоритмы надо тщательнейшим образом продумывать. Чтобы не перерисовывть лишнее.

в этом абсолютно согласен и наверно придется ввести свой “invalidate” те ячейки, которие изменились, чтобы не рисовать все.

функция объявлена в ActiveX, и
DrawText hDC, TxValue, Len(TxValue), rc, ??ALIGN

в конце всей перерисовки BitBlt, в hDC контроля.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.02.2008 (Вс) 0:06

функция объявлена в ActiveX

Эмм... что?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 17.02.2008 (Вс) 11:41

UserControl

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.02.2008 (Вс) 11:42

Строку кода в студию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 17.02.2008 (Вс) 12:36

спасибо за содействие канешно, но разбираться в чужом большом коде...
если вес код перешлю, сервер остановится наверно.
эта часть, где происходит рисование всего текста и теряется около 140-150 мс

Код: Выделить всё

'константы смещения текста и фона относительно сетки
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

'дальше идет отрисовка очень многого чего-то, но на них почти время не уходит.
'...
'...
'...


Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.02.2008 (Вс) 15:37

Avtopic
Мне не надо строку кода, где вызывается функция. Я изначально и уже 2 раза прошу объявление функции. Есть оно? Declare Function DrawText ... - есть такое ?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 17.02.2008 (Вс) 15:55

есть такое :)
Код: Выделить всё
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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.02.2008 (Вс) 15:58

Вот. Наконец-то.

Я всегда удивлялся, почему жаждущие скорости используют медленно работющую declare-конструкцию и вызов функции, идущий через цепочку всевозможной проверочной дряни, DllFunctionCall-ов и прочего.

И ведь не судьба им использовать нормальный импорт.

А скорость вызова может увеличиться в 10 раз.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 17.02.2008 (Вс) 16:45

Хакер писал(а):И ведь не судьба им использовать нормальный импорт.

А скорость вызова может увеличиться в 10 раз.


VB же не создает секцию импорта в EXE файле

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.02.2008 (Вс) 17:02

jangle
Создаёт, если функции объявлены соответствующим образом.

С++ тоже не создаёт, если использовать LoadLibrary, GetProcAddress, call. Однако ведь создаёт, если использовать lib-ки.

VB вместо lib-ов нужны tlb-шки.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 17.02.2008 (Вс) 19:33

Хакер
Постарался сделать это через CallWindowProc если вы это имели ввиду, рисует также медленно, плюс время на лишние телодвижения для параметров.
Вы другое имели ввиду?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 17.02.2008 (Вс) 19:47

Совершенно другое. Абсолютно. Я имел ввиду диаметрально противоположенную вещь.

Взять TLB в которой объявлена TextOut и её оттуда юзать, на всякий случай удалив все её Declar-ы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 18.02.2008 (Пн) 18:28

Спасибо и на том, что вынудили что-то новое узнать...

Взял я этот tlb, достал оттуда только DrawText и структуру RECT, сделал tlb, присобачил к проекту, убрал все Declar-ы...
Секунда в секунду, результат тот же. :(

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 18.02.2008 (Пн) 18:30

Native-код? Проект скомпилирован?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 18.02.2008 (Пн) 18:42

Уже да.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 18.02.2008 (Пн) 20:06

Avtopic
А ты рисуешь куда? Сразу на экран или в совместимый контекст устройства?
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Avtopic
Постоялец
Постоялец
 
Сообщения: 442
Зарегистрирован: 30.09.2005 (Пт) 17:15
Откуда: Tbilisi

Сообщение Avtopic » 18.02.2008 (Пн) 20:18

в совместимый контекст устройства

Avtopic писал(а):в конце всей перерисовки BitBlt, в hDC контроля.

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 19.02.2008 (Вт) 7:03

в этом абсолютно согласен и наверно придется ввести свой “invalidate” те ячейки, которие изменились, чтобы не рисовать все.
Так и делай
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: The trick и гости: 44

    TopList  
cron