Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: По словечку, по словечку - вот и ответ... Добавлено: 23.07.03 19:58  

Автор вопроса:  NovichoK

Помогите кто что знает!Разборак текста по словам...

В обычном модуле:

Type POINTAPI
        x As Long
        y As Long
End Type

Type TMSG
    hwnd As Long
    message As Long
    wParam As Long
    lParam As Long
    time As Long
    pt As POINTAPI
End Type

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes As Long)
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

Public Function JournalRecordProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  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

Public Function AppHookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   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

Private Function ResolvePointer(ByVal lpObj&) As cSystemHook
  Dim oSH As cSystemHook
  CopyMemory oSH, lpObj, 4&
  Set ResolvePointer = oSH
  CopyMemory oSH, 0&, 4&
End Function

В classmodule(заодно объясните зачем нужны классмлдули):

Public Event MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
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 SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
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_KEYDOWN = &H100
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_JOURNALRECORD = 0
Private Const WH_GETMESSAGE = 3

Private Type EVENTMSG
     wMsg As Long
     lParamLow As Long
     lParamHigh As Long
     msgTime As Long
     hWndMsg As Long
End Type

Dim EMSG As EVENTMSG

Public Function SetHook() As Boolean
   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

Public Sub RemoveHook()
   UnhookWindowsHookEx hAppHook
   UnhookWindowsHookEx hJournalHook
End Sub

Private Sub Class_Initialize()
  SHptr = ObjPtr(Me)
End Sub

Private Sub Class_Terminate()
  If hJournalHook Or hAppHook Then RemoveHook
End Sub

Friend Function FireEvent(ByVal lParam As Long)
  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-сайт: localhost
 Профиль | | #1
Добавлено: 24.07.03 00:00

Говоря о классах - вот один 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

Ответить

Номер ответа: 2
Автор ответа:
 Calhoon



ICQ: 789764 

Вопросов: 90
Ответов: 230
 Web-сайт: 4elovekssn.blog.ru
 Профиль | | #2
Добавлено: 24.07.03 06:54
Слушай, Padre, ты хелпы не пробовал писать?

Ответить

Номер ответа: 3
Автор ответа:
 NovichoK



Вопросов: 72
Ответов: 147
 Профиль | | #3 Добавлено: 24.07.03 12:13

to Padre:

Спасибо!

 

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам