Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Access
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2013, 15:13   #31
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Все возможно. Только боюсь, погрязнете с отладкой в сабклассинге.
Насколько это задание важно?
EUGY вне форума Ответить с цитированием
Старый 18.01.2013, 15:17   #32
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Насколько это задание важно?
Очень важно
fyedor вне форума Ответить с цитированием
Старый 18.01.2013, 15:25   #33
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Эта форма имеет один экземпляр или возможен случай, когда открыты две и более формы с теми же или ,может, разными данными. Я это к тому, что легче написать оконную процедуру, если окно одно. Иначе придется перенаправлять вызов в конкретный экземпляр класса.
EUGY вне форума Ответить с цитированием
Старый 18.01.2013, 15:31   #34
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
Эта форма имеет один экземпляр или возможен случай, когда открыты две и более формы с теми же или ,может, разными данными. Я это к тому, что легче написать оконную процедуру, если окно одно. Иначе придется перенаправлять вызов в конкретный экземпляр класса.
Ну в один момент форма может иметь только один экземпляр. Но одновременно с ней может быть открыта другая форма..
fyedor вне форума Ответить с цитированием
Старый 18.01.2013, 16:06   #35
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Поставил-таки я акцесс, чтобы видеть подводные камни.
Вообщем так:
Добавляем модуль в проект:

Код:
Option Compare Database
Option Explicit
Public Function Subclass(ByVal hwnd As Long) As Boolean
  If GetProp(hwnd, "PRVPROC") <> 0 Then Exit Function
  SetProp hwnd, "PRVPROC", GetWindowLong(hwnd, GWL_WNDPROC)
  SetWindowLong hwnd, GWL_WNDPROC, AddressOf proc
  Subclass = True
End Function

Public Sub UnSubclass(ByVal hwnd As Long)
  SetWindowLong hwnd, GWL_WNDPROC, GetProp(hwnd, "PRVPROC")
  RemoveProp hwnd, "PRVPROC"
End Sub

Public Function proc(ByVal hwnd As Long, ByVal umsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Select Case umsg
   Case WM_PAINT
        Dim pa As PAINTSTRUCT
        BeginPaint hwnd, pa
              Dim rc As RECT
              rc.Right = 50
              rc.Bottom = 60
              ' что-то рисуем на контексте
              FillRect pa.hdc, rc, GetSysColorBrush(COLOR_ACTIVECAPTION)
        EndPaint hwnd, pa
   End Select
   proc = CallWindowProc(GetProp(hwnd, "PRVPROC"), hwnd, umsg, wParam, lParam)
End Function
В коде формы:
Код:
Private Sub Form_Load()
    Subclass hwnd ' возможно будет нужен не этот хендл, а какого-нибудь дочернего окна
End Sub

Private Sub Form_Unload(Cancel As Integer)
    UnSubclass hwnd
End Sub
Обязательно компилируем проект, чтобы сразу видеть ошибки, иначе при кривом сабклассинге приложение будет вылетать.
Закрываем редактор VBA !!!.
Проверяем.

Это конечно болванка, и нюансов будет еще много, но Вам будет от чего оттолкнуться.

Последний раз редактировалось EUGY; 19.01.2013 в 05:25.
EUGY вне форума Ответить с цитированием
Старый 21.01.2013, 08:29   #36
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Большое спасибо!

Только при запуске формы приложение полность вылетает.

Предположительно вылетает на строчке:

Код:
SetWindowLong hwnd, GWL_WNDPROC, AddressOf Proc
предварительно выполнив ее.

Последний раз редактировалось fyedor; 21.01.2013 в 09:27.
fyedor вне форума Ответить с цитированием
Старый 21.01.2013, 10:08   #37
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

welcome to subclassing!
Ищите. Малейшая ошибка, и вылет. Предварительная компиляция отловит 90 % ошибок, остальные 10 случаются в рантайме. Создайте отдельную базу и проект с одной формой, чтобы не было ничего лишнего, потренеруйтесь.
EUGY вне форума Ответить с цитированием
Старый 21.01.2013, 10:56   #38
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Цитата:
Сообщение от EUGY Посмотреть сообщение
welcome to subclassing!
Ищите. Малейшая ошибка, и вылет. Предварительная компиляция отловит 90 % ошибок, остальные 10 случаются в рантайме. Создайте отдельную базу и проект с одной формой, чтобы не было ничего лишнего, потренеруйтесь.
Хехе. Глупый вопрос: что значит предварительная компиляция?

Вроде явных ошибок нет, а приложение полностью слетает, т.е. Access закрывается полностью.
fyedor вне форума Ответить с цитированием
Старый 21.01.2013, 11:03   #39
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Цитата:
что значит предварительная компиляция?
В редакторе кода VBA меню: Debug > Compile

PS. Убедитесь, что есть Option Explicit в начале каждого модуля и класса, что все константы в коде имеют объявления, вызов функций не противоречит их декларациям.

Вот даже здесь помарка:
Вы писали:
Цитата:
Предположительно вылетает на строчке:
Код:

SetWindowLong hwnd, GWL_WNDPROC, AddressOf Proc
предварительно выполнив ее.
у меня в примере функция proc - у вас Proc.
Для vba это не имеет значения, но позволяет сделать предположение, что где-то в коде допускается еще большая небрежность.
Я ведь не вижу, что у Вас на экране.

Последний раз редактировалось EUGY; 21.01.2013 в 11:16.
EUGY вне форума Ответить с цитированием
Старый 21.01.2013, 11:10   #40
fyedor
Пользователь
 
Регистрация: 11.12.2012
Сообщений: 71
По умолчанию

Предварительная компиляция не выдала ошибок.

Вот тут есть пример:
http://www.vbmigration.com/detknowledgebase.aspx?id=51

В нем в процедуру CallWindowProc первым параметром посылается результат работы процедуры SetWindowLong. У вас иначе сделано.

А у Вас программа нормально отрабатывает?

Последний раз редактировалось fyedor; 21.01.2013 в 11:21.
fyedor вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinApi рисование в VBA Desha Помощь студентам 5 05.12.2012 12:32
Прозрачность в ie WennY HTML и CSS 1 26.08.2012 17:13
Различие кода mfc и WinApi(mfc ручками набили, а WinApi автоматически с генерировался!! нужно явное отличие, не могу найти) Артём1991 Помощь студентам 0 25.03.2012 17:13
Прозрачность digital-stream Общие вопросы Delphi 1 14.11.2011 21:03
Ошибка с SetLength применительно в PChar Celestia Общие вопросы Delphi 7 09.04.2011 06:42