|
|
|
| Глобальный ImageList.
Введение:
В процессе разработки приложений в Access'е (MSA), периодически возникает потребность в использовании элементов AcniveX, таких как TreeView, ListView, ImageComboBox и т.п., которые достаточно активно используют элемент ImageList для хранения изображений. Основным недостатком его использования является, по моему мнению, необходимость располагать его в каждой форме, где его предполагается использовать, что приводит к фактической неуправляемости хранимых в проекте изображений, большой трудоемкости по изменению состава изображений и т.п. (Возможно также имеются ограничения на количество изображений, хранящихся в элементе.)
Цель:
Создать Единый Глобальный элемент ImageList для всего проекта, который устранит вышеперечисленные недостатки (а может и привнесет что-то новое, ценное).
Варианты:
- Вариант 00 - Стандартный. Достоинства и недостатки перечислены выше.
- Вариант 01 - Создать форму, на которой расположить ImageList. Использовать его путем открытия формы в скрытом режиме.
- Вариант 02 - Создать экземпляр ImageList в общем модуле (или создать класс - в данном случае это не принципиально, т.к. недостаток все равно остается). Заполнять его в момент использования.
- Недостатки: Заполнение производится из файлов, что также вызовет проблемы с управляемость, только теперь уже на уровне файлов.
- Вариант 03 - Аналогичен Варианту 02, за исключением того, что изображения хранить в таблице. Здесь уже класс напрашивается сам собой.
- Недостатки:
- Доступен только с MSA2007, т.к поле с типом "Вложение" появилось только с этой версии;
- Загружаемые в таблицу картинки необходимо подвергать проверке на соответствие BMP, JPG, ICO, т.к. ImageList другие форматы не "кушает";
- Заполнение ImageList все равно производится через файл на диске, но только теперь временный.
Предлагаю высказываться по данному вопросу. Может проблема надумана?
Реализацию предложенных вариантов (для 2010/2007 и 2003) можно скачать =>> http://slil.ru/29385261 | |
|
| |
|
31 Кб. |
|
| Вопрос 1:
Кто надоумил Вас пихать в ImageList картинки под мегабайт?
Пристрелите его немедленно!
Ремарки:
К варианту 01: Нет надобности все время открывать невидимую форму с ImageList.
Альтернатива в прицепе.
К варианту 02:
...Заполнять его в момент использования...
Заполнять надо один раз, при первом обращении.
См. прицеп.
К варианту 03:
"Вложения" в А2007 вроде как хранятся не в таблицах. | |
|
| |
|
|
|
| хранить в ImageList картинки большого размера и тем более в bmp считаю расточительством
(если нужно разместить какие-то большие фото, дабы не увеличивать объем базы, предпочитаю держать рядом с базой и подгружать по мере необходимости но не через ImageList )
опять же если появится необходимость переместить базу - то важно не забыть про рисунки
а маленькие рисунки (пиктограмки) - их все равно не так много используется - по-этому возможно хранить и на невидимой форме
а можно хранить там же и два(три, четыре) ImageList и при необходимости обращаться к нужному комплекту рисунков
вот только еще одна загвоздка при загрузке формы и соответственно контрола(-лов) ImaseList все рисунки находящиеся в контейнере(-рах) грузятся в память компа | |
|
| |
|
|
|
|
| ИМХО проблема надуманная и на практике разрешается копированием одного объекта в разные формы - это проще.
1 редактирование содержимого ImageList скорее исключение чем правило весь набор всех изображений должен содержаться в имадж-листе заранее (бывают экзотические случаи, когда приходится передергивать картинки - не связанные с отображением картинок имадж-листа в объектах эктивекс)
2 если следовать такой логике, то и все оставльные объекты и контролы эктивекс используемые на форме нужно аналоичным образом вставлять "на лету" вытаскивая из одного источника, что в общем-то концептуально верно, но практически слишком хлопотно... глобальный тривью глобальный листвью
ну и конечно нужно стремиться к оптимизации интерфейса и сокращать количество форм и объектов форм - это общий глобальный принцип относящийся не только к ImageList | |
|
| |
|
|
|
| Ну, если Вы не видите принципиальной разницы, я Вам ее покажу.
Тестовая функция:
Public Declare Function apiTimeGetTime Lib "winmm.dll" Alias "timeGetTime" () As Long
Public Function Test()
Dim i As Long, j As Integer
Dim start As Long
Dim resp As Integer
For j = 1 To 10
start = apiTimeGetTime
For i = 1 To 10000
resp = GetImageList().ListImages.Count
Next i
Debug.Print j, "GetImageList", apiTimeGetTime - start
start = apiTimeGetTime
For i = 1 To 10000
resp = Forms("frmImageList").ImageList01.Object.ListImages.Count
Next i
Debug.Print j, "frmImageList", apiTimeGetTime - start
Next j
End Function
|
Результаты:
1 GetImageList 15
1 frmImageList 1344
2 GetImageList 16
2 frmImageList 828
3 GetImageList 0
3 frmImageList 953
4 GetImageList 0
4 frmImageList 953
5 GetImageList 16
5 frmImageList 953
6 GetImageList 15
6 frmImageList 860
7 GetImageList 0
7 frmImageList 953
8 GetImageList 16
8 frmImageList 953
9 GetImageList 0
9 frmImageList 953
10 GetImageList 15
10 frmImageList 954
|
Надеюсь теперь принципиальная разница заметней?
И это я только спросил, сколько в коллекции рисунков. | |
|
| |
|
|
|
| УБЕДИТЕЛЬНЫЙ РЕЗУЛЬТАТ!!!
| |
|
| |
|
|
|
| А вот еще бяка. Хочу узнать привязан ли ImageList к TreeView. Делаю это до и после привязки.
If Me.ctlTreeView.ImageList Is Nothing Then
...
End If
Так вот в Варианте 01 при открытии скрытой формы - все отрабатывается, а вот при вызове
Me.ctlTreeView.ImageList = GetImageList()
ДО - отрабатывается, ну это понятно, а вот ПОСЛЕ дает ошибку "430"
Тот же эффект и при Варианте 02.
Это я не правильно пытаюсь определить наличие привязки ImageList к TreeView? | |
|
| |
|
|
|
| Здесь, наверное, стоит почитать:
http://forum.sql.ru/forum/actualthread.aspx?tid=480890&pg=1&hl=imagelist� | |
|
| |
|
|
|
| Ссылку посмотрел, почитал (чуть ли не облизал ), НО, извините меня придурка, все равно ничего не понял.
Почему в случае "Me.ctlTreeView.ImageList = GetImageList()" этот самый Me.ctlTreeView.ImageList перестает быть объектом или перестает "показывать возможность программирования интерфейса" (как написано в справке по ошибке 430)?
Ведь и в случае ссылки на элемент скрытой формы и GetImageList в TreeView передается объект ImageList. | |
|
| |
|
12 Кб. |
|
| Та если-бы я сам в этом что-то понимал.
Думал хоть Вы разберетесь.
Есть подозрение(=>), что свойство ImageList класса TreeView возвращает ссылку на класс Control,
а в вариантах 01 и 02 мы-же ему "подсовываем" не Class Control+Class ImageList, а голый Class ImageList.
То есть, класса Control нам свойство ImageList класса TreeView вернуть не может за неимением такового, потому и ругается. | |
|
| |
|