Menü Eintrag ändern

Deutschsprachiges X#-Forum – German language forum

Moderator: wriedmann

Post Reply
Frank Müßner
Posts: 276
Joined: Sat Dec 12, 2015 2:22 pm
Location: Germany

Menü Eintrag ändern

Post by Frank Müßner »

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
ecos
Posts: 91
Joined: Tue Nov 10, 2015 6:49 am
Location: Germany

Menü Eintrag ändern

Post by ecos »

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
Frank Müßner
Posts: 276
Joined: Sat Dec 12, 2015 2:22 pm
Location: Germany

Menü Eintrag ändern

Post by Frank Müßner »

Hi Karl,
danke, das hilft weiter!

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

Code: Select all

PUBLIC FUNCTION GetMenuItemCount(hMenu As PTR) As INT
in der Hilfe aber

Code: Select all

FUNCTION GetMenuItemCount(
	oMenu AS VOMenu
) AS LONG

Code: Select all

hMenu := omnuContext:Handle()
nItems := DWORD(GetMenuItemCount(hMenu))      -> 1  False

nItems := DWORD(omnuContext)     ->  error

nItems := ALen(omnuContext:items)     -> 12 OK
 

Grüße Frank
g.bunzel@domonet.de
Posts: 97
Joined: Tue Mar 01, 2016 11:50 am
Location: Germany

Menü Eintrag ändern

Post by g.bunzel@domonet.de »

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
User avatar
robert
Posts: 4264
Joined: Fri Aug 21, 2015 10:57 am
Location: Netherlands

Menü Eintrag ändern

Post by robert »

Frank,
Frank Müßner post=23664 userid=410 wrote: Ein Problem, was aber wohl für Robert und Chris ist.
Die Function GetMenuItemCount(hMenu) ist deklariert als:

Code: Select all

PUBLIC FUNCTION GetMenuItemCount(hMenu As PTR) As INT
in der Hilfe aber

Code: Select all

FUNCTION GetMenuItemCount(
	oMenu AS VOMenu
) AS LONG

Code: Select all

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
robert@xsharp.eu
Frank Müßner
Posts: 276
Joined: Sat Dec 12, 2015 2:22 pm
Location: Germany

Menü Eintrag ändern

Post by Frank Müßner »

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
Rolli
Posts: 8
Joined: Mon Jul 08, 2019 10:48 am

Re: Menü Eintrag ändern

Post by Rolli »

Hallo,

zuerst einmal die Frage : Gibt es noch ein VO-Forum, wo man seine Fragen stellen kann ?

Nun zum Thema "Menü".

Ich verwende verschiedene Context-Menus mit Bitmaps in meinen VO-Programmen. Die Bitmaps werden auch angezeigt. Wenn ich aber mit der Maus über ein Item fahre ist das Bitmap dieser Zeile verschwunden. Dies gilt für Treeviews und Listviews.

Im BBrowser werden sie überhaupt nicht angezeigt.

Was mache ich falsch ?

So ordne ich die Bitmaps zu :

oBitmap := bmpINS{}
SetMenuItemBitmaps(SELF:Handle() /* menu handle */, ;
IDM_LVMenue_Einfügen_Anzeigen_ID /* menu item */, ;
MF_BYCOMMAND /* menu item flags */, ;
oBitmap:Handle() /*handle of unchecked bitmap */, ;
oBitmap:Handle() /*unhandle OF unchecked bitmap */ )

Vorab vielen Dank

Rolf
Post Reply