⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fmenu.class

📁 Gambas is a graphical development environment based on a Basic interpreter, like Visual Basic. It us
💻 CLASS
字号:
' Gambas class fileSTATIC PRIVATE $hForm AS FFormSTATIC PRIVATE $cMenu AS NEW Object[]PRIVATE $iLevel AS IntegerPRIVATE $cName AS NEW CollectionPRIVATE $iCurrent AS IntegerPRIVATE $bFreeze AS BooleanSTATIC PUBLIC SUB Run(hForm AS FForm)  DIM hMenu AS FMenu    $hForm = hForm    hMenu = NEW FMenu  IF hMenu.ShowModal() THEN SaveAllMenuENDPUBLIC SUB _new()  'PRINT "_new"  ME.Title = $hForm.Name & " - " & ("Menu editor")  $iCurrent = -1  LoadShortcut  LoadAllMenu  ENDPUBLIC SUB btnCancel_Click()  WriteMenu  ME.CloseENDPUBLIC SUB btnOK_Click()  WriteMenu  IF CheckMenu() THEN RETURN  ME.Close(TRUE)ENDPRIVATE SUB CreateMenu(hCCtrl AS CControl)  DIM hCMenu AS CMenu  DIM hMenu AS Menu    hCMenu = NEW CMenu    WITH hCMenu      .Name = hCCtrl.Name    .Caption = hCCtrl.GetPropertyDefault("Text")    .Level = $iLevel    .Enabled = hCCtrl.GetPropertyDefault("Enabled")    .Visible = hCCtrl.GetPropertyDefault("Visible")    .Checked = hCCtrl.GetPropertyDefault("Checked")    .SetShortcut(hCCtrl.GetPropertyDefault("Shortcut"))    .Picture = hCCtrl.GetPropertyDefault("Picture")    .Tag = hCCtrl.GetPropertyDefault("Tag")    .Group = hCCtrl.GetPropertyDefault(CPropertyInfo.EVENT_NAME)      END WITH  $cMenu.Add(hCMenu)  $cName[hCMenu.Name] = TRUE  $iLevel = $iLevel + 1    FOR EACH hMenu IN hCCtrl.Control.Children    CreateMenu($hForm.Control[hMenu.Tag])  NEXT  $iLevel = $iLevel - 1ENDPRIVATE SUB DrawMenu(iInd AS Integer)  DIM sElt AS String    $bFreeze = TRUE  WITH $cMenu[iInd]    sElt = String$(.Level, "···") & .Caption    IF .Shortcut THEN      sElt = sElt & " (" & .GetShortcut() & ")"    ENDIF    lstMenu[iInd].Text = sElt  END WITH    $bFreeze = FALSEENDPRIVATE SUB LoadAllMenu()  DIM hCtrl AS CControl  DIM hCMenu AS CMenu  DIM iInd AS Integer  $bFreeze = TRUE  $cMenu.Clear  $cName.Clear  FOR EACH hCtrl IN $hForm.Menus    'IF hCtrl.Parent.Kind = "Form" THEN    CreateMenu(hCtrl)    'ENDIF  NEXT  lstMenu.Clear  FOR iInd = 0 TO $cMenu.Count - 1    lstMenu.Add("")    DrawMenu(iInd)  NEXT      lstMenu.Add("")    lstMenu.Index = 0    $bFreeze = FALSE  SetCurrent(0)  ReadMenuENDSTATIC PRIVATE SUB SaveAllMenu()  'DIM cDelete AS NEW Array  DIM hCtrl AS CControl  DIM hCMenu AS CMenu  DIM hParent AS CControl  DIM iLevel AS Integer  FOR EACH hCtrl IN $hForm.Menus    'cDelete.Add(hCtrl)    hCtrl.Delete  NEXT    IF $hForm.Menus.Count THEN $hForm.Modify  $hForm.Menus.Clear  hCtrl = $hForm.Control[$hForm.Name]  iLevel = -1  FOR EACH hCMenu IN $cMenu      WITH hCMenu        IF .Level > iLevel THEN              hParent = hCtrl        iLevel = .Level              ELSE              WHILE .Level < iLevel          hParent = hParent.Parent          iLevel = iLevel - 1        WEND            ENDIF            hCtrl = $hForm.CreateControl("Menu", hParent, .Name)            hCtrl.SetProperty("Text", .Caption)      hCtrl.SetProperty("Visible", .Visible)      hCtrl.SetProperty("Enabled", .Enabled)      hCtrl.SetProperty("Checked", .Checked)      hCtrl.SetProperty("Shortcut", .GetShortcut())      hCtrl.SetProperty("Picture", .Picture)      hCtrl.SetProperty("Tag", .Tag)      hCtrl.SetProperty(CPropertyInfo.EVENT_NAME, .Group)        END WITH    NEXTENDPUBLIC SUB lstMenu_Click()  IF $bFreeze THEN RETURN  ChangeCurrent(lstMenu.Index)ENDPRIVATE SUB ChangeCurrent(iNew AS Integer)  IF iNew = $iCurrent THEN RETURN  WriteMenu()  $iCurrent = iNew  ReadMenu()ENDPRIVATE SUB WriteMenu()  DIM iInd AS Integer  DIM sName AS String  'IF NOT ME.Visible THEN  '  PRINT "WriteMenu ??"  '  RETURN  'ENDIF    IF $bFreeze THEN RETURN    iInd = $iCurrent  IF iInd < 0 OR iInd >= $cMenu.Count THEN RETURN    WITH $cMenu[iInd]      sName = Trim(txtName.Text)        IF NOT sName THEN      Message.Warning(("Please enter a menu name."))      txtName.SetFocus      RETURN    ENDIF    IF CControl.CheckName(sName) THEN      Message.Warning(("Bad menu name !"))      txtName.SetFocus      RETURN    ENDIF        IF CControl.CheckName(txtGroup.Text) THEN      Message.Warning(("Bad group name !"))      txtName.SetFocus      RETURN    ENDIF        IF sName <> .Name THEN      IF NOT $cName.Exist(sName) THEN        $cName[.Name] = NULL        $cName[sName] = TRUE        .Name = sName      ENDIF    ENDIF        .Caption = Trim(txtCaption.Text)    .Group = Trim(txtGroup.Text)    .Visible = chkVisible.Value    .Enabled = chkEnabled.Value    .Checked = chkChecked.Value    .Ctrl = chkCtrl.Value    .Shift = chkShift.Value    .Alt = chkAlt.Value    IF cmbShortcut.Index = 0 THEN      .Shortcut = ""    ELSE      .Shortcut = cmbShortcut.Text    ENDIF    .Picture = txtPicture.Text    .Tag = txtTag.Text    END WITH    DrawMenu($iCurrent)  ENDPRIVATE SUB ReadMenu()  DIM iInd AS Integer    $bFreeze = TRUE    iInd = $iCurrent  IF iInd >= 0 AND iInd < $cMenu.Count THEN      WITH $cMenu[iInd]          txtName.Text = .Name      txtCaption.Text = .Caption      txtGroup.Text = .Group      chkVisible.Value = .Visible      chkEnabled.Value = .Enabled      chkChecked.Value = .Checked      chkCtrl.Value = .Ctrl      chkShift.Value = .Shift      chkAlt.Value = .Alt      IF Len(.ShortCut) THEN        cmbShortcut.Text = .Shortcut      ELSE        cmbShortCut.Index = 0      ENDIF      txtPicture.Text = .Picture      txtTag.Text = .Tag      SetPicture(.Picture)        END WITH      frmMenu.Visible = TRUE      ELSE        frmMenu.Visible = FALSE      ENDIF    $bFreeze = FALSEENDPRIVATE SUB DeleteMenu(iInd AS Integer)  lstMenu.Remove(iInd)  $cName.Remove($cMenu[iInd].Name)  $cMenu.Remove(iInd)ENDPUBLIC SUB btnDelete_Click()  DIM iInd AS Integer  WriteMenu  $bFreeze = TRUE  WHILE iInd < (lstMenu.Count - 1)      IF lstMenu[iInd].Selected THEN      DeleteMenu(iInd)    ELSE      iInd = iInd + 1    ENDIF    WEND    SetCurrent($iCurrent)  $bFreeze = FALSE    ReadMenuENDPUBLIC SUB btnInsert_Click()  DIM hCMenu AS CMenu  'DIM iIndex AS INTEGER  $bFreeze = TRUE  WriteMenu  hCMenu = NEW CMenu  hCMenu.Name = GetName()  'hCMenu.Caption = hCMenu.Name  IF lstMenu.Index > 0 THEN    hCMenu.Level = $cMenu[$iCurrent - 1].Level  ENDIF    $cName[hCMenu.Name] = TRUE  'hCMenu.Caption = hCMenu.Name    $cMenu.Add(hCMenu, $iCurrent)  lstMenu.Add("", $iCurrent)    ReadMenu  $bFreeze = FALSE    DrawMenu($iCurrent)  lstMenu.Index = -1  SetCurrent($iCurrent)    txtName.Selection  txtName.SetFocus  ENDPRIVATE FUNCTION GetName() AS String  DIM iCpt AS Integer  DIM sName AS String  DO        iCpt = iCpt + 1    sName = "Menu" & CStr(iCpt)    IF NOT $cName.Exist(sName) THEN RETURN sName      LOOPENDPUBLIC SUB btnRight_Click()  DIM iInd AS Integer  WriteMenu    FOR iInd = 0 TO lstMenu.Count - 2      IF lstMenu[iInd].Selected THEN      WITH $cMenu[iInd]        .Level = .Level + 1      END WITH      DrawMenu(iInd)      lstMenu[iInd].Selected = TRUE    ENDIF    NEXT    ReadMenuENDPUBLIC SUB btnLeft_Click()  DIM iInd AS Integer  WriteMenu    FOR iInd = 0 TO lstMenu.Count - 2      IF lstMenu[iInd].Selected THEN      WITH $cMenu[iInd]        .Level = Max(.Level - 1, 0)      END WITH      DrawMenu(iInd)      lstMenu[iInd].Selected = TRUE    ENDIF    NEXT    ReadMenuENDPRIVATE SUB LoadShortcut()  DIM iInd AS Integer  cmbShortcut.Add("(None)")    FOR iInd = Asc("A") TO Asc("Z")    cmbShortcut.Add(Chr$(iInd))  NEXT  FOR iInd = 1 TO 12    cmbShortcut.Add("F" & CStr(iInd))  NEXT    cmbShortcut.Add("Backspace")  cmbShortcut.Add("Del")  cmbShortcut.Add("Down")  cmbShortcut.Add("End")  cmbShortcut.Add("Enter")  cmbShortcut.Add("Esc")  cmbShortcut.Add("Home")  cmbShortcut.Add("Ins")  cmbShortcut.Add("Left")  cmbShortCut.Add("Pause")  cmbShortcut.Add("PgDown")  cmbShortcut.Add("PgUp")  cmbShortcut.Add("Return")  cmbShortcut.Add("Space")  cmbShortcut.Add("Right")  cmbShortcut.Add("Up")  ENDPRIVATE FUNCTION CheckMenu() AS Boolean  DIM iInd AS Integer  DIM iLastLevel AS Integer    iLastLevel = -1    FOR iInd = 0 TO $cMenu.Count - 1      IF $cMenu[iInd].Level - iLastLevel > 1 THEN      lstMenu.Index = -1      lstMenu.Index = iInd      lstMenu[lstMenu.Index].Selected = TRUE      Message.Warning(("This menu is too deep !"))      RETURN TRUE    ENDIF        iLastLevel = $cMenu[iInd].Level    NEXTENDPUBLIC SUB cmbShortcut_Click()  WriteMenuENDPUBLIC SUB chkCtrl_Click()  WriteMenuENDPUBLIC SUB chkAlt_Click()  WriteMenuENDPUBLIC SUB chkShift_Click()  WriteMenuENDPUBLIC SUB txtCaption_Change()  WriteMenu  ENDPUBLIC SUB btnNext_Click()  DIM iIndex AS Integer  IF $iCurrent < $cMenu.Count THEN    iIndex = lstMenu.Index    lstMenu.Index = -1    lstMenu.Index = iIndex + 1    lstMenu[lstMenu.Index].Selected = TRUE  ENDIFENDPUBLIC SUB btnUp_Click()  DIM iInd AS Integer  DIM sItem AS String  DIM hCMenu AS CMenu  DIM iCount AS Integer  iCount = lstMenu.Count  IF iCount <= 1 THEN RETURN  IF $iCurrent = (lstMenu.Count - 1) THEN RETURN  IF lstMenu[0].Selected THEN RETURN  FOR iInd = 0 TO lstMenu.Count - 2    IF lstMenu[iInd].Selected THEN            $bFreeze = TRUE      sItem = lstMenu[iInd].Text      lstMenu.Add(sItem, iInd - 1)      lstMenu.Remove(iInd + 1)      lstMenu[iInd - 1].Selected = TRUE            hCMenu = $cMenu[iInd - 1]      $cMenu[iInd - 1] = $cMenu[iInd]      $cMenu[iInd] = hCMenu          END IF  NEXT  SetCurrent($iCurrent - 1)  $bFreeze = FALSE  ReadMenuENDPUBLIC SUB btnDown_Click()  DIM iInd AS Integer  DIM sItem AS String  DIM hCMenu AS CMenu  DIM iCount AS Integer  iCount = lstMenu.Count  IF iCount <= 1 THEN RETURN  IF $iCurrent = (lstMenu.Count - 1) THEN RETURN  IF lstMenu[iCount - 2].Selected OR lstMenu[iCount - 1].Selected THEN RETURN  FOR iInd = lstMenu.Count - 2 TO 0 STEP -1    IF lstMenu[iInd].Selected THEN            $bFreeze = TRUE        sItem = lstMenu[iInd].Text      lstMenu.Remove(iInd)      lstMenu.Add(sItem, iInd + 1)      lstMenu[iInd + 1].Selected = TRUE            hCMenu = $cMenu[iInd]      $cMenu[iInd] = $cMenu[iInd + 1]      $cMenu[iInd + 1] = hCMenu          END IF  NEXT  SetCurrent($iCurrent + 1)  $bFreeze = FALSE  ReadMenu  ENDPRIVATE SUB SetCurrent(iCurrent AS Integer)  $iCurrent = iCurrent  lstMenu.Index = $iCurrent  lstMenu[iCurrent].Selected = TRUEENDPUBLIC SUB btnPicture_Click()  DIM sPict AS String  sPict = FGetIcon.Run(txtPicture.Text)  IF sPict THEN SetPicture(sPict)  ENDPRIVATE SUB SetPicture(sPict AS String)    DIM hPict AS Picture  txtPicture.Text = sPict  IF sPict THEN    hPict = NEW Picture    hPict.Load(File.Dir(Project.Path) &/ sPict)    imgPicture.Picture = hPict  ELSE    imgPicture.Picture = NULL  ENDIF  CATCH  Message.Error(Error.Text)  ENDPUBLIC SUB btnKillPicture_Click()  SetPicture("")END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -