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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Перенесено из VB6] Определить объект на котором кликнули 
V
    Опции темы
BelkaJul
Дата 4.9.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



доброго времени суток, коллеги.

Общая суть проблемы:
на форме расположено около сотни объектов "прямоугольник" (имена в виде L1S1P1, L2S1P1....). 
В базе товара есть поле "полка на складе" (хранится строка, совпадающая с именем одного из "прямоугольников").
Надо чтобы кликая на прямоугольнике (символизирующем конкретную полку) - выдавалась информация о товаре, который лежит на складе.

ЧТобы не плодить код сделань так:

Код

For cmd = 0 To Me.Controls.Count - 1
    If InStr(1, Me.Controls.Item(cmd).Name, "L") = 1 And _
       InStr(1, Me.Controls.Item(cmd).Name, "S") = 3 And _
       ((InStr(1, Me.Controls.Item(cmd).Name, "P") = 5) Or (InStr(1, Me.Controls.Item(cmd).Name, "P") = 6)) Then

      Me.Controls(cmd).OnClick = "[macros_fun]"
  End If
Next cmd

Т.е. в цикле на все эти "прямоугольники" вешаю процедуру обработки "macros_fun".

Передать в macros_fun агрументом имя объекта (на котором кликнули) не получается.

Можно ли как-нибудь в функции macros_fun определить на каком же прямоугольнике только что кликнул пользователь?
вариант Screen.ActiveForm.ActiveControl.ControlName не срабатывает
 smile   smile   smile 


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


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


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

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



Цитата(BelkaJul @  4.9.2007,  14:47 Найти цитируемый пост)
на все эти "прямоугольники" вешаю процедуру обработки "macros_fun".

Это макрос или процедура в модуле?



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

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


Новичок



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

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



Цитата(Akina @ 4.9.2007,  16:42)
Добавлено @ 16:42
Цитата(BelkaJul @  4.9.2007,  14:47 Найти цитируемый пост)
на все эти "прямоугольники" вешаю процедуру обработки "macros_fun".

Это макрос или процедура в модуле?

это процедура в модуле.
поэтому и в квадратных скобках
(если верить Хелпу, то:
Цитата

The OnClick value will be one of the following, depending on the selection chosen in the Choose Builder window (accessed by clicking the Build button next to the On Click box in the object's Properties window):

If Expression Builder is chosen, the value will be "=expression", where expression is the expression from the Expression Builder window. 
If Macro Builder is chosen, the value is the name of the macro. 
If Code Builder is chosen, the value will be "[Event Procedure]". 
If the On Click box is blank, the property value is an empty string.
)

в этой процедуре будет запрос к таблице и выборка строк по имени прямоугольника.

Просто прописывать около ста раз на каждый прямоугольник
Код

Private Sub L2S3P3_Click()
   macros_fun "L2S3P3"         
End Sub

 и для каждого прямоугольника прописывать, какое же имя передавать в запрос  - это просто дикость

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


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


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

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



Предлагаю такие решения.

Решение 1 - Вместо OnClick использовать OnMouseUp - ему передаются, кроме всего прочего, координаты клика, что позволит определить контрол, на котором произошел клик. Что-нить вроде:
Код

With Me.Controls
   For cmd = 0 To .Count - 1
      If InStr(1, .Item(cmd).Name, "L") = 1 And _
      InStr(1, .Item(cmd).Name, "S") = 3 And _
      ((InStr(1, .Item(cmd).Name, "P") = 5) Or (InStr(1, .Item(cmd).Name, "P") = 6)) Then
         If  (.Item(cmd).Top - X)*(.Item(cmd).Top + .Item(cmd).Height - X) <=0 and _
         (.Item(cmd).Left - X)*(.Item(cmd).Left + .Item(cmd).Width - X) <=0 Then
            ControlNameOnClick = .Item(cmd).Name
            Exit For
         End If
      End If
   Next cmd
End With

Если это неприменимо, и надо использовать обязательно OnClick, то

Решение 2 - Дополнительно обработать OnMouseDown, в нем определять имя контрола, на котором выполнен последний клик (также по координатам клика), сохранять его в переменной уровня модуля или проекта, и использовать его в процедуре OnClick.


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

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1283
Регистрация: 10.5.2006
Где: Беларусь, Минск

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



Зачем тебе макрос? Функция гораздо лучше - ошибки можно обработать и прочее. В модуле необходимо объявить публичную фнункцию. Элементу на событие присваивать так "=имя_функции()". ActiveControl не работает, потому что прямоугольник не может получить фокуса. Для того чтобы сосалться на текущий объект в событии используй CodeContextObject.

Т.е. из справки

You can use the CodeContextObject property to determine the object in which a macro or Visual Basic code is executing. Read-only Object.

expression.CodeContextObject
expression    Required. An expression that returns one of the objects in the Applies To list.

Setting
The CodeContextObject property is set by Microsoft Access and is read-only in all views.

Remarks
The ActiveControl, ActiveDataAccessPage, ActiveDatasheet, ActiveForm, and ActiveReport properties of the Screen object always return the object that currently has the focus. The object with the focus may or may not be the object where a macro or Visual Basic code is currently running, for example, when Visual Basic code runs in the Timer event on a hidden form.



Код

Private Sub Command1_Click()
    On Error GoTo Command1_Err
    Error 11                    ' Generate divide-by-zero error.
    Exit Sub

    Command1_Err:
        If ErrorMessage("Command1_Click() Event", vbYesNo + _
                vbInformation, Err) = vbYes Then
            Exit Sub
        Else
            Resume
        End If
End Sub

Function ErrorMessage(strText As String, intType As Integer, _
        intErrVal As Integer) As Integer
    Dim objCurrent As Object
    Dim strMsgboxTitle As String

    Set objCurrent = CodeContextObject

    strMsgboxTitle = "Error in " & objCurrent.Name
    strText = strText & "Error #" & intErrVal _
        & " occured in " & objCurrent.Name
    ErrorMessage = MsgBox(strText, intType, strMsgboxTitle)
    Err = 0
End Function


PM MAIL WWW ICQ Skype GTalk   Вверх
BelkaJul
Дата 6.9.2007, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Akina,  видимо где-то я не догоняю :(

bopoha, 
Цитата
ActiveControl не работает, потому что прямоугольник не может получить фокуса

аааа, точно!!!!!
(переделала. Вместо прямоугольников теперь кнопки)
Теперь можно использовать и ActiveControl.ColntrolName  smile 

Цитата
Элементу на событие присваивать так "=имя_функции()". 

 smile  заработало! 


Большое спасибо всем за участие и помощь!!!



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.