Strona: [  << <   1   > >>  ]  z  1     
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:
Pierwszy
Drugi
_________
Trzeci

I 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, m
i 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ć


_____________________________________________
http://www.carbondesign.pl/ - rowery poziome, trójkołówce, handbike-i, tuning, akcesoria

28-05-2004 11:19
Pokaż profil andrey  Wyślij email do andrey   Odwiedź stronę andrey       3078613
karolinavb




Typ: neutral
Postów: 468
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 fragmenty

Pozdrawiam Karolina


_____________________________________________
Karolina

28-05-2004 16:31
Pokaż profil karolinavb  Wyślij email do karolinavb   
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


_____________________________________________
http://www.carbondesign.pl/ - rowery poziome, trójkołówce, handbike-i, tuning, akcesoria

29-05-2004 09:35
Pokaż profil andrey  Wyślij email do andrey   Odwiedź stronę andrey       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]


_____________________________________________
http://www.carbondesign.pl/ - rowery poziome, trójkołówce, handbike-i, tuning, akcesoria

29-05-2004 09:58
Pokaż profil andrey  Wyślij email do andrey   Odwiedź stronę andrey       3078613
karolinavb




Typ: neutral
Postów: 468
Zarejestrowany: Jan 2003

Część 1-sz NULL, nie będę się rozwijała tylko zacytuję z MSDN:

The Null Value
The 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 = Null

You can use the IsNull function to test if a Variant variable contains Null:

If IsNull(X) And IsNull(Y) Then
  Z = Null
Else
  Z = 0
End If

If 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 Long
End Type

Public Const MF_MENUBARBREAK = &H20& ' columns with a separator line
Public Const MF_MENUBREAK = &H40&    ' columns w/o a separator line
Public Const MF_STRING = &H0&
Public Const MF_HELP = &H4000&
Public Const MFS_DEFAULT = &H1000&

Public Const MIIM_ID = &H2
Public Const MIIM_SUBMENU = &H4
Public Const MIIM_TYPE = &H10
Public Const MIIM_DATA = &H20

Public 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
Pokaż profil karolinavb  Wyślij email do karolinavb   
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.wID

Co 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


_____________________________________________
http://www.carbondesign.pl/ - rowery poziome, trójkołówce, handbike-i, tuning, akcesoria

31-05-2004 23:46
Pokaż profil andrey  Wyślij email do andrey   Odwiedź stronę andrey       3078613
karolinavb




Typ: neutral
Postów: 468
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
Pokaż profil karolinavb  Wyślij email do karolinavb   
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 i
Dziekuje Karolino twoj sampel dziala swietnie tak jak mi mowi dziewczyna "Przestan sie uzalac" i przestalem pozostaje juz tylko ciekawosc


_____________________________________________
http://www.carbondesign.pl/ - rowery poziome, trójkołówce, handbike-i, tuning, akcesoria

01-06-2004 10:59
Pokaż profil andrey  Wyślij email do andrey   Odwiedź stronę andrey       3078613
karolinavb




Typ: neutral
Postów: 468
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
Pokaż profil karolinavb  Wyślij email do karolinavb   
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


_____________________________________________
http://www.carbondesign.pl/ - rowery poziome, trójkołówce, handbike-i, tuning, akcesoria

01-06-2004 11:45
Pokaż profil andrey  Wyślij email do andrey   Odwiedź stronę andrey       3078613
Wszystkich odpowiedzi: 9 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1