Autor Temat: GetMenuItemInfo - problem z wyciagnieciem nazwy pozycji menu
andrey Łódź
Typ: neutral Postów: 295 Zarejestrowany: Mar 2003
GetMenuItemInfo - problem z wyciagnieciem nazwy pozycji menu Najpierw wyjaśnie o co mi chodzi mam menu np. takie:PierwszyDrugi_________TrzeciI chce wyciagnać klikajac na jakaś pozycję w menu text tej pozycji np.: Klikam na pozycje 1 i wyciagam nazwę "Pierwszy"Korzystam więc z API GetMenuItemInfo w taki sposób:' W pozycji wykrywajacej kliknięcie danej pozyci menu piszę:Dim m AS MENUITEMINFO m.cbSize = Len(m) m.fMask = MIIM_STRING GetMenuItemInfo hMenu, 1, True, mi problem jest następujący powino mi to pomoc wyciagnac włąsnie łańcuch znaków "Pierwszy" ale wyciaga ""otrzymuje wtedy w m.dwTypeData = "" Co z tym fantem zrobić _____________________________________________A Methodical Approach to Error Handling: On Error GoTo Hell
28-05-2004 11:19
3078613
karolinavb
Typ: neutral Postów: 467 Zarejestrowany: Jan 2003
Popatrz na stronę http://support.microsoft.com/default.aspx?scid=kb;EN-US;q216185 -"HOWTO: Create Multi-Column Menus in Visual Basic Using the WIN32 API", chociaż temat inny ale taki fragment tam jest.Wzięłam kawałki kodu z tej strony i uruchomiłam na przykładzie o którym rozmawialiśmy i chodzi dobrze, może porównaj odpowiednie fragmentyPozdrawiam Karolina _____________________________________________Karolina
28-05-2004 16:31
andrey Łódź
Typ: neutral Postów: 295 Zarejestrowany: Mar 2003
Dziękuje Karolino bardzo ciekawy przykład Nawet się nie domyślałem że można podzielić menu w pionie hmmm zastosowali do tego funkcje GetmenuItemInfo zobaczymy czy i mnie to cos pomoze. Jak cos sie zmieni napisze Pozdrawiam Rycerz w srebrnej zbroi Andrzej _____________________________________________A Methodical Approach to Error Handling: On Error GoTo Hell
29-05-2004 09:35
3078613
andrey Łódź
Typ: neutral Postów: 295 Zarejestrowany: Mar 2003
No to zaczyna mnie draznic wiesz chce sam znalezc swoj sposob na rozwiazanie tego problemu a juz nie wiem co jest ze nie chce dzialac Zerknij na to:Dim m As MENUITEMINFO Dim bufor As String * 80 bufor = Space(80) With m .cbSize = Len(m) .dwTypeData = bufor & Chr(0) .fMask = MIIM_TYPE .fType = MFT_STRING .cch = Len(m.dwTypeData) .fState = MFS_DEFAULT End With GetMenuItemInfo hMenu, 1, True, m W jednym z opsiow jakie znalazlem do tej funkcji przeczytalem ze zeby wyciagnac nazwe pola nalezy funkcje wywolac dwa razy za pierwszym razem dac .dwTypeData wartosc Null wywolac GetMenuItemInfo potem ustawic miejsce w cch i znow wywolac funkcje GetMenuItemInfo i wtedy powinno ruszyc Co ty na to?A teraz pytanie najglpsze jak sie nadaje wartosc Null Jest to chyba rzecz najprostsza a w tej chwili niemoge sobie przypomniec [Post edytowany dnia 29-05-2004 09:59 przez andrey]_____________________________________________A Methodical Approach to Error Handling: On Error GoTo Hell
29-05-2004 09:58
3078613
karolinavb
Typ: neutral Postów: 467 Zarejestrowany: Jan 2003
Część 1-sz NULL, nie będę się rozwijała tylko zacytuję z MSDN:The Null ValueThe Variant data type can contain another special value: Null. Null is commonly used in database applications to indicate unknown or missing data. Because of the way it is used in databases, Null has some unique characteristics: Expressions involving Null always result in Null. Thus, Null is said to "propagate" through expressions; if any part of the expression evaluates to Null, the entire expression evaluates to Null.Passing Null, a Variant containing Null, or an expression that evaluates to Null as an argument to most functions causes the function to return Null.Null values propagate through intrinsic functions that return Variant data types. You can also assign Null with the Null keyword:Z = NullYou can use the IsNull function to test if a Variant variable contains Null:If IsNull(X) And IsNull(Y) Then Z = NullElse Z = 0End IfIf you assign Null to a variable of any type other than Variant, a trappable error occurs. Assigning Null to a Variant variable doesn't cause an error, and Null will propagate through expressions involving Variant variables (though Null does not propagate through certain functions). You can return Null from any Function procedure with a Variant return value.Variables are not set to Null unless you explicitly assign Null to them, so if you don't use Null in your application, you don't have to write code that tests for and handles it.Część 2.Skopiowałam Twój fragment do wspomnianego w poprzednim poście projektu, u mnie chodzi poprawnie, wobec tego przesyłam tylko fragment dotyczący samych deklaracji może tam masz coś źle, jeśli nie mogę wysłać znowu maila z tym całym "niezwykle przecudnej urody" przykładem.*****************Public Type MENUITEMINFO cbSize As Long fMask As Long fType As Long fState As Long wID As Long hSubMenu As Long hbmpChecked As Long hbmpUnchecked As Long dwItemData As Long dwTypeData As String cch As LongEnd TypePublic Const MF_MENUBARBREAK = &H20& ' columns with a separator linePublic Const MF_MENUBREAK = &H40& ' columns w/o a separator linePublic Const MF_STRING = &H0&Public Const MF_HELP = &H4000&Public Const MFS_DEFAULT = &H1000&Public Const MIIM_ID = &H2Public Const MIIM_SUBMENU = &H4Public Const MIIM_TYPE = &H10Public Const MIIM_DATA = &H20Public Declare Function GetMenuItemInfo Lib "user32" _ Alias "GetMenuItemInfoA" _ (ByVal hMenu As Long, ByVal un As Long, ByVal B As Boolean, _ lpMenuItemInfo As MENUITEMINFO) As Long*****************************Pozdrawiam Karolina _____________________________________________Karolina
29-05-2004 10:52
andrey Łódź
Typ: neutral Postów: 295 Zarejestrowany: Mar 2003
Powoli zaczynam sie zalamywac ale prawdziwy mezczyzna nie placze Ponizej moj fragment kodu uzylem takich samych deklaracji a i tak nie moge wydobyc tego co jest napisane na pierwszej pozycji menu Dim m As MENUITEMINFO Dim bufor As String * 80 bufor = Space(80) With m .cbSize = Len(m) .dwTypeData = bufor & Chr(0) .fMask = MIIM_ID Or MIIM_DATA Or MIIM_TYPE Or MIIM_SUBMENU .fType = MFT_STRING .cch = Len(m.dwTypeData) .fState = MFS_DEFAULT End With Call GetMenuItemInfo(hMenu, 1, True, m) "<<== tutaj zmienilem z GetMenuItemInfo hMenu, 1, true, m Debug.Print m.cbSize ' tylko ta wartosc pozostaje Debug.Print m.cch ' reszta oprocz kilku mi nie potzrebnych Debug.Print m.dwItemData ' daje wartosci zero Debug.Print m.dwTypeData ' lub tak jak ta "" Debug.Print m.fMask ' gdy sprawdzam dzialanie programu krok po kroku przy uzyciu breakpointow Debug.Print m.fState ' okazuje sie ze po wywolaniu Debug.Print m.fType ' funkcji GetMenuItemInfo Debug.Print m.hbmpChecked ' przerazajaca wiekszosc pokazuje mi Object variable or With block not set Debug.Print m.hbmpUnchecked Debug.Print m.hSubMenu Debug.Print m.wIDCo takiego robie zle? Karolino jezeli ty wydobywasz pierwsza pozycje menu to co jest w niej napisane to wyslij mi ten przkladzik znowu Dzieki z gory i przepraszam za klopot Ale chce miec poczucie ze samemu udalo mi sie rozwiazac dany problem a tu idzie jak krew z nosa _____________________________________________A Methodical Approach to Error Handling: On Error GoTo Hell
31-05-2004 23:46
3078613
karolinavb
Typ: neutral Postów: 467 Zarejestrowany: Jan 2003
Andrzejku szkoda czasu na tzw. "poczucie", mój kolega mówi zwykle "...(brzydkie słowo) bo co będę tracił czas, skoro ktoś to już zrobił, dlatego wymyślili Internet...", wysyłam, ale najpierw wstawię Twoje fragmenty...Pozdrawiam Karolina _____________________________________________Karolina
01-06-2004 08:24
andrey Łódź
Typ: neutral Postów: 295 Zarejestrowany: Mar 2003
Karolino zaspokoj moja ciekawosc dlaczego poprawnie odczytywane jest menu przez funkcje GetMenuItemInfo jezeli do m ładujemy wszystkie elementy a nie moge wydobyc tego info dla pojedynczego konkretnego elementu ale dla innych sledzacych nasze wypowiedzi wstawiam ten kawalek kodu moze komus pomoze:Dim m As MENUITEMINFO Dim s As Integer s = GetMenuItemCount(hMenu) - 1 For i = 0 To s bufor = Space(80) With m .cbSize = Len(m) .dwTypeData = bufor & Chr(0) .fMask = MIIM_TYPE .fType = MF_STRING .cch = Len(m.dwTypeData) .fState = MFS_DEFAULT End With Call GetMenuItemInfo(hMenu, i, True, m) With m Debug.Print .cbSize Debug.Print .cch Debug.Print .dwItemData Debug.Print .dwTypeData Debug.Print .fMask Debug.Print .fState Debug.Print .fType Debug.Print .hbmpChecked Debug.Print .hbmpUnchecked Debug.Print .hSubMenu Debug.Print .wID End With Next iDziekuje Karolino twoj sampel dziala swietnie tak jak mi mowi dziewczyna "Przestan sie uzalac" i przestalem pozostaje juz tylko ciekawosc _____________________________________________A Methodical Approach to Error Handling: On Error GoTo Hell
01-06-2004 10:59
3078613
karolinavb
Typ: neutral Postów: 467 Zarejestrowany: Jan 2003
Nie wszystkie Andrzejku tylko: .dwTypeData = bufor & Chr(0) .cch = Len(mnuItemInfo.dwTypeData) oczywiście przy takiej deklaracji buffor (stały rozmiar), w przeciwnym wypadku, gdy w tej strukturze nie "oświeżysz" powyższych parametrów, "nie ma miejsca" na nowe dane (C++), rozmiar się nie zgadza (cch "jest za małe", jeśli można tak powiedzeć). Bardzo prosto się o tym przekonasz jeśli w moim przykładzie usuniesz te linijki i wielokrotnie przyciśniesz klawisz "PokazItem", czy jak on się tam nazywa, możesz wówczas zobaczyć jak dłuższy napis po krótszym się nie mieści i jest to zjawisko "postępujące".Nie wiem czy precyzyjnie się wyraziłam, ale wiesz chyba o co chodzi...Pozdrawiam Karolina _____________________________________________Karolina
01-06-2004 11:27
andrey Łódź
Typ: neutral Postów: 295 Zarejestrowany: Mar 2003
Dziękuje wykład został zrozumiany i przyswojony Chyba wątek z wyciąganiem pozycji z menu jest już zamknięty a inni czytając to co zostało tu napisane napewno sobie poradzą mając podobny problem Wielkie Dzięki Pozdrawiam Andrzej _____________________________________________A Methodical Approach to Error Handling: On Error GoTo Hell
01-06-2004 11:45
3078613
Wszystkich odpowiedzi: 9 :: Maxymalnie na stronę: 20