Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: Wywoływanie procedur (TO NIE POWTÓRKA!)
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004
Wywoływanie procedur (TO NIE POWTÓRKA!)

Jak wywołać procedurę mając jej adres?


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

29-12-2004 18:47
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

a jak pobierasz adres ? - tak spytam


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

29-12-2004 19:17
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Tym się będę martwił, gdy będzie potrzebne.

Jest w VB takie słowo kluczowe... AddressOf . Co prawda działa tylko z funkcjami i procedurami deklarowanymi przez instrukcję Declare, ale podobno potrzeba jest matką wynalazków - więc coś wykombinuję. Mam już nawet pewien pomysł...


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

29-12-2004 23:12
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

No co do AddressOf to czasami używam tyle, że do funkcji (procedury) odwołuję się za pomocą funkcji API SetWindowLong

[Post edytowany dnia 30-12-2004 00:15 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

30-12-2004 00:11
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

I właśnie taki jest mój pomysł... Ale najpierw muszę wiedzieć, jak wywołać procedurę spod tego adresu...

BTW: adres procedury podaje się także w wielu innych funkcjach

[Post edytowany dnia 30-12-2004 10:55 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

30-12-2004 10:53
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Hmmmm - procedura jest wywoływana automatycznie gdy pojawi się jakiekolwiek zdarzenie związane z aplikacją (obojętnie jakie) - też zależy jakiej stałej użyłeś w funkcji SetWindowLong

Wklej to w kodzie formy:

Private Sub Form_Load()
    SubClass Me
End Sub
Private Sub Form_Unload(Cancel As Integer)
    UnSubClass Me
End Sub


W Module

Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_COMMAND = &H111
Public Const BN_CLICKED = 0
Dim PrevProc As Long
Public Sub SubClass(F As Form)
    PrevProc = SetWindowLong(F.hwnd, GWL_WNDPROC, AddressOf WindowProc)
End Sub
Public Sub UnSubClass(F As Form)
    SetWindowLong F.hwnd, GWL_WNDPROC, PrevProc
End Sub
Public Function WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    WindowProc = CallWindowProc(PrevProc, hwnd, uMsg, wParam, lParam)
    If uMsg = WM_COMMAND Then
        Select Case (wParam  &H10000) And &HFFFF&
            Case BN_CLICKED
                MsgBox "Klik "
        End Select
    End If
End Function


Dodaj do formy buttona - odpal i kiknij go

[Post edytowany dnia 30-12-2004 12:30 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

30-12-2004 12:17
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

No tak.. ale ja potrzebuję sposobu na wywolanie procedury po adresie, a nie informacji o zamienianiu WinProc na inną funkcję .

Poza tym coś mi sie musiało poplątać - przecież AddressOf nie działa tylko z funkcjami deklarowanymi przez Declare... więc nie będe się musiał gimnastykować, żeby uzyskać adres procedury. Teraz posostaje pytanie - jak procedurę spod tego adrsu wywołać?

Przenoszenie kodu procedury wywoływanej do innej (wczesniej przygotowanej) procedury także nie jest najlepszym rozwiązaniem - trudno wyczuć, jaki będzie to miało wpływ na działanie programu (w końcu aplikacje VB mają dość nietypową konstrukcję) i na dodatek nie wiadomo ile tak naprawdę trzeba przekopiować.. a co będzie, jeśli procedura stanowiąca podkład będzie krótsza od wywoływanej?

[Post edytowany dnia 30-12-2004 12:59 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

30-12-2004 12:45
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Pytanie: czy da się to w ogóle zrobić z poziomu VB

Z tego co widzę to adres funkcji jest wykorzystywany do tego aby funkcja działała jako EventHandler

Moze zajrzyj jeszcze tutaj :http://www.ftponline.com/archives/premier/mgznarch/vbpj/2000/02feb00/mc0200/mc0200.asp

[Post edytowany dnia 30-12-2004 13:59 przez DJK]


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

30-12-2004 13:41
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Byłem tam już wcześniej, ale dopiero teraz zauważyłem, że nie jest to opis do jakiejś biblioteki . Dzięki.


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

30-12-2004 14:36
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
DJK



Typ: neutral
Postów: 871
Zarejestrowany: Feb 2004

Nie wiem czy zauważyłeś link do całego kodu - po prawej


_____________________________________________
Jeśli można coś zrobić w sposób optymalny to czemu nie

30-12-2004 15:08
Pokaż profil DJK  Wyślij email do DJK   Odwiedź stronę DJK  
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Nie, nie zauważyłem - wziąłem go za banner reklamowy - wygląda tak samo . Dzięki za zwrócenie uwagi. Co prawda nie jest to nadal to, o co mi chodziło, ale już jestem bliżej


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

30-12-2004 18:16
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
Wszystkich odpowiedzi: 10 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1