跳转到内容

从 Zip/上下文菜单编程 Gambas

来自维基教科书,开放的书籍,为开放的世界

在设计时创建上下文菜单

[编辑 | 编辑源代码]

当您右键单击 tableview 时,还有另一种方法可以创建上下文菜单:不是像我们所做的那样在代码中创建,而是在设计时创建。您仍然需要编写代码来处理菜单项单击事件,但您避免了所有类似于 mn = New Menu(Me)su = New Menu(mn) As "MenuCopyTable" 的 New Menuitem 语句。只需使用菜单编辑器创建一个包含所有菜单项的新菜单即可。此菜单将出现在菜单栏上,因此要避免这种情况,请将其设为不可见(请参见下面的 Visible 复选框)。

这是创建上下文菜单的一种更简单的方法。如果您在启动应用程序之前就知道菜单是什么样子,它将起作用。如果您需要根据输入的内容来创建菜单,则必须在代码中创建菜单并使用 New 运算符。

Gambas — Making Menus as Design Time

对 GridView 或 TableView 进行排序

[编辑 | 编辑源代码]

没有内置的排序功能。我希望每个 TableView 都附带一个方法,例如 TableView_Sort(Column, Direction, NumericOrNot),但实际上没有。在线维基上有一个很好的排序方法,这里,但遗憾的是,它对包含数字的列排序不正确。例如,10 在 2 之前,因为“1”在字典中位于“2”之前。字符串“10”小于字符串“2”,即使数字十大于数字二。

(感谢论坛的 fgores、Lee Davidson 和 Gianluigi 提供的此方法。)

因此,这是我的方法——有点原始,但它有效。想法是遍历 tableview 的每一行,将该行中的单元格收集到一个字符串中,并在每个单元格之间添加一个分隔符,并将决定排序顺序的项放在每个字符串的开头。对数组进行排序,然后将每一行解包回 tableview。换句话说,将每一行打包到一个字符串中,对字符串进行排序,然后解包每一行。使用任何罕见且不寻常的字符作为字段分隔符。这里使用波浪号 (~)。

Public Sub tv1_ColumnClick(Column As Integer)
  tv1.Save 'Calls the Save event in case the user clicked col heading without pressing Enter
  SortTable(tv1, Column, tv1.Columns.Ascending, (Column = 1))
End

Public Sub SortTable(TheTable As TableView, Column As Integer, Ascending As Boolean, Numeric As Boolean)

  Dim z As New String[]
  Dim y As New String[]
  Dim s As String
  Dim i, j As Integer

  For i = 0 To TheTable.Rows.Max
      If Numeric Then
        s = TheTable[i, Column].text 'next line pads it with leading zeros
        s = String$(5 - Len(s), "0") 'So 23 becomes 00023, for example. Works up to 99999
      Else
        s = TheTable[i, Column].text
      Endif
    For j = 0 To TheTable.Columns.Max
      s &= "~" & TheTable[i, j].text
    Next
    z.add(s)
  Next

  If Ascending Then z.Sort(gb.Ascent) Else z.Sort(gb.Descent) 'sort

  For i = 0 To z.Max 'unpack the array
    y = Split(z[i], "~")
    For j = 1 To y.Max 'skip the first item, which is the sort key
      TheTable[i, j - 1].text = y[j] 'but fill the first column
    Next
  Next
End
从 Zip 编程 Gambas
 ← 窗体排列 上下文菜单 ASCII → 
华夏公益教科书