![]() |
|
Модераторы: Akina |
![]()
|
|
| АлексейМ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 29.8.2005 Репутация: нет Всего: нет |
Спасибо!
Akina, правда ли можно массив лейблов в Access сделать? Если да, то как? Заранее благодарю |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 30 Всего: 454 |
АлексейМ
Это я дошел уже... одновременно модерю VB6 и Access - путаю... виноват, сорри. Да, массив контролов действительно в Аксессе не создать. Придется выворачиваться - у каждой надписи метод CLICK свой делать + единая процедура обработки:
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Papirus |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 298 Регистрация: 19.4.2005 Где: Санкт-Петербург Репутация: 2 Всего: 1 |
Можно, конечно, и так тоже. Но =ИмяФункции(параметр) мне кажется проще и меньше кода |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 30 Всего: 454 |
Именно это в моем примере и эмулируется... в Аксессе это невозможно, ибо не VB, а VBA. Так что не понял, к чему это ты сказал... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Papirus |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 298 Регистрация: 19.4.2005 Где: Санкт-Петербург Репутация: 2 Всего: 1 |
=ИмяФункции(параметр) - это прописывается в СВОЙСТВАХ надписи в поле "Нажатие клавиши" ВМЕСТО [процедура обработки события] и не требует создавать процедуру
|
||||
|
|||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 30 Всего: 454 |
Papirus
Это абсолютно то же самое по коду и по скорости... впрочем с точки зрения простоты ты совершенно прав... Однако автоматизировать это будет не совсем просто... хотя в каждом контроле (надписи) можно указать свой параметр. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Papirus |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 298 Регистрация: 19.4.2005 Где: Санкт-Петербург Репутация: 2 Всего: 1 |
Вот именно. А автоматизировать разработку в любом случае здесь не удастся |
|||
|
||||
| АлексейМ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 29.8.2005 Репутация: нет Всего: нет |
Спасибо!!!!!
|
|||
|
||||
| Guest |
|
||||
|
Unregistered |
Хотя возможно именно в этом случае я и не прав. Ведь есть возможность указать в процедуре, например, создания лейбла:
|
||||
|
|||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 30 Всего: 454 |
Какая разница, в какой точке писАть индивидуальный для каждого контрола код? -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Papirus |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 298 Регистрация: 19.4.2005 Где: Санкт-Петербург Репутация: 2 Всего: 1 |
Мож я чё не понял, но при создании коллекции лейблов программно, такой подход очень даж поможет добавить обработчики событий этим лейблам (текстбоксам, комбо, лист и т.д.) |
|||
|
||||
| Гость_Олег |
|
|||
|
Unregistered |
Даа, ребята. прикольные советы даёте. А если придется 764 прямоугольника автоматом нарисовать и у всех их одно и то же событие обрабатывать? Например MouseMove? Написать в каждом контроле обработчик и потом чего-то куда-то какой-то функции скармливать? Как говориться, "легких путей не ищем"
А про модули классов кто-нибудь вообще слышал? Это так, подсказка. |
|||
|
||||
| АлексейМ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 35 Регистрация: 29.8.2005 Репутация: нет Всего: нет |
А если поподробнее?
А то я уж задолбался к каждому контролу свою процедуру обработки прописывать - там не одна тыща строк получается.... Неужели всё-таки можно сделать что-то универсальное? |
|||
|
||||
| gromikiss |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 2.6.2005 Репутация: нет Всего: нет |
Полностью поддерживаю Papirusa
|
|||
|
||||
| Гость_Олег |
|
|||
|
Unregistered |
Ладно, девочки, вот вам пример. Естественно, вопреки пожеланиям трудящихся , никаких извращений вроде макросов не будет. Одинаковых имен контролов тоже - в VBA Access это невозможно, это возможно в простом VB.
К примеру, очень нам захотелось обрабатывать кучу одинаковых контролов. Пусть это будут надписи. Мы хотим, чтобы при наведении на надпись она меняла свой стиль, а при двойном клике - выводила своё имя. Хотим, чтобы имя оно в себе самой и писала. Естественно, на вечер у нас запланирована пьянка, но её нам придется пропустить, если нужно будет писать к каждому контролу обработчик. Не говоря уже о случае, когда произвольное количество контролов создаётся программно. Подход такой: 1. Создаем свой собственный класс, в котором опишем всё желаемое, что должна делать наша надпись. 2. В каком-нибудь событии нашей формы (Open вполне подойдет) , содержащей надписи, напишем процедуру, просматривающую все контролы этой формы и для всех встретившихся надписей создающая объект нашего собственноручно написанного в п.1. класса. Эти объекты все запихиваются в какую-нибудь коллекцию и там будут храниться, пока существует наша форма. 3. Наслаждаемся. Поехали. Начнем с формы. Пишем в модуле нашей формы: Option Explicit ' Наше событие Open Private Sub Form_Open(Cancel As Integer) Dim ctl As Control, oLbLst As LabelListener Set cllControls = New Collection 'создаем коллекцию где будем хранить 'обработчики событий For Each ctl In Me.Controls ' просматриваем все контролы формы If ctl.ControlType = acLabel Then ' нужны только надписи Set oLbLst = New LabelListener 'создаем наш объект 'самописного класса LabelListener oLbLst.Init ctl 'вызываем событие объекта, 'обозначающее те события контрола ' которые нам приспичило обрабатывать ' cllControls.Add oLbLst 'добавляем обработчик в коллекцию End If Next ctl End Sub ' Это событие формы просто восстанавливает стиль отображения ' контрола когда если мы уводим с него мышку. DataField - это имя основного раздела нашей формы. Private Sub DataField_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) On Error Resume Next lastControl.SpecialEffect = 3 End Sub 'При выгрузке формы хотим очищать коллекцию и уничтожать ссылку на неё, 'чтобы не засирать память компа Private Sub Form_Unload(Cancel As Integer) Dim q As Long, i As Long q = cllControls.Count For i = 1 To q cllControls.Remove 1 Next Set cllControls =Nothing End Sub Далее создадим обычный модуль в котором только объявим публичные ссылки Public lastControl As Control, cllControls As Collection (lastControl нам нужен, чтобы восстанавливать его отображение при уводе мышки с контрола (и на lastControl и на cllControls есть ссылки и из модуля формы и из нашего самописного модуля класса)) Далее создадим модуль класса, присваиваем ему имя LabelListener и пишем в нем следующее Option Explicit Private WithEvents ctlMntr As Label 'объявили переменную с событиями 'типа Надпись ' Обозначаем сам факт наличия соответствующих событий контрола ' Нас интересуют события MouseDown, MouseMove и DblClick Public Sub Init(ByRef monitorControl As Label) Set ctlMntr = monitorControl ctlMntr.OnMouseDown = "[Event Procedure]" ctlMntr.OnMouseMove = "[Event Procedure]" ctlMntr.OnDblClick = "[Event Procedure]" End Sub ' Далее описываем сами события, обратите внимание на специфику их имен Private Sub ctlMntr_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) lastControl.SpecialEffect = 3 Set lastControl = ctlMntr ctlMntr.SpecialEffect = 2 End Sub Private Sub ctlMntr_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) On Error Resume Next lastControl.SpecialEffect = 3 Set lastControl = ctlMntr ctlMntr.SpecialEffect = 1 End Sub Private Sub ctlMntr_DblClick(Cancel As Integer) lastControl.SpecialEffect = 3 Set lastControl = ctlMntr ctlMntr.Caption = ctlMntr.Name End Sub Всё, программирование закончили. Далее в нашей форме, любым доступным нам способом создаем столько надписей, сколько хотим (в форме максимум 754 контрола можно добавить не вызывая ругательных сообщений). Для пущего эффекта пусть свойство Caption наших надписей изначально будет содержать пустую строку . Запускаем форму, наслаждаемся, уходим на пьянку. |
|||
|
||||
![]()
|
| Правила форума "MS Access" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MS Access | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |