Welcome, Guest
Username: Password: Remember me
Hier wird Deutsch gesprochen
  • Page:
  • 1

TOPIC:

Menü Eintrag ändern 06 Sep 2022 08:56 #23659

  • Frank Müßner
  • Frank Müßner's Avatar
  • Topic Author


  • Posts: 258
  • Moin,
    besteht die Möglichkeit von einem Menüeintrag den Text zu ändern? Ich möchte ein Menü vom BBrowser (Contextmenu), abhängig vom Zeileninhalt die Einträge/Text ändern lassen.
    Suche schon eine ganze Zeit, finde aber nichts.
    Grüße Frank

    Please Log in or Create an account to join the conversation.

    Menü Eintrag ändern 06 Sep 2022 09:25 #23661

    • ecos
    • ecos's Avatar


  • Posts: 39
  • Hallo Frank,

    so ganz grob zusammengenagelt und total ungetestet (in VO, nicht x#):

    CLASS MyBrowser INHERIT bBrowser

    METHOD GetContextMenu(iContextMenu AS INT) AS OBJECT PASCAL CLASS MyBrowser
    LOCAL omnuContext AS OBJECT
    LOCAL nItems AS DWORD
    LOCAL nPos AS DWORD
    LOCAL hMenu AS PTR
    LOCAL nId AS DWORD

    omnuContext := SUPER:GetContextMenu(iContextMenu)

    DO CASE
    CASE iContextMenu = BCM_DATA

    hMenu := omnuContext:Handle()
    nItems := DWORD(GetMenuItemCount(hMenu))
    FOR nPos := 1 UPTO nItems
    nId := GetMenuItemID(hMenu,LONG(nPos)-1)
    DO CASE
    CASE nId = 1
    ChangeMenuText(omnuContext,nId,"neuer Text 1")
    CASE nId = 2
    ChangeMenuText(omnuContext,nId,"neuer Text 2")
    ENDCASE
    NEXT nPos

    ENDCASE

    RETURN omnuContext

    FUNCTION ChangeMenuText(oMnu,nId,cNewText)
    LOCAL cOldText AS STRING
    LOCAL strcMII IS _winMENUITEMINFO
    LOCAL pszBuffer AS PSZ
    LOCAL hMenu AS PTR

    hMenu := oMnu:Handle()

    pszBuffer := MemAlloc(128)

    strcMII.cbsize := _SIZEOF(_winMENUITEMINFO)
    strcMII.fmask := MIIM_TYPE
    strcMII.fType := MFT_STRING
    strcMII.dwTypeData := pszBuffer
    strcMII.cch := 128

    GetMenuItemInfo(hMenu, nId, FALSE, @strcMII)

    cOldText := Mem2String(strcMII.dwTypeData,PszLen(strcMII.dwTypeData))

    MemFree(pszBuffer)

    pszBuffer := StringAlloc(cNewText)
    strcMII.fmask := MIIM_TYPE
    strcMII.fType := MFT_STRING
    strcMII.dwTypeData := pszBuffer
    strcMII.cch := PszLen(pszBuffer)

    SetMenuItemInfo(hMenu, nId, FALSE, @strcMII)

    MemFree(pszBuffer)

    RETURN cOldText

    Die Menü-Id's muss man dann halt wissen bzw. zuvor ermitteln.
    Vielleicht hilft's...

    Karl

    Please Log in or Create an account to join the conversation.

    Menü Eintrag ändern 06 Sep 2022 10:33 #23664

    • Frank Müßner
    • Frank Müßner's Avatar
    • Topic Author


  • Posts: 258
  • Hi Karl,
    danke, das hilft weiter!

    Ein Problem, was aber wohl für Robert und Chris ist.
    Die Function GetMenuItemCount(hMenu) ist deklariert als:
    PUBLIC FUNCTION GetMenuItemCount(hMenu As PTR) As INT

    in der Hilfe aber
    FUNCTION GetMenuItemCount(
    	oMenu AS VOMenu
    ) AS LONG
    hMenu := omnuContext:Handle()
    nItems := DWORD(GetMenuItemCount(hMenu))      -> 1  False
    
    nItems := DWORD(omnuContext)     ->  error
    
    nItems := ALen(omnuContext:items)     -> 12 OK


    Grüße Frank

    Please Log in or Create an account to join the conversation.

    Menü Eintrag ändern 06 Sep 2022 16:26 #23675

    • g.bunzel@domonet.de's Avatar


  • Posts: 83
  • Hallo Frank,

    beim bBrowser würde ich eher die Methode MenuInit() verwenden:

    METHOD MenuInit (oEvent) CLASS MyBrowserWindow
    // Event verwalten
    LOCAL oMenu AS Menu
    LOCAL iCol AS INT
    LOCAL sSpalte AS SYMBOL
    LOCAL cField AS STRING
    LOCAL lSuccess AS LOGIC

    // Beim ersten Aufruf enthält oEvent:Message den Wert WM_INITMENU und signalisiert, dass ein Menü geöffnet wurde.
    // Beim zweiten Aufruf enthält oEvent:Message den Wert WM_INITMENUPOPUP und signalisiert, dass es sich um ein
    // PopUpMenu handelt. Wenn das Menu weitere Untermenüs enthält, dann wird für jedes angezeigte Untermenü noch einmal
    // die CALLBACK-Methode MenuInit() aufgerufen. oEvent:Message enthält in diesem Fall dann den Wert WM_INITMENUPOPUP.

    SUPER:MenuInit(oEvent)

    IF oEvent:Message == WM_INITMENU

    oMenu := oEvent:Menu
    DO CASE
    CASE oMenu == SELF:oDCbBrowser:GetContextMenu(BCM_CAPTION) // Caption-Menü des Browser


    CASE oMenu == SELF:oDCbBrowser:GetContextMenu(BCM_DATA) // Data-Menü des Browser
    // Beispiel für Enable/Disable
    IF SELF:lUserEdit
    oMenu:EnableItem(IDM_mnuBrowser_MenuBrowser_Markierte_Daten_löschen_ID)
    ELSE
    oMenu:DisableItem(IDM_mnuBrowser_MenuBrowser_Markierte_Daten_löschen_ID)
    ENDIF
    iCol := SELF:oDCbBrowser:CurrentColumn // Die aktuelle Spalte des bBrowser
    IF Between(iCol, 1, SELF:oDCbBrowser:ColumnOpenCount)
    sSpalte := SELF:oDCbBrowser:GetOpenColumn(iCol):HyperLabel:NameSym
    // Die aktuelle Spalte ist bekannt - damit kann der Zeilen- bzw. Spalteninhalt für das Menü verwendet werden
    // In dem Menü wird ja bekannt sein, welche Zeile - und damit welche ID - im Menü verändert werden soll.
    // Dafür kann der ID-Eintrag verwendet werden - z.B. IDM_mnuBrowser_MenuBrowser_Autofilter_ID

    MenuChangeItem (oMenu, IDM_mnuBrowser_MenuBrowser_Autofilter_ID, "Mein neuer Menütext")
    ENDIF

    lSuccess := TRUE

    CASE oMenu == SELF:oDCbBrowser:GetContextMenu(BCM_FOOTER) // Footer-Menü des Browser

    CASE oMenu == SELF:oDCbBrowser:GetContextMenu(BCM_SELECTOR) // Selector-Menü des Browser

    ENDCASE
    oMenu := NULL_OBJECT

    ENDIF

    RETURN lSuccess

    FUNCTION MenuChangeItem (oMenu AS Menu, nID AS DWORD, cCaption AS STRING) AS LOGIC PASCAL
    LOCAL mii IS _winMENUITEMINFO
    LOCAL pNewText AS PTR
    LOCAL lRet := FALSE AS LOGIC

    IF nID > 0
    pNewText := MemAlloc(256)
    mii.cbSize := _SIZEOF(_winMENUITEMINFO)
    mii.fMask := MIIM_TYPE
    mii.fType := MFT_STRING
    mii.cch := 256
    mii.dwTypeData := pNewText
    IF GetMenuItemInfo(oMenu:Handle(), nID, FALSE, @mii)
    MemCopyString(pNewText, cCaption + _CHR(0), SLen(cCaption)+1)
    mii.cch := SLen(cCaption) + 1
    lRet := SetMenuItemInfo(oMenu:Handle(), nID, FALSE, @mii)
    ENDIF
    MemFree(pNewText)
    ENDIF

    RETURN lRet


    HTH

    Gerhard

    Please Log in or Create an account to join the conversation.

    Menü Eintrag ändern 06 Sep 2022 20:52 #23679

    • robert
    • robert's Avatar


  • Posts: 3178
  • Frank,

    Ein Problem, was aber wohl für Robert und Chris ist.
    Die Function GetMenuItemCount(hMenu) ist deklariert als:
    PUBLIC FUNCTION GetMenuItemCount(hMenu As PTR) As INT

    in der Hilfe aber
    FUNCTION GetMenuItemCount(
    	oMenu AS VOMenu
    ) AS LONG
    hMenu := omnuContext:Handle()
    nItems := DWORD(GetMenuItemCount(hMenu))      -> 1  False
    
    nItems := DWORD(omnuContext)     ->  error
    
    nItems := ALen(omnuContext:items)     -> 12 OK
    It may sound strange, but both versions are ok:
    - The prototype that you show is from the Win32Apilibrary. We have not included this library in the help because it would generate a lot of contents.
    - The function in the help is from the new GUI library. This library has no reference to the Win32API library so it needs its own function.

    Robert
    XSharp Development Team
    The Netherlands

    Please Log in or Create an account to join the conversation.

    Last edit: by robert.

    Menü Eintrag ändern 07 Sep 2022 11:25 #23686

    • Frank Müßner
    • Frank Müßner's Avatar
    • Topic Author


  • Posts: 258
  • Hi Gerhard,

    danke für den Hinweis. Werde mir das ansehen. Hab bis jetzt gar nicht mitbekommen, dass der BBrowser verschiedene Menüs haben kann :-)

    @Robert
    thanks for the explanation

    Frank

    Please Log in or Create an account to join the conversation.

    • Page:
    • 1
    Moderators: wriedmann