Страница: 1 |
Помогите кто что знает!Разборак текста по словам... В обычном модуле: Type POINTAPI Type TMSG Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long) Public Function JournalRecordProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Function AppHookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Function ResolvePointer(ByVal lpObj&) As cSystemHook В classmodule(заодно объясните зачем нужны классмлдули): Public Event MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long Private Const WM_KEYDOWN = &H100 Private Const WH_JOURNALRECORD = 0 Private Type EVENTMSG Dim EMSG As EVENTMSG Public Function SetHook() As Boolean Public Sub RemoveHook() Private Sub Class_Initialize() Private Sub Class_Terminate() Friend Function FireEvent(ByVal lParam As Long)
Говоря о классах - вот один FAQ по этому поводу: Что такое классы и с чем их едят? Тем эта столь обширна и затрагивает так много областей программирования, что ей место не в кратеньком FAQ'е, а в обстоятельной книжке. Но я попробую совместить несовместимое, и надеюсь, гуру не будут в обиде, если я опущу частности и то, что мне показалось неважным. Что такое класс? Это совокупность методов, свойств и событий, которые образуют целостный объект. А теперь попроще. Объект - наручные часы. Методы предназначены для установки времени на часах, установки будильника и т.д. Свойства, в нашем случае, определяют цвет корпуса, вид индикатора и т.д. Звук будильника является событием и позволяет провести определенные действия (например, снять молоко с плиты) в заданное время. Чтобы получить доступ к свойствам, методам и событиям объекта (часов), необходимо создать указатель на него, или инстанс. Если класс называется Clock, то создание экземпляра класса (инстанса) будет выглядеть так: Dim clk As Clock Set clk = New Clock При необходимости можно создать несколько экземпляров одного и того же класса, и все эти экземпляры будут работать независимо друг от друга. Ну а теперь, чтобы вызывать метод или обратится к свойству класса, пишем: 'вызовем метод установки времени clk.SetTime "13:56" 'а теперь изменим свойство "Цвет корпуса" clk.Color = "Gold" 'или увеличим свойство "Цена" на 1000 баксов clk.Price = clk.Price + 1000 А теперь самое сложное: создание классов. Начнем с азов. 1. Добавление модуля класса в проект. Добавить модуль класса (часто его называют классовым модулем) можно посредством меню Project|Add Class Module или же кнопки, показанной на рисунке. Далее, назовите Ваш новоиспеченный класс. Поскольку через данную статью красной нитью проходит пример с часами, то так и назовем первый классовый модуль: Clock. 2. Область видимости процедур, свойств, переменных: Private, Public. Очень часто, создавая переменные или процедуры приходится решать вопрос: можно ли будет их использовать вне модуля, или они необходимы только самому модулю. В первом случае такие процедуры или переменные объявляются с префиксом Public, а во втором случае с префиксом Private. Префикс Public является умолчательным и хотя его можно опускать, я рекомендую этого не делать. Добавьте в проект простой, не классовый, модуль и наберите в нем: 'эта переменная видна снаружи модуля Public MyFirstVar As Integer 'а эта переменная является приватной, и не видна вне модуля Private MySecondVar as Integer Создайте в том же модуле процедуру CheckVar и обратитесь из нее к этим двум переменным: Public Sub CheckVar() MyFirstVar = 5 MySecondVar = 7 End Sub Это удается без труда. А теперь, обратимся из модуля формы (он по умолчанию уже входит в проект) к созданным переменным. Как видим, вторая переменная не существует для всего мира и доступна только в модуле, ее породившем. Попробуйте самостоятельно создать публичную и приватную процедуры и обратится к ним из модуля и из модуля формы. 3. Методы. Методы это уже знакомые Вам процедуры (sub) и функции (function). Метод может иметь аргументы, а может не иметь их. Если метод построен на основе функции, то он способен возвращать значения. Создадим метод установки времени на наших часах и метод, возврщающий информацию о состоянии батарейки питания. Для этого в модуле класса напишем: Private m_Time As String 'переменная для хранения времени 'публичный метод установки времени Public Sub SetTime(a_Time As String) 'запомним значение m_Time = a_Time 'произведем какие-то действия . . . End Sub 'публичный метод, возвращающий напряжение батарейки питания Public Function GetPowerState () As Single 'определим напряжение питания батарейки . . . BatteryVoltage = 1.48 'просто эмуляция работы некоего кода 'возвратим значение GetPowerState = BatteryVoltage End Function Создав инстанс класса (как было показано в начале статьи), обращаемся к новоиспеченным методам: Dim sTime As String 'установим время sTime = InputBox ("Введите текущее время:", "Часики", "18:16") clk.SetTime sTime 'определим состояние батарей MsgBox clk.GetPowerState() 'в окне будет напечатано 1.48 4. Свойства. Условно говоря, свойство очень условно можно представить как пара состоящая из функции и процедуры с одним и тем же именем. При обращении к свойству вызывается функция, при изменении - процедура. Если отойти от условностей, то для создания свойств существует ключевое слово Properties с суффиксом Get для получения значения и с суффиксом Let или Set (для объектов) для установки значения. Вообще, свойство чем то похоже на объявленную публичную переменную. С тем лишь отличием, что изменение значения такой переменной нельзя отследить, как и нельзя отследить обращения к этой переменной. Свойства же позволяют это реализовать. И всетаки, зачем нужны свойства? Почему бы вместо них не обойтись знакомыми процедурами и функциями? Предположим, наш класс должен иметь возможность выдавать стоимость часов и позволять эту стоимость изменять. Реализовать это проще простого: Public Price As Single Тогда обращение к этой переменной извне выглядит так: clk.Price = 500 'установить стоимость часов MsgBox clk.Price 'выдать стоимость часов Поставим задачу. Пользователь не должен иметь возможности установить цену ниже 150 и выше 800 долларов. Переменная с этим справиться неспособна. Берем на помощь процедуры и функции: Private m_Price As Single 'процедура получения цены Public Function GetPrice() As Single GetPrice = m_Price End Function 'процедура установки цены Public Sub SetPrice(a_Price As Single) If a_Price <= 800 And a_Price>= 150 Then m_Price = a_Price End Sub Можно так написать? Можно. Все будет работать, но возникает ощущение некоей громоздкости, нерациональности: clk.SetPrice 450 'установить стоимость часов MsgBox clk.GetPrice 'выдать стоимость часов И тут на помощь приходят свойства: Private m
to Padre: Спасибо! Страница: 1 |
Вопрос: По словечку, по словечку - вот и ответ...
Добавлено: 23.07.03 19:58
Автор вопроса: NovichoK
x As Long
y As Long
End Type
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End Type
Private Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public hJournalHook As Long, hAppHook As Long
Public SHptr As Long
Public Const WM_CANCELJOURNAL = &H4B
If nCode < 0 Then
JournalRecordProc = CallNextHookEx(hJournalHook, nCode, wParam, lParam)
Exit Function
End If
ResolvePointer(SHptr).FireEvent lParam
Call CallNextHookEx(hJournalHook, nCode, wParam, lParam)
End Function
If nCode < 0 Then
AppHookProc = CallNextHookEx(hAppHook, nCode, wParam, lParam)
Exit Function
End If
Dim msg As TMSG
CopyMemory msg, ByVal lParam, Len(msg)
Select Case msg.message
Case WM_CANCELJOURNAL
If wParam = 1 Then ResolvePointer(SHptr).FireEvent WM_CANCELJOURNAL
End Select
Call CallNextHookEx(hAppHook, nCode, wParam, ByVal lParam)
End Function
Dim oSH As cSystemHook
CopyMemory oSH, lpObj, 4&
Set ResolvePointer = oSH
CopyMemory oSH, 0&, 4&
End Function
Public Event MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
Public Event MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Public Event KeyDown(KeyCode As Integer, Shift As Integer)
Public Event KeyUp(KeyCode As Integer, Shift As Integer)
Public Event SystemKeyDown(KeyCode As Integer)
Public Event SystemKeyUp(KeyCode As Integer)
Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Private Declare Function GetAsyncKeyState% Lib "user32" (ByVal vKey As Long)
Private Const WM_KEYUP = &H101
Private Const WM_MOUSEMOVE = &H200
Private Const WM_LBUTTONDOWN = &H201
Private Const WM_LBUTTONUP = &H202
Private Const WM_LBUTTONDBLCLK = &H203
Private Const WM_RBUTTONDOWN = &H204
Private Const WM_RBUTTONUP = &H205
Private Const WM_RBUTTONDBLCLK = &H206
Private Const WM_MBUTTONDOWN = &H207
Private Const WM_MBUTTONUP = &H208
Private Const WM_MBUTTONDBLCLK = &H209
Private Const WM_MOUSEWHEEL = &H20A
Private Const WM_SYSTEMKEYDOWN = &H104
Private Const WM_SYSTEMKEYUP = &H105
Private Const WH_GETMESSAGE = 3
wMsg As Long
lParamLow As Long
lParamHigh As Long
msgTime As Long
hWndMsg As Long
End Type
If hJournalHook = 0 Then hJournalHook = SetWindowsHookEx(WH_JOURNALRECORD, AddressOf JournalRecordProc, App.hInstance, 0)
If hAppHook = 0 Then hAppHook = SetWindowsHookEx(WH_GETMESSAGE, AddressOf AppHookProc, App.hInstance, App.ThreadID)
SetHook = True
End Function
UnhookWindowsHookEx hAppHook
UnhookWindowsHookEx hJournalHook
End Sub
SHptr = ObjPtr(Me)
End Sub
If hJournalHook Or hAppHook Then RemoveHook
End Sub
Dim i%, j%, k%
Dim s As String
If lParam = WM_CANCELJOURNAL Then
hJournalHook = 0
SetHook
Exit Function
End If
CopyMemory EMSG, ByVal lParam, Len(EMSG)
Select Case EMSG.wMsg
Case WM_KEYDOWN
j = 0
If GetAsyncKeyState(vbKeyShift) Then j = (j Or 1) 'fixed by JJ
If GetAsyncKeyState(vbKeyControl) Then j = (j Or 2) 'fixed by JJ
If GetAsyncKeyState(vbKeyMenu) Then j = (j Or 4) 'fixed by JJ
s = Hex(EMSG.lParamLow)
k = (EMSG.lParamLow And &HFF)
RaiseEvent KeyDown(k, j)
s = Left$(s, 2) & Right$("00" & Hex(k), 2) 'fixed by JJ
EMSG.lParamLow = CLng("&h" & s)
CopyMemory ByVal lParam, EMSG, Len(EMSG)
Case WM_KEYUP
j = 0 'fixed by JJ
If GetAsyncKeyState(vbKeyShift) Then j
Ответы
Всего ответов: 3
Номер ответа: 1
Автор ответа:
Padre
ICQ: 346632205
Вопросов: 25
Ответов: 215
Web-сайт:
Профиль | | #1
Добавлено: 24.07.03 00:00
Номер ответа: 2
Автор ответа:
Calhoon
ICQ: 789764
Вопросов: 90
Ответов: 230
Web-сайт:
Профиль | | #2
Добавлено: 24.07.03 06:54
Слушай, Padre, ты хелпы не пробовал писать?
Номер ответа: 3
Автор ответа:
NovichoK
Вопросов: 72
Ответов: 147
Профиль | | #3
Добавлено: 24.07.03 12:13