Rambler's Top100
Форум: MS ACCESSVBVBA MS OfficeMS SQL server
Новые сообщения: 0000

Форум: MS ACCESS

Вопросы связанные с MS ACCESS

Обновить визитку
Участники «Online»
Все участники

 
 

Доброго времени суток, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: excel class msforms.textbox event fail
 
 автор: Силblч   (14.09.2011 в 18:32)   личное сообщение
 
 

почему то не все события доступны
кто как боролся? :)

  Ответить  
 
 автор: Lukas   (14.09.2011 в 23:51)   личное сообщение
 
 

Минута обсуждения истекла.
1:0 в пользу телезрителя.

ps. СилЫч, а по-проще вопроса нет? :)

  Ответить  
 
 автор: час   (15.09.2011 в 09:12)   личное сообщение
 
 

Это где ?
Или это о чём?
Или это кому?

  Ответить  
 
 автор: Силblч   (15.09.2011 в 09:51)   личное сообщение
48 Кб.
 
 

аааааашит!

нету :) я написал приблуду красивеньку и полезну, в аксессе
а мне говорят - а можешь, тоже самое, только в экселе? :)
я говорю - а нахрена?
мне абиснили :) и поставили жосткие рамки :)
но мне то до балды их Дед Лайны

вот пришлось побыстрячку ваять формы в Экселе и использовать только те, компоненты, которые есть в наличие этого самого Экселя...

и чтобы без аксесса! пришлось в xml запихивать впихуемоё

теперь вот надо фиксить недостаточность функционала кастурбатых элементов экселя

завтра надо предоставить основную концепцию работы с этой надстройкой заказчику :)
мелочи все пришлось опустить до лучших времен(но когда они настанут?!)

как то так

  Ответить  
 
 автор: kot_k_k   (15.09.2011 в 09:56)   личное сообщение
 
 

а ты им скрой Аксовские прибамбасы (оставть только своё), а на формах напиши Ё-ксель

  Ответить  
 
 автор: Силblч   (15.09.2011 в 12:54)   личное сообщение
 
 

тогда головняк начнецца у меня когда пользователи будут кричать,ч то у них не работает (по причине того,что нет аксесса)

а оно мне надо?

  Ответить  
 
 автор: kot_k_k   (15.09.2011 в 13:21)   личное сообщение
 
 

ты ж всё могешь - подмени стандартные вопли своими

или сделай анализ из скрипта - в которое - если нет акса просит установить данный тобой дистрибутив и в тихаря тулит акс ни у кого не спрашивя после чего успешно работает

  Ответить  
 
 автор: snipe   (15.09.2011 в 13:57)   личное сообщение
 
 

После обновления
можно так сделать
в ненужной (скрытой) ячейке
=функция(ссылка на нужную ячеку)

  Ответить  
 
 автор: Силblч   (15.09.2011 в 15:44)   личное сообщение
 
 

странное происходит
реализовал, типа таймер, на форме экселя

если запускаем форму, которая запускает другую форму с таймером, через функцию - таймер работает
если запускаем форму, которая запускает другую форму с таймером, через пункт меню - таймер не работает


гыгынуха какая то, а не Excel



Option Explicit

Public isCancel%
Public ParentFormName$
Dim rs As ADODB.Recordset

Dim timer_enabled As Boolean
Dim timer_interval As Double

Dim phWnd&

Private Sub btnCancel_Click()
    If Err = 0 Then
        If MsgBox("Прерывание может занять несколько минут" & vbNewLine & _
                  "Вы действительно хотите прервать выполнение запроса к серверу?" _
                  , vbYesNo, "Подтвердите") = vbNo Then Exit Sub
    End If
    isCancel = 1
    timer_Stop
    Me.Hide
    DoEvents
End Sub

Private Sub UserForm_Activate()
On Error GoTo err123
    Dim ff As Object
    isCancel = 0
    If Len(nz(ParentFormName, "")) = 0 Then
        MsgBox "Неверно переданы параметры" & vbCrLf & iDevelop
        GoTo errTerm
    End If
    For Each ff In VBA.Global.UserForms
        If ff.name = ParentFormName Then Exit For
    Next
    If ff Is Nothing Then GoTo errTerm
    Set rs = ff.oTray
    If rs.State = adStateClosed Then GoTo errTerm
    Me.txtTimeOf = Format(Abs(Time()), "Long Time")
    phWnd = initBar(20)
    Call timer_Start(TimeValue("00:00:01"))
    Exit Sub
err123:
    MsgBox Error & vbCrLf & iDevelop
errTerm:
    Call timer_Stop: isCancel = 0: Unload Me
    Exit Sub
End Sub

Private Sub UserForm_Initialize()
'хз
End Sub

Public Sub Timer_OnTimer()
    Call Timer
    If timer_enabled Then Call timer_Start
End Sub

Public Sub Timer()
On Error Resume Next
Dim tt
Static i%
tt = Format(Abs(Time()), "Long Time")
Me.txtTimeOf = tt
i = i + 1: updateBar i
If i > 20 Then clearBar phWnd: initBar 20: i = 1
If conn.State = 0 Then
    MsgBox "Сервер прервал сессию"
    Call btnCancel_Click
    Exit Sub
End If
Select Case rs.State
Case adStateClosed '0 Indicates that the object is closed.
    Me.capInfo.caption = "Закрыт:"
    Me.capInfo.ForeColor = RGB(255, 0, 0)
    MsgBox "Запрос закрыт со стороны сервера " & iDevelop
    Call timer_Stop: isCancel = 0: Me.Hide
    Exit Sub
Case adStateOpen '1 Indicates that the object is open.
    Me.capInfo.caption = "Выполнен:"
    Call timer_Stop: isCancel = 0: Me.Hide
    Exit Sub
Case adStateConnecting '2 Indicates that the object is connecting.
    Me.capInfo.caption = "Подключен:"
Case adStateExecuting '4 Indicates that the object is executing a command.
    Me.capInfo.caption = "Выполняется:"
Case adStateFetching '8 Indicates that the rows of the object are being retrieved.
    Me.capInfo.caption = "Выгружается:"
End Select
If Err = 0 Then Exit Sub
err123:
    MsgBox Error & vbCrLf & iDevelop, , "Timer"
    Call btnCancel_Click
Exit Sub
End Sub

Sub timer_Start(Optional ByVal interval As Double)
    If interval > 0 Then timer_interval = interval
    timer_enabled = True
    If timer_interval > 0 Then Application.OnTime (Now + timer_interval), "RunOnTimer" 'процедура в модуле. запускает Timer_OnTimer
End Sub

Sub timer_Stop()
    timer_enabled = False
    Application.EnableCancelKey = 0 'отключаем прерывание
    clearBar phWnd
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        MsgBox "Закрытие этой формы возможно только при нажатии на кнопку 'Прервать'", , iMsgErr
        Cancel = True
    End If
End Sub

Private Sub UserForm_Terminate()
    isCancel = 0
    clearBar phWnd
    SetStatus
End Sub

  Ответить  
 
 автор: Силblч   (15.09.2011 в 17:05)   личное сообщение
 
 

наверное какая то херня с таймерами
может не отменяются?

  Ответить  
 
 автор: Силblч   (15.09.2011 в 18:29)   личное сообщение
 
 

нашел в чем собака порылась
ну не дебилы, а?

видитили два раза функция из меню вызывалась, потому что в ней параметр передавался!
пришлось параметр прятать в Tag

все заработало
спасибо

ну всмысли не все, но мы ищем решения, проблем солвинг, млять
чтобы я еще когда нибудь сел за баранку этого пылесоса?!

  Ответить  
 
 автор: Lukas   (15.09.2011 в 21:26)   личное сообщение
 
 

Лучша(Pure) подписаться на события контролов коммандбара.
Правда, библиотека нужна офисная.

  Ответить  
 
 автор: Силblч   (15.09.2011 в 22:11)   личное сообщение
 
 

какэто сделать? я создал класс соответсвующего контола
приколбасил его события в форме
часть событий ёсть, часть - псу под хвост!
это как понимать?
иликак вынимать, а? :)

  Ответить  
 
 автор: Lukas   (15.09.2011 в 22:30)   личное сообщение
11 Кб.
 
 

Примерный текст модуля класса для небольших панелек с известным числом контролов:

Private WithEvents cbb1 As Office.CommandBarButton
Private WithEvents cbb2 As Office.CommandBarButton
Private cb As Office.CommandBar

Private Sub cbb1_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    MsgBox Ctrl.Caption
End Sub

Private Sub cbb2_Click(ByVal Ctrl As Office.CommandBarButton, CancelDefault As Boolean)
    MsgBox Ctrl.Caption
End Sub

Private Sub Class_Initialize() ' или класса формы
    Set cb = CommandBars.Add("My", , , True)
    With cb
        Set cbb1 = .Controls.Add(1, , , , True)
        With cbb1
            .Caption = "First"
            .Parameter = "1st"
            .FaceId = 71
        End With
        Set cbb2 = .Controls.Add(1, , , , True)
        With cbb2
            .Caption = "Second"
            .Parameter = "2nd"
            .FaceId = 72
        End With
        .Visible = True
    End With
End Sub

Private Sub Class_Terminate() ' или класса формы
    Set cbb1 = Nothing
    Set cbb2 = Nothing
    cb.Delete
    Set cb = Nothing
End Sub


Кстати, офисная библиотека в Excel-е подключена дефолтно.
Или я не о том сейчас? :)

  Ответить  
 
 автор: Lukas   (15.09.2011 в 23:22)   личное сообщение
7 Кб.
 
 

WithOut UserForm =>
:)

  Ответить  
 
 автор: Силblч   (16.09.2011 в 08:46)   личное сообщение
 
 

да, прикольно выглядит, но не надоть нам этого :)

а по поводу текста выше - не с коммандбарами проблема :)) а с контролами, которые на юзерформе
или это я не то? %)
вот создал класс(все как сказал о Великий Гугль :)

Option Explicit
Public WithEvents oTxtBox As MSForms.TextBox   'создаем элемент с отслеживанием его событий
'за назначение с отслеживанием событий отвечает оператор WithEvents
'(может применяться только в модулях классов)

'это событие не происходит вообще , так же как и After_Update и  Before_Update
Private Sub oTxtBox_Exit(ByVal Cancel As MSForms.ReturnBoolean)
     
     
End Sub

Private Sub oTxtBox_Change()
On Error GoTo err123
Static OldValue As String
    
        'If Not IsNumeric(oTxtBox.Text) Then
        '    oTxtBox.Text = OldValue
        '    oTxtBox.SelStart = Len(OldValue)
        'Else
        '    OldValue = oTxtBox.Text
        'End If

    Exit Sub
err123:
    MsgBox Error, , "ValidateEdit #" & Err
    Exit Sub
End Sub

Private Sub oTxtBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
On Error GoTo err123
Dim frm As MSForms.UserForm, vl
    If KeyCode = 13 Then 'pressed Enter

    End If

    Exit Sub
err123:
    MsgBox Error, , "ValidateEdit #" & Err
    Exit Sub
End Sub

Private Sub oTxtBox_MouseDown(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
'-- установить селектор
'.Picture = getPicByFaceID(2945)
End Sub



дальше

'Создаем массив, размерность которого должна быть не менее кол-ва всех элементов события которых мы хотим отслеживать
'Объявляем переменную как НОВЫЙ(созданный нами) КЛАСС - As New clsTxtBoxs - это обязательно
'Данные переменные обязательно должны располагаться в общем модуле и быть глобальными
Public aTxtBox(1 To 255) As New clsTxtBoxs


еще дальше

        Set txtBox = Me.Controls("grpSubForm").Add("Forms.TextBox.1", "txtValue" & i, True)
        With txtBox
            .Text = elm.Attributes(1).nodeValue
            .Left = Me.lblValue.Left
            .Top = topOffset
            .Height = Me.lblValue.Height
            .Width = Me.lblValue.Width
            .BackStyle = fmBackStyleOpaque
            .BorderStyle = fmBorderStyleNone
            .TextAlign = fmTextAlignLeft
            .SpecialEffect = fmSpecialEffectEtched
            Set aTxtBox(i).oTxtBox = Me.Controls("txtValue" & i) 'прицепились к событиям
'но они не все :( 
'а если создать контрол статический, то там события все что надо :/
        End With



стало быть выход какой может быть?
говоришь, создать один контрол статический скрытый и пихать ему значение и проверять там по уму?

з.ы. еще раз говорю - очень ограничен в рамках поставленной задачи: инструмент - только то, что есть в Экселе, без дополнительных эктивиксов(особенно платных) :) ну и по времени тоже, но то такое....

  Ответить  
 
 автор: lukas   (16.09.2011 в 13:01)   личное сообщение
 
 

А так?

...
Set aTxtBox(i).oTxtBox = txtBox
...

  Ответить  
 
 автор: Силblч   (16.09.2011 в 16:31)   личное сообщение
 
 

дык, а мне то надо чтобы вот у этих Me.Controls("txtValue" & i) появились свойства.... в итоге....

  Ответить  
 
 автор: lukas   (16.09.2011 в 16:40)   личное сообщение
 
 

А попробовал ссылаться напрямую?
//подозреваю, что мало что измениться, а вдруг... :)

Я так понял, нужно, что бы события обрабатывались.
Вечером поиграюсь.

  Ответить  
 
 автор: Силblч   (16.09.2011 в 16:50)   личное сообщение
 
 

еще пока не пробывал :) отложил на понедельник
щяс пробую понять, почему в TreeView отображаются иконки на черном фоне
иконки предварительно были зхагружены из CommandBara по FaceID


в 16:30 презентация концепции
в целом я не обосрался
за неделю нахеровертил то, что надо :)

  Ответить  
 
 автор: lukas   (16.09.2011 в 16:55)   личное сообщение
 
 

Молодец, да!

  Ответить  
 
 автор: Силblч   (16.09.2011 в 16:58)   личное сообщение
 
 

нашел да
Me.imListTV.MaskColor = RGB(0, 0, 0)

  Ответить  
 
 автор: Explorer   (16.09.2011 в 17:28)   личное сообщение
 
 

две буквы в префиксе сокращения типа контрола в имени контрола это не есть гуд

  Ответить  
 
 автор: Силblч   (17.09.2011 в 15:07)   личное сообщение
 
 

(с) Винни-Пох

  Ответить  
 
 автор: Lukas   (16.09.2011 в 21:10)   личное сообщение
 
 

Дошло.
Те события, которых не хватает - это события класса Control.

  Ответить  
 
 автор: Lukas   (16.09.2011 в 22:33)   личное сообщение
 
 

Дальнейшие извращения показали - при попытке объявить переменную с событиями As Control в классе,
в рун-е приводят к ошибке 459 'Object or class does not support the set of events, хотя компилируется нормально.

Вот о похожем случае пишет Бенедикт: http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=483552&msg=5340709

  Ответить  
 
 автор: Силblч   (17.09.2011 в 15:08)   личное сообщение
 
 


спасибо! пороемся

  Ответить  
 
 автор: Силblч   (15.09.2011 в 16:34)   личное сообщение
 
 

почему у меня при выполнении процедуры, вызов которой стоит на соответствующем пункте меню,
при выставленной точке останова не происходит этого самого останова?

но процедура сама выполняется

пункт меню, из которого она вызывается был добавлен программно
шо за гамно?

  Ответить  
 
 автор: час   (15.09.2011 в 23:27)   личное сообщение
 
 

Типа выполняется не твоя процедура, а встроенная

  Ответить  
 
 автор: Силblч   (16.09.2011 в 08:46)   личное сообщение
 
 

ужо разобрались :) двойная бухгалтерия

  Ответить  
 
 автор: kot_k_k   (16.09.2011 в 09:08)   личное сообщение
 
 

Силыч а ты пример выложишь? как учебное пособие.

  Ответить  
 
 автор: Силblч   (16.09.2011 в 10:59)   личное сообщение
 
 

та вроде от (16.09.2011 в 08:46) похоже на примерку

  Ответить  
 
 автор: Силblч   (20.09.2011 в 17:07)   личное сообщение
 
 

хз, но может так как-то...
http://www.mrexcel.com/forum/showthread.php?t=66773

  Ответить  
 
 автор: Lukas   (20.09.2011 в 18:36)   личное сообщение
 
 

Не, не по-пацански то.
В первом примере утюжок с Do: ... DoEvents: Loop,
во втором с Application.OnTimer.
На процессоре яичницу жарить можна будет. :)

  Ответить  
 
 автор: Силblч   (20.09.2011 в 18:58)   личное сообщение
 
 

та я внимательно разбор полетов не устраивал, некогда было :))
по верхам нахватался... ну и хрен с ними :)

  Ответить  
 
 автор: Силblч   (20.09.2011 в 18:31)   личное сообщение
 
 

короче решил пока пацаватый способ :)
разместил на форме статический текстбокс
и при событии на динамическом - нажатие кнопки - ставлю статический на место динамического, и присваиваю ему значение динамического :) после события - exit у статического, присваиваю значение обратно :)

проверка данных и присваивание проходит нормально :) пока что...
есть некоторые непонятки, но поборюс еще :)

зато есть все события :) ыыы
ну, за дебилизм

  Ответить  
 
 автор: Lukas   (20.09.2011 в 18:37)   личное сообщение
 
 

Я за вами не поспеваю.
ыыыыы... :)

  Ответить  
 
 автор: Силblч   (20.09.2011 в 18:58)   личное сообщение
 
 

все работает!
в классе по текстбоксу

Option Explicit
Public WithEvents oTxtBox As MSForms.TextBox   'создаем элемент с отслеживанием его событий
'за назначение с отслеживанием событий отвечает оператор WithEvents
'(может применяться только в модулях классов)
'и события не все :(
'-- а пох! создадим статический текстбокс на форме и будем юзать :)
Private Sub oTxtBox_Change()
On Error GoTo err123
    With frmReports.txtValidate
        frmReports.idRowActive = Replace(oTxtBox.name, "txtValue", "")
        .ZOrder 0
        .top = oTxtBox.top
        .left = oTxtBox.left
        .Height = oTxtBox.Height
        .Width = oTxtBox.Width
        .BackStyle = fmBackStyleOpaque
        .BorderStyle = fmBorderStyleNone
        .TextAlign = fmTextAlignLeft
        .SpecialEffect = fmSpecialEffectEtched
        .value = oTxtBox.value
        .Visible = True
        .SetFocus
    End With
    Exit Sub
err123:
    MsgBox Error, , "ValidateEdit #" & Err
    Exit Sub
End Sub


в форме, где инициализируются динамические

Public Sub txtValidate_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
On Error GoTo err123
    Select Case Me.Controls("txtFormat" & idRowActive).value
    Case "List", "List®"
    Case "Text", "Text®"
    Case "Number"
        If Not IsNumeric(Me.txtValidate) And Me.txtValidate <> "null" Then
            MsgBox "Требуется Число или слово 'null'", , "ValidateEdit"
            Cancel = True
            Exit Sub
        End If
    Case "Number®"
        If Not IsNumeric(Me.txtValidate) Then
            MsgBox "Требуется Число", , "ValidateEdit"
            Cancel = True
            Exit Sub
        End If
    Case "Date", "Date®"
        If Not IsDate(Me.txtValidate) Then
            MsgBox "Требуется дата", , "ValidateEdit"
            Cancel = True
            Exit Sub
        End If
    Case "Check", "Check®"
    Case "Select", "Select®"
    End Select
    Exit Sub
err123:
    MsgBox Error, , "txtValidate_BeforeUpdate"
    Exit Sub
End Sub

Private Sub txtValidate_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    Me.Controls("txtValue" & idRowActive).value = Me.txtValidate.value
    Me.txtValidate.Visible = False
    On Error Resume Next ' бывает косячек, некогда досматривать :)
    Me.Controls("txtValue" & idRowActive).SetFocus
End Sub


в целом роде как на сейчас работает как надо :)
потестирую пока что :)

в общем концепция подходит
с чем всех нас и пряздрявляю на данном этапе

  Ответить  
 
 автор: Lukas   (20.09.2011 в 19:17)   личное сообщение
72 Кб.
 
 

Уууу.... :)

А почему-бы не пользовать ListBox и
пару-тройку стационарных контролов для редактирования/изменения?
типа =>

  Ответить  
 
 автор: Силblч   (20.09.2011 в 20:45)   личное сообщение
 
 

там нуна форма динамическая :/
в аксессе или на вэбэ я пользовал флексгрид - там все есть :)
а здесь ограничили таким наборчиком контролов :) контролы в форме строятся в зависимости от .....

  Ответить  
 
 автор: Lukas   (20.09.2011 в 21:19)   личное сообщение
 
 

Понятненько.
Успехов в етом нелегком.
:)

  Ответить  
 
 автор: Силblч   (20.09.2011 в 22:20)   личное сообщение
 
 

  Ответить  
 
 автор: Силblч   (21.09.2011 в 11:46)   личное сообщение
 
 

кстате, объявил массив контролов класса типа Текстбокс
не глобально в модуле , как где-то настаивали,
а в каждой форме, в которых будут использоваться, сколько надо.
пока, тьфу-тьфу-тьфу, всё работает

  Ответить  
 
 автор: Lukas   (21.09.2011 в 19:03)   личное сообщение
 
 

И правильно, иначе - висяки.
Или коллекцию, но там-же.

  Ответить  
 
 автор: Силblч   (21.09.2011 в 21:36)   личное сообщение
 
 

именно из-за них, болезных, и надоумился :)

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