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
Moderator: wriedmann
Menü Eintrag ändern
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
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
-
- Posts: 280
- Joined: Sat Dec 12, 2015 2:22 pm
- Location: Germany
Menü Eintrag ändern
Hi Karl,
danke, das hilft weiter!
Ein Problem, was aber wohl für Robert und Chris ist.
Die Function GetMenuItemCount(hMenu) ist deklariert als:
in der Hilfe aber
Grüße Frank
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
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
-
- Posts: 97
- Joined: Tue Mar 01, 2016 11:50 am
- Location: Germany
Menü Eintrag ändern
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
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
Frank,
- 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
It may sound strange, but both versions are ok: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:in der Hilfe aberCode: Select all
PUBLIC FUNCTION GetMenuItemCount(hMenu As PTR) As INT
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
- 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
The Netherlands
robert@xsharp.eu
-
- Posts: 280
- Joined: Sat Dec 12, 2015 2:22 pm
- Location: Germany
Menü Eintrag ändern
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
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
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
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