Модераторы: Akina

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Вывод имени контрола в MsgBox, Подскажите, пожалуйста :) 
:(
    Опции темы
АлексейМ
Дата 7.9.2005, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 29.8.2005

Репутация: нет
Всего: нет



Спасибо!

Akina, правда ли можно массив лейблов в Access сделать? Если да, то как?
Заранее благодарю smile
PM MAIL   Вверх
Akina
Дата 7.9.2005, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



АлексейМ
Это я дошел уже... одновременно модерю VB6 и Access - путаю... виноват, сорри.

Да, массив контролов действительно в Аксессе не создать.
Придется выворачиваться - у каждой надписи метод CLICK свой делать + единая процедура обработки:

Код

Private Sub Надпись0_Click()
    Call Label_Click_Handler(0)
End Sub
Private Sub Надпись1_Click()
    Call Label_Click_Handler(1)
End Sub
Private Sub Надпись2_Click()
    Call Label_Click_Handler(2)
End Sub
...
Private Sub Label_Click_Handler(Index As Integer)
    ....
End Sub




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Papirus
Дата 8.9.2005, 08:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 19.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 1



Цитата(Akina @ 7.9.2005, 15:12)
Придется выворачиваться - у каждой надписи метод CLICK свой делать

Можно, конечно, и так тоже. Но =ИмяФункции(параметр) мне кажется проще и меньше кода
PM MAIL ICQ   Вверх
Akina
Дата 8.9.2005, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Papirus @ 8.9.2005, 09:04)
Но =ИмяФункции(параметр) мне кажется проще и меньше кода

Именно это в моем примере и эмулируется... в Аксессе это невозможно, ибо не VB, а VBA. Так что не понял, к чему это ты сказал...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Papirus
  Дата 8.9.2005, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 19.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 1



Цитата(Akina @ 8.9.2005, 10:07)
Цитата (Papirus @ 8.9.2005, 09:04)
Но =ИмяФункции(параметр) мне кажется проще и меньше кода


Именно это в моем примере и эмулируется... в Аксессе это невозможно, ибо не VB, а VBA. Так что не понял, к чему это ты сказал...

=ИмяФункции(параметр) - это прописывается в СВОЙСТВАХ надписи в поле "Нажатие клавиши" ВМЕСТО [процедура обработки события] и не требует создавать процедуру
Цитата(Akina @ 7.9.2005, 15:12)
Private Sub Надпись2_Click()
    Call Label_Click_Handler(2)
End Sub
smile




PM MAIL ICQ   Вверх
Akina
Дата 8.9.2005, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Papirus
Это абсолютно то же самое по коду и по скорости... впрочем с точки зрения простоты ты совершенно прав...
Однако автоматизировать это будет не совсем просто... хотя в каждом контроле (надписи) можно указать свой параметр.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Papirus
Дата 9.9.2005, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 19.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 1



Цитата(Akina @ 8.9.2005, 14:11)
хотя в каждом контроле (надписи) можно указать свой параметр.

Вот именно. А автоматизировать разработку в любом случае здесь не удастся
PM MAIL ICQ   Вверх
АлексейМ
Дата 9.9.2005, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 29.8.2005

Репутация: нет
Всего: нет



Спасибо!!!!! smile smile smile
PM MAIL   Вверх
Guest
Дата 11.9.2005, 10:38 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Papirus @ 9.9.2005, 10:15)
А автоматизировать разработку в любом случае здесь не удастся

Хотя возможно именно в этом случае я и не прав. Ведь есть возможность указать в процедуре, например, создания лейбла:
Код

Dim I as Integer
I=11
MyForm.MyLabel.OnClick = "=MyProcName(" & I & ")"
.....


  Вверх
Akina
Дата 11.9.2005, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 30
Всего: 454



Цитата(Guest @ 11.9.2005, 11:38)
возможность указать в процедуре, например, создания лейбла:

Какая разница, в какой точке писАть индивидуальный для каждого контрола код?




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Papirus
Дата 12.9.2005, 08:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 298
Регистрация: 19.4.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 1



Цитата(Akina @ 11.9.2005, 21:05)
Какая разница, в какой точке писАть индивидуальный для каждого контрола код?


Мож я чё не понял, но при создании коллекции лейблов программно, такой подход очень даж поможет добавить обработчики событий этим лейблам (текстбоксам, комбо, лист и т.д.)

PM MAIL ICQ   Вверх
Гость_Олег
Дата 25.11.2005, 10:49 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Даа, ребята. прикольные советы даёте. А если придется 764 прямоугольника автоматом нарисовать и у всех их одно и то же событие обрабатывать? Например MouseMove? Написать в каждом контроле обработчик и потом чего-то куда-то какой-то функции скармливать? Как говориться, "легких путей не ищем" smile))
А про модули классов кто-нибудь вообще слышал? Это так, подсказка.
smile))
  Вверх
АлексейМ
Дата 25.11.2005, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 35
Регистрация: 29.8.2005

Репутация: нет
Всего: нет



А если поподробнее?
А то я уж задолбался к каждому контролу свою процедуру обработки прописывать - там не одна тыща строк получается.... Неужели всё-таки можно сделать что-то универсальное?
PM MAIL   Вверх
gromikiss
Дата 25.11.2005, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 2.6.2005

Репутация: нет
Всего: нет



Полностью поддерживаю Papirusa smile . Просто и со вкусом, пусть и не очень круто. Главное что бы Леха сообразил. И вопрос к Akine : расскажи поподробнее как сделать такой массив, чтобы у всех надписей было одно имя. smile если не тяжело опубликуй кусок работающей проги, для размещения надписей с одним именем на обычной форме. Или ты имел в виду все надписи будут восприниматься как один объект? Тогда тем более интересно глянуть код программы. Лично я как ни крутил - но увы две надписи с одим и тем же именем не смог прилепить на форму. один объект - одно имя, это же его идентификация. Я не прав? Если да, то в чем? И опять же хочу пример smile
PM MAIL   Вверх
Гость_Олег
Дата 27.11.2005, 17:01 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


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 наших надписей изначально будет содержать пустую строку .

Запускаем форму, наслаждаемся, уходим на пьянку.
  Вверх
Страницы: (3) Все 1 [2] 3 
Закрытая темаСоздание новой темы Создание опроса
Правила форума "MS Access"
Akina
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] и [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS Access | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.