xsharp.eu • Menü Eintrag ändern
Page 1 of 1

Menü Eintrag ändern

Posted: Tue Sep 06, 2022 6:56 am
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

Menü Eintrag ändern

Posted: Tue Sep 06, 2022 7:25 am
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

Menü Eintrag ändern

Posted: Tue Sep 06, 2022 8:33 am
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

Menü Eintrag ändern

Posted: Tue Sep 06, 2022 2:26 pm
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

Menü Eintrag ändern

Posted: Tue Sep 06, 2022 6:52 pm
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

Menü Eintrag ändern

Posted: Wed Sep 07, 2022 9:25 am
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

Re: Menü Eintrag ändern

Posted: Fri Jan 05, 2024 12:14 pm
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