Rambler's Top100
Российский фонд помощи
Навигация
Главная
MS ACCESS
VB
ASP
PHP
Наши друзья
Поиск
Форум
Лента новостей
Новый сайт

Online
Сейчас на сайте находятся:
1 гость
Рассылки Subscribe.Ru
Работа с MS Access
Подписаться письмом
Реклама на сайте
 
Главная arrow MS ACCESS arrow Использование дополнительных свойств объектов
Использование дополнительных свойств объектов Печать E-mail
Автор Артем Золотинин [Баймер]   
03.12.2010 г.
Оглавление
Использование дополнительных свойств объектов
Страница 2
Страница 3

Публикуя данную статью преследую одну главную цель – раскрыть для Вас свою идею по организованному ведению собственных свойств объектов Access (контролов, форм и т.д.).

Задачи, решаемые при реализации идеи:

  1. Расширение свойств объекта с быстрым к ним обращением.
    Медленная альтернатива – создание таблицы [Тип объекта][Расположение объекта][Наименование объекта][Наименование свойства][Значение свойства].

  2. Быстрое и удобное изменение переменных, используемых при отрабатывании событий объекта. Обращение производиться через панель «Окно свойств».
    Обычно приходится открывать код vba и изменять данные. Мы можем использовать альтернативу из п.1 или создавать спец поля на форме, но это часто неудобно.

  3. Другие.


Область применения:

  1. Универсализация часто используемых объектов (групп объектов).
    Пример1 Вы сделали кнопку [=] (см. Пользовательские свойства.accde), которая приравнивает значение одного поля к другому. Теперь не надо создавать ее повторно на другой форме, копировать код обработчика vba (при копировании vba обработчик не наследуется), не надо подстраивать код обработчика в редакторе vba. Достаточно изменить собственное поле панели «Окно свойств».
    Пример2 Совершенствование функций ведения справочников http://hiprog.com/index.php?option=com_content&task=view&id=251661641&Itemid=35

  2. Обработка особых сиуаций
    Пример2 в бухгалтерской очетности в столбце с балансом нужно выделять отрицательные значения цветом шрифта или фона, например. Тогда RGB код цвета для обычно и такой ситуации можно хранить с своем поле, а при вычислении значения поля (обработчик события) копировать в свойство цвета текста или фона значение своего поля.

  3. Другие.


Как реализуется:

У всех объектов access есть свойство Tag (Дополнительные сведения). Свойство создано для ведения комментариев, но некоторые его используют в других целях, как и я.

Предлагаю разбить логически (через разделитель) свойство tag на массив элементов, которые будут выступать значениями собственных свойств, например через пробелы, запятые, фразы типа «Свойство1:»

Примечание: последнее решение более наглядно, но потребует доработки кода функции. Т.е. строка Tag= «Свойство1: , 123 , Свойство: , Текст» будет читаться функцией как 4 значения 4 свойств, но программно мы выкидываем нечетные, т.е. названия свойств. Соответсвенно функция чтения свойства GetParametr(2) должна обратиться к 4-му элемент Tag.

Таким образом пример 1 области применения реализуется путем указания через разделитель (в моем accde это пробел) в свойстве объекта Tag названия полей «txt1 txt2». При нажатии на кнопку значение txt2 копируется полю txt1.
Примечание: пример ценности такого примера – копирование значения Поставщика счета Получателю средств по платежу на обстрактной финансовой форме исходящего счета.

А для того, чтобы копировать кнопку на другие формы достаточно реализовать обработчик в виде макроса, выполняющего функцию. Функция – фактический обработчик на vba с применением своих свойств в виде функцию. Теперь кнопка легко копируется с формы «Мои контролы для форм» на другие формы.


Комментарии автора:

Делюсь своей идеей и надеюсь, что она найдет отзыв читателей. Идею я придумал сам. Если кто-то уже подобное придумывал или встречал, то это не более чем совпадение, причем, буду рад на ссылку – приятно найти единомышленника. В таких случаях изобретения исторически обычно получают двойное имя ;)
Я являюсь любителем в программировании, это не моя область, и развиваться в ней я не планирую. Буду рад, если читатель возьмется ее развить и опубликовать свою реализацию, конечно, с указанием автора самой идеи желательно ;).


Спасибо.

© Артем Золотинин [Баймер]

Приложение. Мысли по развитию:

  1. Реализовать ведение «Tag= «Свойство1: , 123 , Свойство: , Текст» (см. статью)

  2. Реализовать возможность задания используемого разделителя на спец форме для параметров функции.

  3. Реализовать код функции, изменяющей заданное свойство.

  4. Реализовать таки использование идеи в авторской реализации функции ведения справочников http://hiprog.com/index.php?option=com_content&task=view&id=251661641&Itemid=35.
    с чем я уже успел обратиться к ее автору в комментарии в лице «Baimera ;)


Пример реализации. Download now

 


Просмотров: 11441

  Коментарии (26)
 21 Написал(а) Дглфы, в 15:18 06.12.2010
Вы либо: 
1. так и не ознакомились с теми материалами, что я рекомендовал 
2. не поняли их. 
В любом случае дальше продолжать разговор бессмысленно. 
 
Скажу лишь кратко: 
Идея хранения значений в теге реализована в тех материалах, что я рекомендовал, датированных 2001 годом, если не ошибаюсь. 
Там-же приведена грамотная реализация сборки/парсинга строки в пары атрибут-значение и наоборот. 
Там-же приведен пример использования этого механизма при ресайзинге форм. 
 
Ваши претензии на "авторство идеи" выглядят жалкими. 
 
Вы просили ссылку на материалы единомышленников, я вам дважды ее дал, за что был обвинен в спамерстве. :grin  
Потому я и говорю, что вы изобрели велосипед. 
А по причине худшей реализации, он еще и на квадратных колесах. 
За сим откланиваюсь с пожеланием творческих успехов.
 22 Написал(а) Баймер, в 15:35 06.12.2010
Абсолютно с Вами согласен - разговор между нами далее бессмыленен. Вы просто не готовы к каким либо обсуждениям. 
Почему: 
1. Вы не читаете комменты аппонента, а пробегаете их, не вникая в суть. 
2. Вы неверно поняли идею и пытаетесь спорить. Но мы говорим о разных вещах. 
3. Вам прямо указали на Ваши промахи в утверждениях. Вы это проигнорировали и не раз. 
 
Думаю достаточно. 
 
Успехов и Вам в ваших наичинаниях и продолжениях.
 23 Написал(а) Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script , в 09:52 08.12.2010
прочитал и вспомнил что что-то такое когда-то делал, покопался в своем "мусорнике"и нашел такие кусочки. Изредка пользовался подобным приемом для передачи наборов пользовательских свойств между формами. реализация выглядит примерно так: 
 
класс для работы со строкой почерпнут из Source+ 

'*********************************************************** ****************************** 
 
Option Explicit 
' Error handling definitions 
Private Const E_ERR_BASE = 18200 + vbObjectError 
Public Enum EErrStringBag 
eErrStringBag_ComponentFailure = E_ERR_BASE + 1 
End Enum 
Private Const S_ERR_ComponentFailure = "clsStringBag component failure" 
 
Private Const cnstValueDelim As String = "=" 
Private Const cnstItemsDelim As String = vbTab 
' Private variables to hold property values 
Private m_sContents As String 
 
 
'*********************************************************** ****************************** 
'* Property : Contents 
'* Notes : Returns or sets a string value containing the entire contents of the 
'* string bag. 
'*********************************************************** ****************************** 
Public Property Let Contents(ByVal Value As String) 
On Error GoTo hComponentFailure 
 
m_sContents = Value 
 
Exit Property 
 
hComponentFailure: 
Err.Raise eErrStringBag_ComponentFailure, S_ERR_ComponentFailure 
End Property 
 
Public Property Get Contents() As String 
On Error GoTo hComponentFailure 
 
Contents = m_sContents 
 
Exit Property 
 
hComponentFailure: 
Err.Raise eErrStringBag_ComponentFailure, S_ERR_ComponentFailure 
End Property 
 
 
'*********************************************************** ****************************** 
'* Sub : Clear 
'* Notes : Clears the contents of the string bag. 
'*********************************************************** ****************************** 
Public Sub Clear() 
On Error GoTo hComponentFailure 
 
m_sContents = "" 
 
Exit Sub 
 
hComponentFailure: 
Err.Raise eErrStringBag_ComponentFailure, S_ERR_ComponentFailure 
End Sub 
 
 
'*********************************************************** ****************************** 
'* Function : ReadItem 
'* Notes : Returns a string value filled with the contents of the specified item 
'* stored in the string bag. 
'*********************************************************** ****************************** 
Public Function ReadItem(ByVal NAME As String) As String 
On Error GoTo hComponentFailure 
 
Dim Where As Long 
 
Where = InStr(1, m_sContents, UCase$(NAME) & cnstValueDelim) 
 
If Where = 0 Then 
ReadItem = "" 
Else 
ReadItem = Mid$(m_sContents, Where + Len(NAME) + 1, InStr(Where, m_sContents, cnstItemsDelim) - Where - Len(NAME) - 1) 
End If 
 
Exit Function 
 
hComponentFailure: 
Err.Raise eErrStringBag_ComponentFailure, S_ERR_ComponentFailure 
End Function 
 
 
'*********************************************************** ****************************** 
'* Sub : RemoveItem 
'* Notes : Removes the specified item from the string bag. 
'*********************************************************** ****************************** 
Public Sub RemoveItem(ByVal NAME As String) 
On Error GoTo hComponentFailure 
 
Dim Where As Long 
 
Where = InStr(1, m_sContents, UCase$(NAME) & cnstValueDelim) 
 
If Where 0 Then 
m_sContents = Replace(m_sContents, Mid$(m_sContents, Where, InStr(Where, m_sContents, cnstItemsDelim) - Where + 1), "") 
End If 
 
Exit Sub 
 
hComponentFailure: 
Err.Raise eErrStringBag_ComponentFailure, S_ERR_ComponentFailure 
End Sub 
 
 
'*********************************************************** ****************************** 
'* Sub : WriteItem 
'* Notes : Writes the data for the specified item in the string bag. 
'*********************************************************** ****************************** 
Public Sub WriteItem(ByVal NAME As String, ByVal Value As String) 
On Error GoTo hComponentFailure 
 
Dim Where As Long 
 
Where = InStr(1, m_sContents, UCase$(NAME) & cnstValueDelim) 
 
If Where = 0 Then 
m_sContents = m_sContents & UCase$(NAME) & cnstValueDelim & Value & cnstItemsDelim 
Else 
RemoveItem NAME 
WriteItem NAME, Value 
End If 
 
Exit Sub 
 
hComponentFailure: 
Err.Raise eErrStringBag_ComponentFailure, S_ERR_ComponentFailure 
End Sub 
 
**************************************** 
 
запись свойств производится чем-то вроде 
With bagStrData 
Call .WriteItem("Свойство1", Значение1) 
Call .WriteItem("Свойство2", Значение2) 
Call .WriteItem("Свойство3", Значение3) 
End With 
 
где bagStrData - экземпляр указанного класса  
чтение соответственно по .ReadItem("СвойствоN") 
 
в общем полезный класс для передачи группы параметров не только через .Tag, но и например OpenArgs формы. 
 
думаю пригодится для доводки Вашей идеи ) 
с уважением, Руслан
 24 Написал(а) Алекс, в 21:38 27.12.2010
По моему руководствоваться принципом "Зачем просто, когда можно сложно" не самое верное решение. А слово оппонент пишется через "О" - это я так к слову.
 25 Написал(а) Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script , в 07:16 28.12.2010
Позволю себе не согласиться на счет "сложности" предложенного уважаемым Бамером решения. Сложность не только объективный параметр описывающий степень разнообразия внутренней структуры объекта, но и сугубо субъективная характеристика простоты его понимания. Решение любой задачи это постепенное ее структурирование т.е описание через взаимосвязь уже изученных и легко понимаемых элементарных объектов с последующей оптимизацией построенной модели. В данной ситуации уважаемый Бамер действует абсолютно правильно. Как только задача будет четко сформулирована и создана рабочая модель настанет время ее оптимизации, а пока все варианты имеют право на существование. На данном этапе конструктивным подходом было бы не критиковать, а предлагать варианты решения (не беспокойтесь - придет время и критики). И смею заметить в Васике пакетная передача параметров не самый неудобный способ обмена информацией между объектами. Поэтому я и предложил в том числе и Вашему вниманию этот класс заимствованный мной из известного сборника готовых алгоритмов - он обладает четкой легко понимаемой структурой (особенно если его обработчиков ошибок) и предлагает достаточный набор методов для решения части из поставленных задач. Если автору он покажется удобным в достаточной мере он сможет им воспользоваться в качестве одного из "кирпичиков" в своей модели. Знаете, так не удобно каждый раз писать с нуля. Думаю у каждого, в том числе и у Вас, есть свой набор готовых проверенных решений для типовых задач из которых и лепится готовая реализация)))  
Ну а на счет "аппонента" право это недостойно Вас. В интернете пишут столько и так мало следят за тем как, что уверен и Вы и, без сомнений - я, в отношении ашипок не безупречны) Хотите уколоть - делайте это изящно. В качестве образца для подражания в этом отношении могу порекомендовать д-ра Хауса)).
 26 Написал(а) Алекс, в 07:20 29.12.2010
2 iKaRus, 
согласен с Вашим мнением. Вы правы. Оставляя в стороне, техническую сторону вопроса, хочу принести Баймеру свои искренние извинения за недопустимую резкость в оценке его работы. 
 
С уважением,

Добавить коментарий
Имя:
E-mail
Коментарий:



Код:* Code



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