Использование дополнительных свойств объектов
Автор Артем Золотинин [Баймер]   
03.12.2010 г.

Публикуя данную статью преследую одну главную цель – раскрыть для Вас свою идею по организованному ведению собственных свойств объектов 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

 


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

  Коментарии (26)
 1 Написал(а) AlexSyr, в 03:48 04.12.2010
На мой взгляд - высказанная идея более чем спорная. 
Достоинства: --- 
Недостатки: 
1. Фактически запрещается работать с Tag\'ом, т.к. будет использоваться в других целях и вероятность ошибок использования этого свойства значительно возрастет. 
2. Пропадает возможность пользоваться IntelliSense, вследствии чего значительно возрастут ошибки одинакового начертания символов в разных раскладках клавиатуры (сc, оo, eе,Il1, ...). 
3. Код усложняется. Через полгода опять придется разбираться откуда же берутся параметры, правильно ли указаны разделители (попробуйте вместо пробела набрать комбинацию Alt+255 :) ), ... 
И масса чего еще, что как правило с избытком подкидывает практика. А ради чего???? 
Если уж прямо так хочется (а иногда и требуется) унифицировать код, то есть стандартные способы: паблик функция с передачей в нее необходимых параметров; или свой класс. Думаю, что если бы Вы стукнулись в форум с этой идеей, то Вам бы спецы еще много чего нибудь присоветовали.
 2 Написал(а) Баймер, в 17:16 04.12.2010
Спасибо за комментарий. 
 
Некоторые достоинства перечислены в статье. Может "---" как раз это и обозначало. 
По недостаткам: 
1. Не понял, почему запрещается с ним работать? Tag позволяет ввести огромное кол-во символов (не считал), полностью которые, предполагаю, мало кто использует. Отсюда вывод: то, для чего его использовали, продолжает действовать в качестве одного из параметров. 
2. Почитал немного по указанному термину. В коде, согласен, удобная вещь. НО на идею никак не влияет, т.к. это просто разные предметы разговора. 
3. Повторюсь - указана лишь идея. Для простых случаев можно обойтись разделителями, для сложных идею можно реализовать лучше (см . мысли по развитию п.1). Для свойства Tag можно выбрать "Масштаб", тогда все отображается крупно и наглядно.  
Можно написать функцию, при которой можно будет вводить в Tag параметры с именем, ну и читать по имени. Например для приведенного ПРОСТЕНЬКОГО примера: Source, txt1, Receiver, txt2. 
Где для tag не требуется вести доп. параметры, то используем как обычно, а где нужно, то для коммента можно в таком случае сделать параметр Comment и расположить его первым ;) 
4. На вопрос: "Ради чего", - каждый должен ответить сам. Кому-то это не нужно - я не против. Кому-то понадобится - только за.  
 
Постараюсь привести в ближайшее время несколько примеров (без реализации), в которых, на мой взгляд, решение будет полезно. 
 
Отстраненно: слышал, что хороший программист решит задачу, если это возможно, используя самые простые средства и как можно меньше обращаясь к написанию своего кода (что-то такое). Так вот, в данном случае к коду обращаться вообще не надо - поменял значение свойства и все, не открывая редактор кода ;)
 3 Написал(а) AlexSyr, в 23:50 04.12.2010
Прочерк в графе "Достоинства" означает, что таковых, на мой взгляд, не обнаружено. По крайней мере по отношению к перечисленным стандартным способам решения. 
К примеру. Какой выигрыш получается у Вас по отношению к стандартному вызову паблик процедуры с передачей в нее необходимых параметров? Да никакого. Т.е. вместо того, чтобы напрямую передать в процедуру необходимые параметры, зачем то используется свойство Tag. Лишний посредник. А какой при этом выигрыш? Может пропала процедура? Нет. Быстрее начало работать? Ясно, что нет. Уменьшилось количество ошибок? Опять же нет, т.к. их теперь можно совершать и в написании передаваемых параметров и в синтаксисе. Сами попробуйте (и проверьте на ком нибудь еще) - при выборе "Масштаб" даже при громадном шрифте сможете отличить два пробела от одного (а результат при этом будет ой какой разный). Может быть стало легче управлять (модифицировать) кодом? А с чего это? Ведь кроме процедуры, выполняющей основную функцию, нужно еще следить за корректным разбором строки по передаваемым в процедуру параметрам. 
Теперь по "Недостаткам": 
1. Сколько Tag позволяет ввести считать не надо - достаточно посмотреть в Help'е - 2048 символов. 
Почему запрещается? А потому, что если будет потребность это свойство использовать, то придется писать еще один разборщик строки по параметрам (нужно же как-то отделить мух от котлет), т.е. если нужно изменить что-то в одном разборщике, то не забыть изменить и в другом, или писать совместный, что является прямым отходом от универсальности. Т.е. вроде как используй это свойство (Де-юре), но лучше не надо (Де-факто)!!! 
2. Если идея приводит к необходимости отказа от удобного инструмента, позволяющего уменьшить количество ошибок, а вследствие этого ускорить выход конечного продукта, то это дискредитирует идею. 
3. Впрочем, думаю, что достаточно уже приведенных аргументов. 
Так в чем же заключается Ваша идея? Введя посредника в виде свойства Tag отказаться от программирования в VBA? Это к слову о "...не открывая редактор кода...". Улыбнуло!!! Так это больше похоже на параметрическую настройку уже готовой и отлаженной программы. А это уже другая идея.
 4 Написал(а) Баймер, в 01:22 05.12.2010
Причиной текущих разногласий являются как минимум 2 момента: 1) я смотрю разрабочиком, разработчиком выходящим за рамки устаканившихся принципов, а Ваш взгляд скорее кодера(программиста), корректно реализующего код. Отсюда недопонимание с Вашей стороны. 
>Какой выигрыш получается у Вас по отношению к стандартному вызову паблик процедуры с передачей в нее необходимых параметров? 
- А что Вы понимаете под параметрами? А какая проверка параметров в функции без обращения к редактору кода (например сразу указывать в строке обработчика события)? 
Попробуйте посмотреть на этот вопрос шире. Я ведь даже не отрицал паблик функции, более того она необходима. 
> при выборе "Масштаб" даже при громадном шрифте сможете отличить два пробела от одного 
-А кто говорит о пробеле? Можно сделать любой символ, более того, о чем указывал в комментне 2, можно сделать намного более интеллектуальное решение. 
>Почему запрещается? А потому, что если будет потребность это свойство использовать, то придется писать еще один разборщик строки по параметрам  
- С чего вдруг?  
Придется, видимо подробнее пояснить. 
Создается набор паблик фукнций, работающий с доп. свойствами (свойствами и(или) параметрами, если копать глубже). Остальные функции, обработчики и т.д., которые были, остаются. Вот только параметры они получают через эти паблик функции. Теперь не нужно открывать код и править там значение - все рядом, под рукой. Я не сомневаюсь, что натасканный человек не сможет сделать это очень быстро, но это не определяет скорость. 
Так почему теперь вдруг придется отказаться от tag? Куда он денется?  
>Если идея приводит к необходимости отказа от удобного инструмента, позволяющего уменьшить количество ошибок, а вследствие этого ускорить выход конечного продукта, то это дискредитирует идею.  
- А чем инструкмент удобнее? Тем что он привычен? Тут я не согласен. Я боюсь даже оценивать удобство, так как все зависит от ситуации. 
А где Вы предлагаете хранить свойства объектов, которых нет в системе? В функциях? Если мне нужно посмотреть, что лежит в коробке - я просто смотрю в нее, а не расспрашиваю других. Если мне нужно поменять содержимое коробки - я меняю, а не ищу того, кто это сделает. 
Некоторые свойства принадлежат сугубо объекту и удобно хранить их непосредсвенно в нем. Вы же не храните ширину поля, цвет шрифта в функции, затем применяя при загрузке - это неудобно. 
В общем, нужно таки привести пару примеров. Не смотря на то, что конкретика портит философию, иногда к ней приходится обращаться. Но это позже. 
>Это к слову о "...не открывая редактор кода...". Улыбнуло!!! 
Много желающих забивать машинный код? А использовать ассемблер? Думаю сказать "нет навсегда" макросам тоже будет глупо. 
 
AlexSyr, попробуйте все-таки выйти за рамки, из которых Вы пуляете критикой из одних недостатков. В статье раскрыта идея, но не ее полная реализация. Пример сугубо показательный, и я изначально признавал его примитивность. Реализаций может быть много.
 5 Написал(а) Баймер, в 01:29 05.12.2010
ПС 
а) Не указал 2 момент в первом обзаце. Так вот, я не программист. Отсюда свежий взгляд. 
б) Чтоб опять не возникла путаница. Говоря в одном из абзацев о паблик функциях, работающих с доп свойствами, я говорю о реализации функции НЕ работающих с доп. свойствами, а управляющих ими. Т.е. чтение свойства, изменение свойства и пр. 
 
Не хватает еще нескольких аппонентов... В разносторонней беседе идея раскроется быстрее.
 6 Написал(а) Дглфы, в 07:46 05.12.2010
Почитал, посмотрел. 
Ужас. 
Вместо абсолютно понятной единственной строчки в обработчике события кнопки веер из макроса и внешних функций весьма сомнительного содержания. 
Не дай боже кому достанется такое \"творчество\" в сопровождение. 
 
Баймер, вам бы Гетца почитать, для начала, (у него есть знатный класс для работы с тегом),  
затем что-нибудь про инкапсуляцию и ООП. 
Па доброму.
 7 Написал(а) AlexSyr, в 14:30 05.12.2010
Баймер! 
> взгляд скорее кодера (программиста) 
Для справки. Кодер (кодировщик) - сотрудник, пишущий исключительно код программы на основе предоставленного ТЗ. Его задачей является исключительно качественно/оптимизированно/... написанный код. Это своеобразная каста узкоспециализированных профессионалов. 
Технолог - сотрудник, занимающимся вопросами адаптации программ к нуждам пользователей (интерфейса; удобства и качества ввода данных; ...), определяющим необходимость/целесообразность/дальнейшее развитие/... того или иного решения. Его задачей является исключительно грамотно/всееобъемлюще/... составленное ТЗ. К данной категории причисляют себя все кому не лень - ведь управлять государством может даже кухарка. Хотя по сути это должны быть высокообразованные люди, свободно разбирающиеся в направлениях развития процессов автоматизации, маркетинга, психологии (да-да) и многом чего еще. 
Программист - сотрудник, выполняющий функции не только кодировщика, но и технолога, пусть немного и менее эффективно, чем делал бы отдельный узконаправленный специалист, но именно это и позволяет получать готовый продукт в разы быстрее и качественнее. 
Программист с БОЛЬШОЙ буквы - человек (может и не быть сотрудником :)), выполняющий функции не только кодировщика, но и технолога, в идеальном понимании этих двух функций. 
Пользователь (ламер/чайник/манагер :)/...) - сотрудник, который должен бы учиться пользоваться предоставленным ему инструментом (программой), а вместо этого любит все охаивать на предмет непрофессионализма, давать глупые советы как надо а как не надо, ..., при этом, зачастую плохо владеющий элементарной арифметикой (проверено на практике). 
Так вот. Если бы я посмотрел на Вашу публикацию взглядом \"кодера\", то я бы и не стал даже ввязываться в полемику (надеюсь понятно почему :)). Я же пытался Вам привести аргументы и со стороны кодировщика и со стороны технолога и даже со стороны пользователя (каковыми все и являемся по отношению к Access). 
Моей целью не стоит переубедить именно Вас (порой трудно отказываться от вредных привычек и стереотипов), а донести до тех, кто в дальнейшем может наткнуться на данную публикацию - не стоит, ради непонятно чего, так усложнять задачу. Люди!!! Задумайтесь над тем, что написал Дглфы(Lukas) по поводу \"сопровождения\". :)
P.S. Личный совет. Для сравнения со своими идеями выбирайте достойные альтернативы (хотя бы стандартные).
 8 Написал(а) Баймер, в 15:58 05.12.2010
Комментарий Дглфы пропускаю, так как он не имеет отношения к данной теме. Вы не читали, а смотрели. 
 
AlexSyr дает наиболее аргументированные ответы. Одно НО - Вы таки не понимаете где и как можно применить идею, неверно понимаете ее цель.  
Я, не являясь спецом в области программирования,но могу и соглашаюсь с Вашими опытными высказываниями. Я не соглашаюсь с Вашей попыткой свои высказывания противопоставлять предложенной идее, т.к. пока нечего было сравнивать и получать противопоставления. 
 
Пока я не привел примеры, видимо Ваше направление в этом вопросе будет непоколебимо.  
 
Все, что пока могу предложить, так это обратить к Вам вопрос. А для чего Вы используете св-во Tag? Ответ "просто для поменток типа комментов" прошу опустить.
 9 Написал(а) Баймер, в 22:44 05.12.2010
Пример 1. 
 
http://am.rusimport.ru/MsAccess/f2.aspx?id=5435 
 
Некий Андрей столкнулся с ситуацией, которую с легкостью можно разрешить путем использования описанной идеи. В то время, как АлексейЕ предлагает создать строку прямо в коде обработчика события, я предлагаю использовать для этого свойство Tag.
 10 Написал(а) Баймер, в 22:48 05.12.2010
http://am.rusimport.ru/MSAccess/topic.aspx?ID=94 
 
IgorM описал возможный вариант ведения в строке именованвых свойств(параметров) и чтения их. Можно, конечно еще доработать, а так же добавить функцию изменения свойства(парамтера) - необходимо, когда свойство меняется кодом, что может потребоваться.

Публикуя данную статью преследую одну главную цель – раскрыть для Вас свою идею по организованному ведению собственных свойств объектов 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

 


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

  Коментарии (26)
 11 Написал(а) Баймер, в 23:00 05.12.2010
Пример 2. 
 
Один из Вариантов реализации мультиязыкового интерфейса.  
Согласно описанной идеи в свойствеTag храняться Подписи (подписи к полям, подписи форм и т.д.) на разных языках. Легко получить значение, легко изменить или добавить. 
 
В случае реализации именованных параметров нам даже не требуется соблюдать порядок и правила разделения параметров в Tag. Например строка такая (* - любые символы, &/# - любой специфичный символ, принятый для начала/окончания значения свойства(начала свойства)): "*******&Lrus:Фирма#******&Leng:Firm#****". 
 
Надеюсь не найдется желающего критиковать метод реализации мультиязыкового интерфейса, т.к. я встречался с описанием самых разнообразных способов, и не думаю, что стоит пытаться указать из них лучший ;)
 12 Написал(а) AlexSyr, в 23:34 05.12.2010
:grin :grin :grin  
Теперь я немного начал понимать. 
Вот что я Вам скажу. Это все от незнания основ ООП и нежелания изучать эти самые основы. Один раз получилось ну и давай всем советовать. Знаю - сам таким был. И именно на этом сайте (за что его и уважаю) и именно Дглфы(Lukas), комментарии которого Вы "...пропустили...", меня просветили (за что им всем респект и уважуха) - научили не чесать левое ухо правой ногой. :grin  
Если Вы захотите немного просветиться, а не ссылаться на БРЕД прочтите хотя бы вот эту ветку: http://www.sql.ru/forum/actualthread.aspx?bid=4&tid=768364&hl=. 
 
P.S. Да, и почитайте почту - отправил набросок кода в качестве ответа на все Ваши предыдущие посты.
 13 Написал(а) AlexSyr, в 23:43 05.12.2010
Кстати посмотрите на даты указанных Вами ссылок. 
Там от души радуются что появилась функция Split :grin :grin :grin  
Может быть от этого все недопонимание - что было хорошо 7 лет назад сейчас уже ... ;)
 14 Написал(а) AlexSyr, в 00:11 06.12.2010
По поводу "...мультиязыкового интерфейса..." попробуйте написать Вашим способам (или просто на кнопке написать) что нибудь по китайски или даже просто не установленным в системе шрифтом. И скрин в студию. :?  
И способы уже давно придуманы: у того же MS есть Dynamics AX, так там можно писать, насколько я помню, не буковки, а ссылки на надпись, а уже в ссылочном файле к ссылке привязывать написание для различных языков. Применительно к MSA - это ссылочная таблица. Это же гораздо удобнее, чем лазить по всем формам и корректировать Tag'и.
 15 Написал(а) Баймер, в 00:52 06.12.2010
Ага, все-равно началось обсуждение примера с языком)  
Нас не интересует ничего кроме аксес в данном случае. 
На счет ссылочной таблицы - так можно сделать таблицу в проге, таблицу на сервере ( или удаленном файле аксеса, принятого за БД), в отдельном файле и т.д. Ни кто не говорит, что это плохие решения. 
Удобнее? Сомневаюсь, что всегда. А тут ты видишь, что переводишь. 
 
Придумается может более приминительный пример)
 16 Написал(а) Баймер, в 01:54 06.12.2010
Пока загорелся, напишу еще примерчик, пришедший в голову (вернее пачка примерчиков) 
 
Пример 3. 
 
Скажем у нас есть в программе на множестве разлиных форм поля (кнопки и т.д.), которые можно условно объединить в различные группы. И бывают такие ситуации, когда сразу для всех полей одной группы нужно изменить какие-то параметры (цвет шрифта и т.д.). Мы можем с легкостью произвести разделение по группам путем указания некоторой идентификатора группы в поле Tag (число, фраза и т.д.). Тогда при необходимости поменять для всех свойство достаточно прогнать функцию изменения параметра для всех полей, у которых идентификатор такой-то. Удобно? Думаю да. Свойство Tag используется один раз. 
 
Далее. Мы реализуем в проекте ведение аудита текстовых полей. Т.е. если пользователь изменил какое-то значение на форме (дату счета, название клиента и т.д.), то в таблицу аудита записывается (самый примитив) имя пользователя, наименование поля, предыдущее значение, новое значнение. Мы можем использовать свойство Tag (немного похожий, а может и такой же - не припомню, пример описан в книге Гроха). Когда пользователь изменяет первоначальное при открытии формы значение поля, то первоначальное значение записывается в Tag. Затем пользователь может несколько раз менять менять значение (в т.ч. и вернуть к обратному). При закрытии формы производится анализ значения нового значения поля и значения в Tag: если значения не совпадают, то производится запись в таблицу аудита и запись сохраняется, а если совпадают, то ни первое, ни второе не требуется. Все мы понимаем необходимость такой проверки? Ведь если мы будем производить сохранение записи при каждом закрытии формы, или при наличии просто факта изменения поля, то при работе по сети такой подход может стать для нас боком ;)
Tag используется второй раз. 
 
Далее. Думаю интересный вариант реализации мультиязыка. В поле Tag храниться 2 параметра: а) Значение подписи на русском языке (пусть изначально программа русская), б) уникальный для всей программы идентификатор поля. 
Подпись у поля изначально русская и совпадает с значением в Tag. 
Есть таблица со значениями на разных языках (xml, таблица в этой базе или другой и т.д.). В этой таблице есть колонка с идентификатором (см. идентификатор Tag) и колонками для значений на разных языках (пусть такой примитивный пример). Кода пользователь меняет желаемый язык, запускается процедура, которая сопоставляет идентификаторы и производит соответсвующие замены подписи полей (объетов), т.е. перевод программы. Ву а ля, программа переведена). 
Вдруг файл с языками поврежден (отсутсвует, удален и т.д.). В таком случае выполняется процедура, которая восстанавливает русское значение из Tag. 
А представьте как можно перевести программу: ходишь по формам и изменяешь значение подписи как считаешь нужным. Затем запускаешь процедуру, которая анализирует значение идентификатора в Tag и новое значение подписи и на основании этих данных создает таблицу (добавляет в существующую) с разными языками. ВОТ ТАК ДА: новичок придумал вариант перевода программы на другой язык ;). А все благодаря обсуждению. 
Tag используется третий и четвертый раз. 
(Примечание: можете сколько угодно утверждать, что намного легче открыть таблицу с языками и изменить\добавить в ней значение, но я с этим в большинстве случаев не соглашусь. 
В переводе 2 участника - разработчик, лучше всего знающий работу продукта, и переводчик, т.к. не все разработчики полиглоты. В вот они сидят, смотрят на форму, разработчик поясняет для чего нужно то или иное поле, а переводчик, понимая истинное значение поля, предлагает перевод. Наверное это идеальная для перевода схема. 
А вот словарный перевод в таблице оставьте для непрофессиональных решений.) 
 
Далее можно не продолжать, так как каждый может для Tag придумать свои доп. свойства объектов. Сам факт, что можно найти множество применений этому замечательному свойству Tag. 
Не уж-то кто-то хочет резко высказаться вообще об использовании Tag???? :?  
 
Вывод: в свойстве Tag может вестись множество свойств(параметров), которые просто необходимо организовать. Вот это и раскрывается в идее - реализовать схему качественного ведения доп. свойств объектов. Т.е функции(процедуры, классы и т.д.), возволяющие обращаться к доп. свойствам, изменять их, добавлять и т.д. 
Хотите вести все свойства в классах, таблицах и т.д. - ведите, я не против. Но найдутся люди, которые будут использовать поле Tag (именно поэтому, AlexSyr, я задал Вам вопрос об использовании свойства Tag ;) 
 
Надеюсь все помнят, что свойство Tag находится в самом эксес 2007\2010 на правой панельке "Окно свойств" (вызвается как свойства объекта), вкладка "Другие" и называется на русском "Дополнительные сведения"? Это к тому, на сколько легко к нему обратиться.
 17 Написал(а) Дглфы, в 11:52 06.12.2010
Вы пытаетесь представить использование тега как совершенное вами "открытие". 
Не смешите людей.  
Они его (тег) пользуют давно, причем значительно эффективнее, чем все ваши примеры. 
Все-таки в перерыве между "открытиями" полистайте Гетца и его классы сборки/парсинга строки атрибут-значение и ресайзинга форм. 
Единственное новшество от вас (описанное в первом примере) - использовать тег+макрос+функции для копирования значения одного поля формы в другое, есть УГ. 
 
Кстати, по 3 вашему примеру и аудиту полей: 
1. Откройте для себя префиксы и коллекции. 
2. Откройте для себя свойство OldValue. Абсолютно бессмысленно использовать тег для записи старого значения.
 18 Написал(а) Баймер, в 13:22 06.12.2010
Дглфы, второй раз Вы высказываетесь совершенно не в тему. Это уже начинает выглядеть странным. Постарайтесь оставить в теньке свое высокое Я и почитать статью, перед тем как писать свои комментарии. Думаю излишне перегружать тему подобного рода сообщениями. 
 
По поводу Гетца. На сколько я понял Вы бывалый пользователь ресурса, потому вполне знаете, где можно рекомендовать какую-либо литературу по тематике. Многократные же попытки ссылаться на один и тот же источник здесь выглядят не более чем спамом или флудом.
 19 Написал(а) Дглфы, в 14:03 06.12.2010
Цитаты:  
"...раскрыть для Вас свою идею..." 
"...Идею я придумал сам. Если кто-то уже подобное придумывал..." 
"...конечно, с указанием автора самой идеи..." 
 
И вы упрекаете меня в высокомерии? :grin  
 
Мои высказывания "...совершенно не в тему..." кажутся только вам. 
А что вы ожидали? - "О *ля!!. Мы тут 10 лет базенки клепаем и не знали что есть такой тег и что его можно использовать оказывается!! Вот спасибо, друг, открыл глаза!"? :grin  
 
А ссылки на Гетца будут и впредь, потому как эти издания есть классика жанра, наиболее авторитетная, уважаемая и доступная (имеется в виду физическое наличие книг или электронных копий). 
Если вы считаете отсылки к классике (причем по конкретной обсуждаемой тематике) спамом ли флудом - это ваши проблемы. 
 
Все ваши потуги с примерами пользования вашего "открытия" имеют куда более грамотные варианты реализаций, включая тот-же многоязычный интерфейс. 
 
Вы изобрели велосипед, причем на квадратных колесах. 
Если вам удобно на нем ездить, без проблем, катайтесь.
 20 Написал(а) Баймер, в 14:39 06.12.2010
Серьезно, доходит до смешного. 
 
Дглфы, ГДЕ вы в статье или переписке видели, что мною было присвоено открытие свойства Tag? Не уж то вы так слепо составили обо мне картину, что уже и не хочется открывать глаза??? 
 
К сожалению, случайно стер сочинение, которое адресовалось Вам... Хотя оно и к лучшему - зачем Вам пояснять почему Tag в приведенном примере лушче чем OldValue :? 
 
В качестве исключения все-таки чуток прокомментирую это Ваше резкое высказываений по поводу OldValue. Утверждаю, что в приведенном мною примере использование свойства Tag является более качественным решением поставленной задачи. 
Почему? А вот теперь Вы почитайте литературу (а после Вашего коммента мне это и пришлось сделать) и попробуйте сами себе ответить на этот вопрос. 
 
>Вы изобрели велосипед, причем на квадратных колесах.  
>Если вам удобно на нем ездить, без проблем, катайтесь. 
Как же Вы можете быть так слепы, что позволяете себе такие Высказывания! В тексте нет ни одной записи указывающей на мое слепое изобретение велосипеда. Единственное что я пометил, что возможно мою едею кто-то уже некогда придумал, причем я буду рад за предоставление источника. НО Вы до сих пор так и не поняли этой идеи. 
 
Касательно введения мультиязыкового интерфейса. На текущем ресурсе есть примеры?(есть один, но менее качетсвенный. Возмножно из-за давности. Как ни как 2002 год!) 
У Вас есть пример свой? А чегож не оформили для нас - простых людей? 
 
По поводу флуда - ну научитесь читать комменты оппонента! В сравнение со спамом/флудом приводится Ваше много кратное приведение источника в тексте, направленное одному лицу.  
 
Дглфы, если Вы являетесь Lukas'ом, то не портите впечатление о себе.

Публикуя данную статью преследую одну главную цель – раскрыть для Вас свою идею по организованному ведению собственных свойств объектов 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

 


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

  Коментарии (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