Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Глобальный ImageList.
 
 автор: AlexSyr   (24.06.2010 в 00:38)   личное сообщение
 
 

Глобальный 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

  Ответить  
 
 автор: Lukas   (24.06.2010 в 02:33)   личное сообщение
31 Кб.
 
 

Вопрос 1:
Кто надоумил Вас пихать в ImageList картинки под мегабайт?
Пристрелите его немедленно!
Ремарки:
К варианту 01: Нет надобности все время открывать невидимую форму с ImageList.
Альтернатива в прицепе.
К варианту 02:
...Заполнять его в момент использования...
Заполнять надо один раз, при первом обращении.
См. прицеп.
К варианту 03:
"Вложения" в А2007 вроде как хранятся не в таблицах.

  Ответить  
 
 автор: snipe   (24.06.2010 в 05:32)   личное сообщение
 
 

хранить в ImageList картинки большого размера и тем более в bmp считаю расточительством
(если нужно разместить какие-то большие фото, дабы не увеличивать объем базы, предпочитаю держать рядом с базой и подгружать по мере необходимости но не через ImageList )
опять же если появится необходимость переместить базу - то важно не забыть про рисунки
а маленькие рисунки (пиктограмки) - их все равно не так много используется - по-этому возможно хранить и на невидимой форме
а можно хранить там же и два(три, четыре) ImageList и при необходимости обращаться к нужному комплекту рисунков
вот только еще одна загвоздка при загрузке формы и соответственно контрола(-лов) ImaseList все рисунки находящиеся в контейнере(-рах) грузятся в память компа

  Ответить  
 
 автор: AlexSyr   (24.06.2010 в 08:44)   личное сообщение
 
 

1. Честно говоря даже и не заметил , что под мег. Каюсь . попутал.
Rem01: Полезное дополнение, но не принципиальное.
Rem02: Аналогично Rem01. "...Заполнять его при первом обращении для каждого отличающегося набора картинок..."
Rem03: Нигде не встречал инф. о том, где хранятся "Вложения" (или может просто не обращал внимание ), но то, что управление на уровне файлов не требуется - это точно.

  Ответить  
 
 автор: Explorer   (24.06.2010 в 10:02)   личное сообщение
 
 

ИМХО проблема надуманная и на практике разрешается копированием одного объекта в разные формы - это проще.

1 редактирование содержимого ImageList скорее исключение чем правило весь набор всех изображений должен содержаться в имадж-листе заранее (бывают экзотические случаи, когда приходится передергивать картинки - не связанные с отображением картинок имадж-листа в объектах эктивекс)

2 если следовать такой логике, то и все оставльные объекты и контролы эктивекс используемые на форме нужно аналоичным образом вставлять "на лету" вытаскивая из одного источника, что в общем-то концептуально верно, но практически слишком хлопотно... глобальный тривью глобальный листвью

ну и конечно нужно стремиться к оптимизации интерфейса и сокращать количество форм и объектов форм - это общий глобальный принцип относящийся не только к ImageList

  Ответить  
 
 автор: Lukas   (24.06.2010 в 11:11)   личное сообщение
 
 

Ну, если Вы не видите принципиальной разницы, я Вам ее покажу.
Тестовая функция:

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 

Надеюсь теперь принципиальная разница заметней?
И это я только спросил, сколько в коллекции рисунков.

  Ответить  
 
 автор: AlexSyr   (24.06.2010 в 14:07)   личное сообщение
 
 

УБЕДИТЕЛЬНЫЙ РЕЗУЛЬТАТ!!!

  Ответить  
 
 автор: AlexSyr   (24.06.2010 в 19:00)   личное сообщение
 
 

А вот еще бяка. Хочу узнать привязан ли ImageList к TreeView. Делаю это до и после привязки.
If Me.ctlTreeView.ImageList Is Nothing Then
...
End If

Так вот в Варианте 01 при открытии скрытой формы - все отрабатывается, а вот при вызове
Me.ctlTreeView.ImageList = GetImageList()
ДО - отрабатывается, ну это понятно, а вот ПОСЛЕ дает ошибку "430"
Тот же эффект и при Варианте 02.
Это я не правильно пытаюсь определить наличие привязки ImageList к TreeView?

  Ответить  
 
 автор: Lukas   (25.06.2010 в 01:54)   личное сообщение
 
 

Здесь, наверное, стоит почитать:
http://forum.sql.ru/forum/actualthread.aspx?tid=480890&pg=1&hl=imagelist&#4758009

  Ответить  
 
 автор: AlexSyr   (25.06.2010 в 13:25)   личное сообщение
 
 

Ссылку посмотрел, почитал (чуть ли не облизал ), НО, извините меня придурка, все равно ничего не понял.
Почему в случае "Me.ctlTreeView.ImageList = GetImageList()" этот самый Me.ctlTreeView.ImageList перестает быть объектом или перестает "показывать возможность программирования интерфейса" (как написано в справке по ошибке 430)?
Ведь и в случае ссылки на элемент скрытой формы и GetImageList в TreeView передается объект ImageList.

  Ответить  
 
 автор: Lukas   (25.06.2010 в 13:41)   личное сообщение
12 Кб.
 
 

Та если-бы я сам в этом что-то понимал.
Думал хоть Вы разберетесь.
Есть подозрение(=>), что свойство ImageList класса TreeView возвращает ссылку на класс Control,
а в вариантах 01 и 02 мы-же ему "подсовываем" не Class Control+Class ImageList, а голый Class ImageList.
То есть, класса Control нам свойство ImageList класса TreeView вернуть не может за неимением такового, потому и ругается.

  Ответить  
 
 автор: AlexSyr   (25.06.2010 в 16:01)   личное сообщение
 
 

А я тут доигрался - вылетает из MSA при попытке обратиться к строковой переменной.
Пора перерывчик сделать

  Ответить  
HiProg.com - Технологии программирования
Rambler's Top100 TopList