User Tools

Site Tools


k13:k13.4:start

13.4 Context menu

A special type of menu is the context menu as a pop-up menu. The context is a visible component. This means that the pop-up menu only refers to this component. A menu only becomes a context menu when it is assigned to a special context menu. If you use the menu editor, you can define a list of different menus and assign them to individual components in the source code - ComboBox and PictureBox in this case - as context menus:

Public Sub ComboBox1_Menu() 
  mnuCombobox1.Popup 
End ' ComboBox1_Menu() 
 
Public Sub PictureBox1_Menu()  
  mnuPictureBox1.Popup
End ' PictureBox1_Menu()

You save these 2 statements if you already make the assignment in the object inspector with the' PopupMenu' property from the list of defined menus offered there.

The context menu opens after right-clicking over the component at the position of the mouse pointer. A context menu contains a list of menus that trigger a subroutine call after clicking with the left mouse button. You can create and configure the context menu at design time in the menu editor or encode it in the source code. You can equip the following components with a context menu:

Button, ButtonBox, CheckBox, CheckBox, ColorButton, ColorChooser, ColumnView, ComboBox, ComboBox, Container, Control, DateBox, DateChooser, Dial, DirChooser, DirView, DrawingArea, Editor, Embedder, Expander, FileChooser, FileView, FontChooser, Form, Frame, GridView, HBox, HPanel, HSplit, HSplit

Good to know:
For example, if you use the TextArea_Menu() and mnuContextTextArea.Popup event to declare a context menu for a TextArea, the original is overwritten as shown in the following two images:

KontextMemü-Original

Figure 13.4.1: Context menu TextArea - Original

Benutzer-Menü

Figure 13.4.2: TextArea context menu - user-defined

You can not only overwrite context menus of selected components with your own menus, but you can also deactivate the context menu in general. The following code is used here for the (fictitious) component TextArea3:

Public Sub TextArea3_Menu() 
  Stop Event 
End 

13.4.1 Project

In the presented project, the original context menu of the two components 'TextArea' is replaced by a user-defined, simple context menu. At the same time, the use of the ClipBoard class is demonstrated by copying or cutting text from the TextArea1 and pasting it into the TextArea2. You can also view the type (text format) of the inserted text after a copy operation. A violent click on the reset button (R) restores the start state of the program.

ClipBoard1

Figure 13.4.1.1: ClipBoard is empty {link_3}

Figure 13.4.1.2: Marked text is copied to the ClipBoard - context menu1

O.K.

Figure 13.4.1.3: Contents of the ClipBoard can be inserted into the TextArea2 - Context menu2

Inhalt

Figure 13.4.1.4: Contents of the ClipBoard was inserted into the TextArea2

13.4.2 Project source code

The source text is completely specified and only commented on in selected parts, because the comments in the source text already show essential information:

[1] ' Gambas class file 
[2] 
[3] Private sText As String 
[4] 
[5] Public Sub Form_Open() 
[6]   
[7]   FMain.Center 
[8]   FMain.Resizable = False 
[9]   sText = "Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming " 
[10]   sText &= "id quod mazim placeratfacer possim assum. Lorem ipsum dolor sit amet, consectetuer " 
[11]   sText &= "adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna " 
[12]   sText &= "aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation " 
[13]   sText &= "ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat." 
[14]   TextArea1.Text = sText 
[15]   TextArea1.Wrap = True 
[16]   TextArea2.Wrap = True 
[17]   
[18] End ' Form_Open 
[19] 
[20] Public Sub TextArea1_Menu() 
[21] 
[22]   Dim mnuContextTextArea1 As Menu 
[23]   Dim mnuMenuItem As Menu 
[24] 
[25] ' Es wird ein neues Menü-Objekt für die Textarea1 erzeugt 
[26]   mnuContextTextArea1 = New Menu(FMain, False) 
[27] ' 1. Menü im Menü1 der Komponente TextArea1 
[28]   mnuMenuItem = New Menu(mnuContextTextArea1) As "mnuSelectAll" 
[29]   mnuMenuItem.Text = "Select all and copy all text to clipboard" 
[30]   mnuMenuItem.Picture = Stock["select"] 
[31] ' 2. Menü im Menü1 
[32]   mnuMenuItem = New Menu(mnuContextTextArea1) As "mnuSelectedCopy" 
[33]   mnuMenuItem.Text = "Copy selected text to clipboard" 
[34]   mnuMenuItem.Picture = Stock["copy"] 
[35] ' 3. Menü im Menü1 
[36]   mnuMenuItem = New Menu(mnuContextTextArea1) As "mnuSelectedCut" 
[37]   mnuMenuItem.Text = "Cut selected text" 
[38]   mnuMenuItem.Picture = Stock["cut"] 
[39] 
[40]   mnuContextTextArea1.Popup ' Das Menü1 wird der TextArea_1 als PopUp-Menü zugewiesen
[41]   
[42] ' Ein Nachteil dieser Vorgehensweise, jedem Menüeintrag den Bezeichner mnuMenuItem zu geben, soll
[43] ' nicht verschwiegen werden: Es ist im Programm nicht möglich, einzelne Menü-Eigenschaften 
[44] ' zur Laufzeit gezielt zu ändern. Beim Einsatz des Menü-Editors  entfällt der Nachteil.
[45] 
[46] End ' TextArea1_Menu 
[47] 
[48] ' Hier werden jetzt die 3 Aktionen programmiert, die ausgelöst werden, 
[49] ' wenn das entsprechende Menü im Kontextmenü der TextArea1 ausgewählt wurde. 
[50] 
[51] ' Menü 1 - Komponente TextArea1 
[52] Public Sub mnuSelectAll_Click() 
[53]   TextArea1.SelectAll() 
[54]   TextArea2.Clear 
[55]   If TextArea1.Selection.Text <> Null Then 
[56]      Clipboard.Copy(TextArea1.Text) 
[57]    ' Alternative: TextArea1.Copy() 
[58]   Endif ' TextArea1.Selection.Text <> Null 
[59] End ' mnuSelectAll_Click 
[60] 
[61] ' Menü 2 - Komponente TextArea1 
[62] Public Sub mnuSelectedCopy_Click() 
[63]   If TextArea1.Selection.Text <> Null Then 
[64]      TextArea2.Clear 
[65]      Clipboard.Copy(TextArea1.Selection.Text) 
[66]   ' Alternative: TextArea1.Copy() 
[67]   Endif ' TextArea1.Selection.Text <> Null 
[68] End ' mnuSelectedCopy_Click 
[69] 
[70] ' Menü 3 - Komponente TextArea1 
[71] Public Sub mnuSelectedCut_Click() 
[72]   If TextArea1.Selection.Text <> Null Then 
[73]      TextArea2.Clear 
[74]      Clipboard.Copy(TextArea1.Selection.Text) 
[75]      TextArea1.Cut() 
[76]   Endif ' TextArea1.Selection.Text <> Null 
[77] End ' mnuSelectedCopy_Click 
[78] 
[79] Public Sub TextArea2_Menu() 
[80]   Dim mnuContextTextArea2 As Menu 
[81]   Dim mnuP2T As Menu 
[82]   
[83] ' Es wird ein neues Menü-Objekt für die Textarea2 erzeugt 
[84]   mnuContextTextArea2 = New Menu(FMain, False) 
[85] ' Ein Menü im Menü2 der Komponente TextArea2 anlegen  
[86]   mnuP2T = New Menu(mnuContextTextArea2) As "mnuPasteToTextArea2" 
[87]   mnuP2T.Text = "Paste from ClipBoard" 
[88]   mnuP2T.Picture = Stock["paste"] 
[89]   
[90]   If Clipboard.Type = Clipboard.Text Then 
[91]      mnuContextTextArea2.Popup ' Das Menü2 wird der TextArea_2 als PopUp-Menü zugewiesen (aktiv)
[92]   Else 
[93]     mnuP2T.Enabled = False 
[94]     mnuContextTextArea2.Popup ' Das Menü2 wird der TextArea_2 als PopUp-Menü zugewiesen (nicht aktiv)
[95]   Endif ' Clipboard.Type = Clipboard.Text 
[96] 
[97] End ' TextArea2_Menu
[98] 
[99]   Public Sub mnuPasteToTextArea2_Click() 
[100] ' Hier wird die eine Aktion programmiert, die ausgelöst wird,   
[101] ' wenn das eine Menü im Kontextmenü der TextArea2 ausgewählt wurde. 
[102]   TextArea2.Insert(Clipboard.Paste("text/plain")) 
[103] End ' mnuPasteToTextArea2_Click 
[104] 
[105] Public Sub btnFormats_Click() 
[106]   Dim sElement As String 
[107] 
[108]   TextArea2.Clear 
[109]   For Each sElement In Clipboard.Formats 
[110]     TextArea2.Insert(sElement & gb.NewLine) 
[111]   Next ' sElement 
[112] 
[113] End ' btnFormats_Click 
[114] 
[115] Public Sub btnReset_Click() 
[116]   Clipboard.Clear 
[117]   TextArea2.Clear 
[118]   TextArea1.Text = sText 
[119]   TextArea1.SetFocus 
[120] End ' Reset 
[121] 
[122] Public Sub btnClose_Click() 
[123]   If Not Clipboard.Type = Clipboard.None Then Clipboard.Clear 
[124]   FMain.Close 
[125] End ' btnClose

Comment:

  • In lines 20 to 46 a menu1 (line20) with 3 menus is created and assigned in line 40 of the component TextArea1 as context menu.
  • In lines 79 to 97, analogous actions are performed for the TextArea2 component, but in this case only with one menu, depending on the contents of the ClipBoard, the menu is set to active or inactive.
  • The copied text or cut text selected in TextArea1 is inserted into TextArea2 in the default text format 'text/plain' - line 102.

13.4.3 Download

13.4 Kontext-Menü

Eine besondere Form eines Menüs ist das Kontextmenü als PopUp-Menü. Der Kontext ist ein sichtbare Komponente. Das bedeutet, dass das PopUp-Menü sich nur auf diese Komponente bezieht. Ein Menü wird erst durch eine spezielle Zuweisung zu einem Kontextmenü. Wenn Sie den Menü-Editor verwenden, dann können Sie eine Liste von unterschiedlichen Menüs definieren und diese im Quelltext einzelnen Komponenten – hier ComboBox und PictureBox – als Kontextmenü zuweisen:

Public Sub ComboBox1_Menu() 
  mnuCombobox1.Popup 
End ' ComboBox1_Menu() 
 
Public Sub PictureBox1_Menu()  
  mnuPictureBox1.Popup
End ' PictureBox1_Menu()

Diese 2 Anweisungen sparen Sie ein, wenn Sie die Zuweisung bereits im Objektinspektor bei der Eigenschaft 'PopupMenu' aus der dort angebotenen Liste definierter Menüs vornehmen.

Das Kontextmenü öffnet sich nach einem Klick mit der rechten Maustaste über der Komponente an der Position des Mauszeigers. Ein Kontextmenü enthält eine Liste von Menüs, die nach einem Klick mit der linken Maustaste einen Unter-Programmaufruf auslösen. Sie können das Kontextmenü zur Entwurfszeit im Menü-Editor anlegen und konfigurieren oder es im Quelltext codieren. Folgende Komponenten können Sie mit einem Kontextmenü ausrüsten:

Button, ButtonBox, CheckBox, ColorButton, ColorChooser, ColumnView, ComboBox, Container, Control, DateBox, DateChooser, Dial, DirChooser, DirView, DrawingArea, Editor, Embedder, Expander, FileChooser, FileView, FontChooser, Form, Frame, GridView, HBox, HPanel, HSplit, IconPanel, IconView, LCDNumber, Label, ListBox, ListContainer, ListView, MaskBox, MenuButton, MovieBox, Panel, PictureBox, ProgressBar, RadioButton, ScrollArea, ScrollBar, ScrollView, Separator, SidePanel, Slider, SpinBox, TabPanel, TabStrip, TableView, TextArea, TextBox, TextEdit, TextLabel, ToggleButton, ToolButton, ToolPanel, TrayIcon, TreeView, UserContainer, UserControl, VBox, VPanel, VSplit, ValueBox, Window, Wizard, _IconPanelContainer, _TabPanelContainer, _WizardContainer.

Gut zu wissen:
Wenn Sie zum Beispiel über das Ereignis TextArea_Menu() und mnuContextTextArea.Popup ein Kontextmenü für eine TextArea deklarieren, dann wird das Original überschrieben, wie die beiden folgenden Bilder zeigen:

KontextMemü-Original

Abbildung 13.4.1: Kontextmenü TextArea – Original

Benutzer-Menü

Abbildung 13.4.2: Kontextmenü TextArea – benutzerdefiniert

Sie können Kontextmenüs von ausgewählten Komponenten nicht nur mit eigenen Menüs überschreiben, sondern das Kontextmenü auch generell abschalten. Dazu wird folgender Code eingesetzt – hier für die (fiktive) Komponente TextArea3:

Public Sub TextArea3_Menu() 
  Stop Event 
End 

13.4.1 Projekt

Im vorgestellten Projekt wird das originale Kontextmenü der zwei Komponenten 'TextArea' jeweils durch ein benutzerdefiniertes, einfaches Kontextmenü ersetzt. Gleichzeitig wird der Einsatz der Klasse ClipBoard demonstriert, indem Text aus der TextArea1 kopiert oder ausgeschnitten wird, um dann in die TextArea2 eingefügt zu werden. Außerdem können Sie sich nach einem Kopiervorgang den Typ (Textformat) des eingefügten Textes ansehen. Ein heftiger Klick auf den Reset-Knopf (R) stellt den Startzustand des Programms wieder her.

ClipBoard1

Abbildung 13.4.1.1: Das ClipBoard ist leer

Text

Abbildung 13.4.1.2: Markierter Text wird in das ClipBoard kopiert – Kontextmenü1

O.K.

Abbildung 13.4.1.3: Inhalt des ClipBoards kann in die TextArea2 eingefügt werden – Kontextmenü2

Inhalt

Abbildung 13.4.1.4: Inhalt des ClipBoards wurde in die TextArea2 eingefügt

13.4.2 Projekt-Quelltext

Der Quelltext wird vollständig angegeben und nur in ausgewählten Teilen kommentiert, weil die Kommentare im Quelltext bereits Wesentliches zeigen:

[1] ' Gambas class file 
[2] 
[3] Private sText As String 
[4] 
[5] Public Sub Form_Open() 
[6]   
[7]   FMain.Center 
[8]   FMain.Resizable = False 
[9]   sText = "Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming " 
[10]   sText &= "id quod mazim placeratfacer possim assum. Lorem ipsum dolor sit amet, consectetuer " 
[11]   sText &= "adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna " 
[12]   sText &= "aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation " 
[13]   sText &= "ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat." 
[14]   TextArea1.Text = sText 
[15]   TextArea1.Wrap = True 
[16]   TextArea2.Wrap = True 
[17]   
[18] End ' Form_Open 
[19] 
[20] Public Sub TextArea1_Menu() 
[21] 
[22]   Dim mnuContextTextArea1 As Menu 
[23]   Dim mnuMenuItem As Menu 
[24] 
[25] ' Es wird ein neues Menü-Objekt für die Textarea1 erzeugt 
[26]   mnuContextTextArea1 = New Menu(FMain, False) 
[27] ' 1. Menü im Menü1 der Komponente TextArea1 
[28]   mnuMenuItem = New Menu(mnuContextTextArea1) As "mnuSelectAll" 
[29]   mnuMenuItem.Text = "Select all and copy all text to clipboard" 
[30]   mnuMenuItem.Picture = Stock["select"] 
[31] ' 2. Menü im Menü1 
[32]   mnuMenuItem = New Menu(mnuContextTextArea1) As "mnuSelectedCopy" 
[33]   mnuMenuItem.Text = "Copy selected text to clipboard" 
[34]   mnuMenuItem.Picture = Stock["copy"] 
[35] ' 3. Menü im Menü1 
[36]   mnuMenuItem = New Menu(mnuContextTextArea1) As "mnuSelectedCut" 
[37]   mnuMenuItem.Text = "Cut selected text" 
[38]   mnuMenuItem.Picture = Stock["cut"] 
[39] 
[40]   mnuContextTextArea1.Popup ' Das Menü1 wird der TextArea_1 als PopUp-Menü zugewiesen
[41]   
[42] ' Ein Nachteil dieser Vorgehensweise, jedem Menüeintrag den Bezeichner mnuMenuItem zu geben, soll
[43] ' nicht verschwiegen werden: Es ist im Programm nicht möglich, einzelne Menü-Eigenschaften 
[44] ' zur Laufzeit gezielt zu ändern. Beim Einsatz des Menü-Editors  entfällt der Nachteil.
[45] 
[46] End ' TextArea1_Menu 
[47] 
[48] ' Hier werden jetzt die 3 Aktionen programmiert, die ausgelöst werden, 
[49] ' wenn das entsprechende Menü im Kontextmenü der TextArea1 ausgewählt wurde. 
[50] 
[51] ' Menü 1 - Komponente TextArea1 
[52] Public Sub mnuSelectAll_Click() 
[53]   TextArea1.SelectAll() 
[54]   TextArea2.Clear 
[55]   If TextArea1.Selection.Text <> Null Then 
[56]      Clipboard.Copy(TextArea1.Text) 
[57]    ' Alternative: TextArea1.Copy() 
[58]   Endif ' TextArea1.Selection.Text <> Null 
[59] End ' mnuSelectAll_Click 
[60] 
[61] ' Menü 2 - Komponente TextArea1 
[62] Public Sub mnuSelectedCopy_Click() 
[63]   If TextArea1.Selection.Text <> Null Then 
[64]      TextArea2.Clear 
[65]      Clipboard.Copy(TextArea1.Selection.Text) 
[66]   ' Alternative: TextArea1.Copy() 
[67]   Endif ' TextArea1.Selection.Text <> Null 
[68] End ' mnuSelectedCopy_Click 
[69] 
[70] ' Menü 3 - Komponente TextArea1 
[71] Public Sub mnuSelectedCut_Click() 
[72]   If TextArea1.Selection.Text <> Null Then 
[73]      TextArea2.Clear 
[74]      Clipboard.Copy(TextArea1.Selection.Text) 
[75]      TextArea1.Cut() 
[76]   Endif ' TextArea1.Selection.Text <> Null 
[77] End ' mnuSelectedCopy_Click 
[78] 
[79] Public Sub TextArea2_Menu() 
[80]   Dim mnuContextTextArea2 As Menu 
[81]   Dim mnuP2T As Menu 
[82]   
[83] ' Es wird ein neues Menü-Objekt für die Textarea2 erzeugt 
[84]   mnuContextTextArea2 = New Menu(FMain, False) 
[85] ' Ein Menü im Menü2 der Komponente TextArea2 anlegen  
[86]   mnuP2T = New Menu(mnuContextTextArea2) As "mnuPasteToTextArea2" 
[87]   mnuP2T.Text = "Paste from ClipBoard" 
[88]   mnuP2T.Picture = Stock["paste"] 
[89]   
[90]   If Clipboard.Type = Clipboard.Text Then 
[91]      mnuContextTextArea2.Popup ' Das Menü2 wird der TextArea_2 als PopUp-Menü zugewiesen (aktiv)
[92]   Else 
[93]     mnuP2T.Enabled = False 
[94]     mnuContextTextArea2.Popup ' Das Menü2 wird der TextArea_2 als PopUp-Menü zugewiesen (nicht aktiv)
[95]   Endif ' Clipboard.Type = Clipboard.Text 
[96] 
[97] End ' TextArea2_Menu
[98] 
[99]   Public Sub mnuPasteToTextArea2_Click() 
[100] ' Hier wird die eine Aktion programmiert, die ausgelöst wird,   
[101] ' wenn das eine Menü im Kontextmenü der TextArea2 ausgewählt wurde. 
[102]   TextArea2.Insert(Clipboard.Paste("text/plain")) 
[103] End ' mnuPasteToTextArea2_Click 
[104] 
[105] Public Sub btnFormats_Click() 
[106]   Dim sElement As String 
[107] 
[108]   TextArea2.Clear 
[109]   For Each sElement In Clipboard.Formats 
[110]     TextArea2.Insert(sElement & gb.NewLine) 
[111]   Next ' sElement 
[112] 
[113] End ' btnFormats_Click 
[114] 
[115] Public Sub btnReset_Click() 
[116]   Clipboard.Clear 
[117]   TextArea2.Clear 
[118]   TextArea1.Text = sText 
[119]   TextArea1.SetFocus 
[120] End ' Reset 
[121] 
[122] Public Sub btnClose_Click() 
[123]   If Not Clipboard.Type = Clipboard.None Then Clipboard.Clear 
[124]   FMain.Close 
[125] End ' btnClose

Kommentar:

  • In den Zeilen 20 bis 46 wird ein Menü1 (Zeile20) mit 3 Menüs angelegt und in der Zeile 40 der Komponente TextArea1 als Kontextmenü zugewiesen.
  • In den Zeilen 79 bis 97 erfolgt Analoges – hier jedoch nur mit einem Menü – für die Komponente TextArea2. In Abhängigkeit vom Inhalt des ClipBoards wird das Menü aktiv oder nicht aktiv gesetzt.
  • Der in der TextArea1 selektierte, kopierte Text oder ausgeschnittene Text wird in die TextArea2 im vorgegebenen Textformat 'text/plain' eingefügt – Zeile 102.

13.4.3 Download

The website uses a temporary session cookie. This technically necessary cookie is deleted when the browser is closed. You can find information on cookies in our privacy policy.
k13/k13.4/start.txt · Last modified: 02.07.2018 (external edit)

Page Tools