ToolStripItems не отображаются

Короче говоря, я разработал приложение и на его финальных стадиях задумался над созданием формы для первого запуска приложения, где пользователь (админ) будет задавать некоторые управляющие переменные.

Чтобы добиться этой функциональности, я должен был убедиться, что существует форма, которая будет контролировать, «видит» ли пользователь приложение в первый раз или нет, называя его формой-призраком (эта форма не будет видна) .

Эта «призрачная» форма будет проверять, является ли переменная FirstRun истинной или нет. Если верно, то будет вызвана форма для настройки управляющих переменных, иначе будет запущена основная форма приложения:

Public Class fGhostForm

    Private Sub fGhostForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Close()
    End Sub

    Private Sub fGhostForm_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
        If My.Settings.FirstRun Then
            Dim FormToLaunch As fFirstRunApplicationSettings = New fFirstRunApplicationSettings()
            FormToLaunch.ShowDialog()
        Else
            Dim FormToLaunch As fMainForm = New fMainForm()
            FormToLaunch.ShowDialog()
        End If
    End Sub
End Class

Это работает отлично и денди, поскольку я вижу свою основную форму в ее основном состоянии, а это означает, что в настоящее время я являюсь гостевым пользователем, у которого в настоящее время почти нет доступа к каким-либо функциям приложения. Чтобы получить доступ, мне нужно сначала войти в мою базу данных, и я делаю это, щелкнув опцию «Iniciar Sessão», и появится новая форма, в которой пользователь должен ввести свои учетные данные:

2.png

После входа в систему, в зависимости от того, какой уровень безопасности имеет пользователь, в строке меню главной формы должны появиться новые элементы полосы инструментов. Теперь вот проблема:

Если я установлю «fMainForm» в качестве формы запуска для проекта, это произойдет. Однако, если я установлю «fGhostForm» в качестве формы запуска, я увижу всплывающую основную форму, но после входа в систему инструменты не отображаются вообще.

Чтобы изолировать проблему, я решил создать тестовую кнопку, просто чтобы создать новый экземпляр основной формы, вызвав ее точную копию. Теперь, когда я выполняю шаг входа в систему, в основной форме, которая была вызвана нажатием кнопки тестирования, элементы инструментов не отображаются. Однако в первой основной форме элементы toolstripitems отображаются так, как должны (я сделал это с «fMainForm» в качестве стартовой формы для проекта):

3.png

4.png

5.png

6.png

Это код тестовой кнопки:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim testForm As fMainForm = New fMainForm()
    testForm.Show()
End Sub

Я не могу понять, что вызывает такое поведение. Кто-нибудь знает, почему это происходит? Я могу предложить более подробную информацию, если это необходимо.

P.S. Основная форма — это MdiContainer, и я также проверил свойство AllowMerge для полосы меню, отключив его, но результат все тот же.

Редактировать* Я только что понял, что не опубликовал ни событие загрузки основной формы, ни событие входа в систему, и приношу извинения за путаницу, которую это могло вызвать. Вот:

Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click
    currentOp = "Low Database"

    Try
        Dim taLogins As New RecipeMasterDBDataSetTableAdapters.LoginsTableAdapter
        Dim tLogins As New RecipeMasterDBDataSet.LoginsDataTable
        Dim PED As cPassEncrypterDecrypter
        PED = New cPassEncrypterDecrypter()

        If taLogins.FillByLoginAuthByUsernamePassword(tLogins, txtUsername.Text, PED.StringEncrypter(txtPassword.Text)) > 0 Then
            Dim taSessions As New RecipeMasterDBDataSetTableAdapters.SessionsTableAdapter
            Dim tSession As New RecipeMasterDBDataSet.SessionsDataTable
            taSessions.InsertQuerySession(Date.Now.Date & " " & Date.Now.Hour & ":" & Date.Now.Minute & ":" & Date.Now.Second, CInt(tLogins.Rows(0).Item(0)))

            fMainForm.CurrentUserSessionID = taSessions.SelectQueryCurrentSession(CInt(tLogins.Rows(0).Item(0)))
            If tLogins.Rows(0).Item(4) Then
                Dim taRecipes As New RecipeMasterDBDataSetTableAdapters.RecipesTableAdapter
                Dim tRecipes As New RecipeMasterDBDataSet.RecipesDataTable
                Dim taRatings As New RecipeMasterDBDataSetTableAdapters.RatingsTableAdapter

                taRecipes.Fill(tRecipes)
                taEvents.InsertQueryEvents("SELECT Statement - Login Interface", "Query: Generic query | Parameters - N/A" _
                                          , Date.Now, "Form: " & Me.Name & "Site: btnLogin_Click", _
                                          CInt(tLogins.Rows(0).Item(0)), 28)
                For recipeIndex As Integer = 0 To tRecipes.Rows.Count - 1
                    If My.Settings.ChosenLanguageIndex = 0 Then
                        taRatings.InsertQueryBaseRatingsForUser(Nothing, "Ainda não comentada", 0, 0D, False, "1900-01-01", CInt(tLogins.Rows(0).Item(0)), CInt(tRecipes.Rows(recipeIndex).Item(0)))
                        taEvents.InsertQueryEvents("INSERT Transaction - Login Interface", _
                                                  "Procedure: InsertQueryBaseRatingsForUser | Parameters - " & _
                                                  "Comment: " & String.Empty & " Comment_Flag: " & " Ainda não comentada " & _
                                                  "Rate_Level: " & 0 & " Rate_Score_Index: " & 0D & "Rated_Flag: " & _
                                                  "False " & "Rate_Recent_Date: " & "1900-01-01 " & "Login ID: " & _
                                                  CInt(tLogins.Rows(0).Item(0)) & " Recipe ID: " & _
                                                  CInt(tRecipes.Rows(recipeIndex).Item(0)), Date.Now, "Form: " & Me.Name & _
                                                  " Site: btnLogin_Click", CInt(tLogins.Rows(0).Item(0)), 31)
                    ElseIf My.Settings.ChosenLanguageIndex = 1 Then
                        taRatings.InsertQueryBaseRatingsForUser(Nothing, "Not yet commented", 0, 0D, False, "1900-01-01", CInt(tLogins.Rows(0).Item(0)), CInt(tRecipes.Rows(recipeIndex).Item(0)))
                        taEvents.InsertQueryEvents("INSERT Transaction - Login Interface", _
                                                  "Procedure: InsertQueryBaseRatingsForUser | Parameters - " & _
                                                  "Comment: " & String.Empty & " Comment_Flag: " & " Not yet commented " & _
                                                  "Rate_Level: " & 0 & " Rate_Score_Index: " & 0D & "Rated_Flag: " & _
                                                  "False " & "Rate_Recent_Date: " & "1900-01-01 " & "Login ID: " & _
                                                  CInt(tLogins.Rows(0).Item(0)) & " Recipe ID: " & _
                                                  CInt(tRecipes.Rows(recipeIndex).Item(0)), Date.Now, "Form: " & Me.Name & _
                                                  " Site: btnLogin_Click", CInt(tLogins.Rows(0).Item(0)), 31)
                    ElseIf My.Settings.ChosenLanguageIndex = 2 Then
                        taRatings.InsertQueryBaseRatingsForUser(Nothing, "Pas encore de commentaires", 0, 0D, False, "1900-01-01", CInt(tLogins.Rows(0).Item(0)), CInt(tRecipes.Rows(recipeIndex).Item(0)))
                        taEvents.InsertQueryEvents("INSERT Transaction - Login Interface", _
                                                  "Procedure: InsertQueryBaseRatingsForUser | Parameters - " & _
                                                  "Comment: " & String.Empty & " Comment_Flag: " & " Pas encore engagé " & _
                                                  "Rate_Level: " & 0 & " Rate_Score_Index: " & 0D & "Rated_Flag: " & _
                                                  "False " & "Rate_Recent_Date: " & "1900-01-01 " & "Login ID: " & _
                                                  CInt(tLogins.Rows(0).Item(0)) & " Recipe ID: " & _
                                                  CInt(tRecipes.Rows(recipeIndex).Item(0)), Date.Now, "Form: " & Me.Name & _
                                                  " Site: btnLogin_Click", CInt(tLogins.Rows(0).Item(0)), 31)
                    ElseIf My.Settings.ChosenLanguageIndex = 3 Then
                        taRatings.InsertQueryBaseRatingsForUser(Nothing, "Aún no ha comentado", 0, 0D, False, "1900-01-01", CInt(tLogins.Rows(0).Item(0)), CInt(tRecipes.Rows(recipeIndex).Item(0)))
                        taEvents.InsertQueryEvents("INSERT Transaction - Login Interface", _
                                                  "Procedure: InsertQueryBaseRatingsForUser | Parameters - " & _
                                                  "Comment: " & String.Empty & " Comment_Flag: " & " Aún no ha comentado " & _
                                                  "Rate_Level: " & 0 & " Rate_Score_Index: " & 0D & "Rated_Flag: " & _
                                                  "False " & "Rate_Recent_Date: " & "1900-01-01 " & "Login ID: " & _
                                                  CInt(tLogins.Rows(0).Item(0)) & " Recipe ID: " & _
                                                  CInt(tRecipes.Rows(recipeIndex).Item(0)), Date.Now, "Form: " & Me.Name & _
                                                  " Site: btnLogin_Click", CInt(tLogins.Rows(0).Item(0)), 31)
                    ElseIf My.Settings.ChosenLanguageIndex = 4 Then
                        taRatings.InsertQueryBaseRatingsForUser(Nothing, "Non ancora commentato", 0, 0D, False, "1900-01-01", CInt(tLogins.Rows(0).Item(0)), CInt(tRecipes.Rows(recipeIndex).Item(0)))
                        taEvents.InsertQueryEvents("INSERT Transaction - Login Interface", _
                                                  "Procedure: InsertQueryBaseRatingsForUser | Parameters - " & _
                                                  "Comment: " & String.Empty & " Comment_Flag: " & " Non ancora commentato " & _
                                                  "Rate_Level: " & 0 & " Rate_Score_Index: " & 0D & "Rated_Flag: " & _
                                                  "False " & "Rate_Recent_Date: " & "1900-01-01 " & "Login ID: " & _
                                                  CInt(tLogins.Rows(0).Item(0)) & " Recipe ID: " & _
                                                  CInt(tRecipes.Rows(recipeIndex).Item(0)), Date.Now, "Form: " & Me.Name & _
                                                  " Site: btnLogin_Click", CInt(tLogins.Rows(0).Item(0)), 31)
                    ElseIf My.Settings.ChosenLanguageIndex = 5 Then
                        taRatings.InsertQueryBaseRatingsForUser(Nothing, "Noch nicht kommentiert", 0, 0D, False, "1900-01-01", CInt(tLogins.Rows(0).Item(0)), CInt(tRecipes.Rows(recipeIndex).Item(0)))
                        taEvents.InsertQueryEvents("INSERT Transaction - Login Interface", _
                                                  "Procedure: InsertQueryBaseRatingsForUser | Parameters - " & _
                                                  "Comment: " & String.Empty & " Comment_Flag: " & " Noch nicht kommentiert " & _
                                                  "Rate_Level: " & 0 & " Rate_Score_Index: " & 0D & "Rated_Flag: " & _
                                                  "False " & "Rate_Recent_Date: " & "1900-01-01 " & "Login ID: " & _
                                                  CInt(tLogins.Rows(0).Item(0)) & " Recipe ID: " & _
                                                  CInt(tRecipes.Rows(recipeIndex).Item(0)), Date.Now, "Form: " & Me.Name & _
                                                  " Site: btnLogin_Click", CInt(tLogins.Rows(0).Item(0)), 31)
                    End If
                Next
                taLogins.UpdateQueryFirstLoginFlag(False, txtUsername.Text)
                taEvents.InsertQueryEvents("UPDATE Transaction - Login Interface", _
                                          "Procedure: UpdateQueryFirstLoginFlag | Parameters - " & _
                                          "IsFirstLogin: " & "False " & "Username: " & txtUsername.Text, Date.Now, _
                                          "Form: " & Me.Name & " Site: btnLogin_Click", CInt(tLogins.Rows(0).Item(0)), 31)
            End If

            fMainForm.ChefesToolStripMenuItem.Enabled = True
            fMainForm.ChefesToolStripMenuItem.Visible = True
            fMainForm.ReceitasToolStripMenuItem.Enabled = True
            fMainForm.ReceitasToolStripMenuItem.Visible = True
            fMainForm.AvaliaçõesToolStripMenuItem.Enabled = True
            fMainForm.AvaliaçõesToolStripMenuItem.Visible = True
            'fMainForm.GestõesMassivasToolStripMenuItem.Enabled = False
            'fMainForm.GestõesMassivasToolStripMenuItem.Visible = False
            fMainForm.ToolStripSeparator5.Visible = True
            fMainForm.AlterarDadosDaContaDeUtilizadorToolStripMenuItem.Enabled = True
            fMainForm.AlterarDadosDaContaDeUtilizadorToolStripMenuItem.Visible = True
            fMainForm.SuporteTécnicoToolStripMenuItem.Enabled = True
            fMainForm.SuporteTécnicoToolStripMenuItem.Visible = True
            'fMainForm.AdministraçãoToolStripMenuItem.Enabled = False
            'fMainForm.AdministraçãoToolStripMenuItem.Visible = False

            taLogins.UpdateQueryLastLoginTimeStamp(CDate(Date.Now), txtUsername.Text)
            taEvents.InsertQueryEvents("UPDATE Transaction - Login Interface", _
                                          "Procedure: UpdateQueryLastLoginTimeStamp | Parameters - " & _
                                          "LAST_LOGIN_TIMESTAMP: " & CDate(Date.Now) & " Username: " & txtUsername.Text, Date.Now, _
                                          "Form: " & Me.Name & " Site: btnLogin_Click", CInt(tLogins.Rows(0).Item(0)), 31)

            If CInt(tLogins.Rows(0).Item(7)) >= 1 And CInt(tLogins.Rows(0).Item(7)) <= 3 Then
                fMainForm.GestõesMassivasToolStripMenuItem.Enabled = True
                fMainForm.GestõesMassivasToolStripMenuItem.Visible = True
                fMainForm.AdministraçãoToolStripMenuItem.Enabled = True
                fMainForm.AdministraçãoToolStripMenuItem.Visible = True
                fMainForm.ToolStripSeparator2.Visible = True
                fMainForm.GerirFotografiasToolStripMenuItem.Enabled = True
                fMainForm.GerirFotografiasToolStripMenuItem.Visible = True
                fMainForm.ToolStripSeparator6.Visible = True
                fMainForm.FotografiasToolStripMenuItem.Enabled = True
                fMainForm.FotografiasToolStripMenuItem.Visible = True
                fMainForm.ToolStripSeparator9.Visible = True
                fMainForm.GeradorDeModelosToolStripMenuItem.Enabled = True
                fMainForm.GeradorDeModelosToolStripMenuItem.Visible = True
            ElseIf CInt(tLogins.Rows(0).Item(7)) >= 4 And CInt(tLogins.Rows(0).Item(7)) <= 5 Then
                fMainForm.GestõesMassivasToolStripMenuItem.Enabled = True
                fMainForm.GestõesMassivasToolStripMenuItem.Visible = True
                fMainForm.AdministraçãoToolStripMenuItem.Enabled = False
                fMainForm.AdministraçãoToolStripMenuItem.Visible = False
                fMainForm.ToolStripSeparator2.Visible = True
                fMainForm.GerirFotografiasToolStripMenuItem.Enabled = True
                fMainForm.GerirFotografiasToolStripMenuItem.Visible = True
                fMainForm.ToolStripSeparator6.Visible = True
                fMainForm.FotografiasToolStripMenuItem.Enabled = True
                fMainForm.FotografiasToolStripMenuItem.Visible = True
                fMainForm.ToolStripSeparator9.Visible = True
                fMainForm.GeradorDeModelosToolStripMenuItem.Enabled = True
                fMainForm.GeradorDeModelosToolStripMenuItem.Visible = True
            ElseIf CInt(tLogins.Rows(0).Item(7)) = 6 Then
                fMainForm.GestõesMassivasToolStripMenuItem.Enabled = False
                fMainForm.GestõesMassivasToolStripMenuItem.Visible = False
                fMainForm.AdministraçãoToolStripMenuItem.Enabled = False
                fMainForm.AdministraçãoToolStripMenuItem.Visible = False
                fMainForm.ToolStripSeparator2.Visible = True
                fMainForm.GerirFotografiasToolStripMenuItem.Enabled = True
                fMainForm.GerirFotografiasToolStripMenuItem.Visible = True
                fMainForm.ToolStripSeparator6.Visible = False
                fMainForm.FotografiasToolStripMenuItem.Enabled = False
                fMainForm.FotografiasToolStripMenuItem.Visible = False
                fMainForm.ToolStripSeparator9.Visible = False
                fMainForm.GeradorDeModelosToolStripMenuItem.Enabled = False
                fMainForm.GeradorDeModelosToolStripMenuItem.Visible = False
            Else
                fMainForm.GestõesMassivasToolStripMenuItem.Enabled = False
                fMainForm.GestõesMassivasToolStripMenuItem.Visible = False
                fMainForm.AdministraçãoToolStripMenuItem.Enabled = False
                fMainForm.AdministraçãoToolStripMenuItem.Visible = False
                fMainForm.ToolStripSeparator2.Visible = False
                fMainForm.GerirFotografiasToolStripMenuItem.Enabled = False
                fMainForm.GerirFotografiasToolStripMenuItem.Visible = False
                fMainForm.ToolStripSeparator6.Visible = False
                fMainForm.FotografiasToolStripMenuItem.Enabled = False
                fMainForm.FotografiasToolStripMenuItem.Visible = False
                fMainForm.ToolStripSeparator9.Visible = False
                fMainForm.GeradorDeModelosToolStripMenuItem.Enabled = False
                fMainForm.GeradorDeModelosToolStripMenuItem.Visible = False
            End If

            fMainForm.CurrentUser = CStr(tLogins.Rows(0).Item(1))
            AuthSessionValid = True
            Me.Close()
        Else
            numberOfLoginFailedAttempts += 1
            If My.Settings.ChosenLanguageIndex = 0 Then
                MessageBox.Show("As credenciais que introduziu estão incorrectas." & ControlChars.CrLf & "Por favor, tente novamente." _
                            , "Erro: Credenciais Inválidas", MessageBoxButtons.OK, MessageBoxIcon.Error)
            ElseIf My.Settings.ChosenLanguageIndex = 1 Then
                MessageBox.Show("The credentials you entered are incorrect." & ControlChars.CrLf & "Please, try again." _
                            , "Error: Invalid Credentials", MessageBoxButtons.OK, MessageBoxIcon.Error)
            ElseIf My.Settings.ChosenLanguageIndex = 2 Then
                MessageBox.Show("Les informations d'identification que vous avez inscrits sont incorrects." & ControlChars.CrLf & "Veuillez réessayer." _
                            , "Erreur: Lettres de Créance non Valides", MessageBoxButtons.OK, MessageBoxIcon.Error)
            ElseIf My.Settings.ChosenLanguageIndex = 3 Then
                MessageBox.Show("Las credenciales que ha introducido son incorrectos." & ControlChars.CrLf & "Por favor, inténtelo de nuevo." _
                            , "Error: Credenciales no Válidas", MessageBoxButtons.OK, MessageBoxIcon.Error)
            ElseIf My.Settings.ChosenLanguageIndex = 4 Then
                MessageBox.Show("Le credenziali immesse non sono corrette." & ControlChars.CrLf & "Si prega, riprovare." _
                            , "Errore: Credenziali non Valide", MessageBoxButtons.OK, MessageBoxIcon.Error)
            ElseIf My.Settings.ChosenLanguageIndex = 5 Then
                MessageBox.Show("Die Anmeldeinformationen eingegeben sind falsch." & ControlChars.CrLf & "Bitte versuche es erneut." _
                            , "Fehler: Ungültige Anmeldeinformationen ", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End If

            If numberOfLoginFailedAttempts > 5 Then
                btnLogin.Enabled = False
                If My.Settings.ChosenLanguageIndex = 0 Then
                    Throw New Exception("O início de sessão foi bloqueado durante 30 segundos, devido ao número abusivo de tentativas." & ControlChars.CrLf & "Por favor, aguarde...")
                ElseIf My.Settings.ChosenLanguageIndex = 1 Then
                    Throw New Exception("Session start was blocked for 30 seconds due to abusive attempts." & ControlChars.CrLf & "Please wait...")
                ElseIf My.Settings.ChosenLanguageIndex = 2 Then
                    Throw New Exception("Le démarrage de la session a été bloqué pendant 30 secondes en raison de tentatives abusives." & ControlChars.CrLf & "S'il vous plaît, attendez...")
                ElseIf My.Settings.ChosenLanguageIndex = 3 Then
                    Throw New Exception("El inicio de sesión se bloqueó durante 30 segundos debido a intentos abusivos." & ControlChars.CrLf & "Por favor, espere...")
                ElseIf My.Settings.ChosenLanguageIndex = 4 Then
                    Throw New Exception("Inizia di la sessione è stata bloccata per 30 secondi a causa di tentativi abusivi." & ControlChars.CrLf & "Attendere prego...")
                ElseIf My.Settings.ChosenLanguageIndex = 5 Then
                    Throw New Exception("Der Sitzungsstart wurde wegen missbräuchlicher, Versuche für 30 Sekunden blockiert." & ControlChars.CrLf & "Warten Sie mal...")
                End If
            End If
        End If
    Catch ex As Exception
        Dim taLogins As New RecipeMasterDBDataSetTableAdapters.LoginsTableAdapter
        Dim tLogins As New RecipeMasterDBDataSet.LoginsDataTable
        Dim taEvents As New RecipeMasterDBDataSetTableAdapters.AppEventsTableAdapter
        Dim tEvents As New RecipeMasterDBDataSet.LoginsDataTable

        taLogins.FillByLoginByUsername(tLogins, "Admin")
        taEvents.InsertQueryEvents(currentOp & " Error - Multiple Failed Login Attempts", "Code Error: " & ex.HResult & " | Error Description: " & ex.Message & " | Source: " & _
        ex.Source, Date.Now, "Site: " & ex.TargetSite.Name, CInt(tLogins.Rows(0).Item(0)), 10)

        If My.Settings.ChosenLanguageIndex = 0 Then
            MessageBox.Show("Ocorreu a seguinte excepção:" & ControlChars.CrLf & ex.Message & ControlChars.CrLf & ControlChars.CrLf & _
            "Rastreamento de Pilha: " & ex.StackTrace, "Erro de Sistema: " & ex.HResult, MessageBoxButtons.OK, MessageBoxIcon.Warning)
        ElseIf My.Settings.ChosenLanguageIndex = 1 Then
            MessageBox.Show("The following exception occurred:" & ControlChars.CrLf & ex.Message & ControlChars.CrLf & ControlChars.CrLf & _
            "Stack Trace: " & ex.StackTrace, "System Error: " & ex.HResult, MessageBoxButtons.OK, MessageBoxIcon.Warning)
        ElseIf My.Settings.ChosenLanguageIndex = 2 Then
            MessageBox.Show("L'exception suivante s'est produite:" & ControlChars.CrLf & ex.Message & ControlChars.CrLf & ControlChars.CrLf & _
            "Trace de la Pile: " & ex.StackTrace, "Erreur de Système: " & ex.HResult, MessageBoxButtons.OK, MessageBoxIcon.Warning)
        ElseIf My.Settings.ChosenLanguageIndex = 3 Then
            MessageBox.Show("Se produjo la siguiente excepción:" & ControlChars.CrLf & ex.Message & ControlChars.CrLf & ControlChars.CrLf & _
            "Rastro de la Pila: " & ex.StackTrace, "Error del Sistema: " & ex.HResult, MessageBoxButtons.OK, MessageBoxIcon.Warning)
        ElseIf My.Settings.ChosenLanguageIndex = 4 Then
            MessageBox.Show("Si è verificato il seguente eccezione:" & ControlChars.CrLf & ex.Message & ControlChars.CrLf & ControlChars.CrLf & _
            "Analisi dello Stack: " & ex.StackTrace, "Errore di Sistema: " & ex.HResult, MessageBoxButtons.OK, MessageBoxIcon.Warning)
        ElseIf My.Settings.ChosenLanguageIndex = 5 Then
            MessageBox.Show("Die folgende Ausnahme ist aufgetreten:" & ControlChars.CrLf & ex.Message & ControlChars.CrLf & ControlChars.CrLf & _
            "Stapelüberwachung: " & ex.StackTrace, "Systemfehler: " & ex.HResult, MessageBoxButtons.OK, MessageBoxIcon.Warning)
        End If
        tmrFailedLoginAttemptsController.Start()
    End Try
End Sub

Вот событие загрузки основной формы:

Private Sub fMainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Try
        LastVisitedForm = Me.Text

        currentOp = "High System"

        If Not Directory.Exists(My.Settings.BackupFilesFolderPath) Then
            Throw New Exception("The backup files folder either was moved or is missing from this computer." & ControlChars.CrLf & _
        "Check your application folders for any misspeled names.")
            Application.Exit()
        End If

        If Not Directory.Exists(My.Settings.DBPath) Then
            Throw New Exception("The database files folder either was moved or is missing from this computer." & ControlChars.CrLf & _
    "Check your application folders for any misspeled names.")
            Application.Exit()
        End If

        If My.Settings.BackupFilesFolderPath = String.Empty Then
            My.Settings.BackupFilesFolderPath = 
Application.StartupPath.Remove(Application.StartupPath.Length - 10) & "\Backup Files"
            My.Settings.Save()
        End If

        If My.Settings.DBPath = String.Empty Then
            My.Settings.DBPath = "C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA" 'temp folder
            My.Settings.Save()
        End If

        If My.Settings.DBFileName = String.Empty Then
            My.Settings.DBFileName = "RecipeMasterDB.mdf"
            My.Settings.Save()
        End If

        Me.Text = "Recipe Master"

        JanelasToolStripMenuItem.Enabled = False

        EmailAccountCheckSumArray = New List(Of String)

        'System clock code...

        'Synchronize time always on application startup

        secondsController = CDate(My.Settings.AppCurTime).Second
        minutesController = CDate(My.Settings.AppCurTime).Minute
        hoursController = CDate(My.Settings.AppCurTime).Hour
        daysController = CDate(My.Settings.AppCurTime).Day
        monthsController = CDate(My.Settings.AppCurTime).Month
        yearsController = CDate(My.Settings.AppCurTime).Year

        SystemClockStartUp = True
        tmrAppTimeController.Start()

        LanguageInterpreter(My.Settings.ChosenLanguageIndex)

        ChefesToolStripMenuItem.Enabled = False
        ChefesToolStripMenuItem.Visible = False
        ReceitasToolStripMenuItem.Enabled = False
        ReceitasToolStripMenuItem.Visible = False
        AvaliaçõesToolStripMenuItem.Enabled = False
        AvaliaçõesToolStripMenuItem.Visible = False
        GestõesMassivasToolStripMenuItem.Enabled = False
        GestõesMassivasToolStripMenuItem.Visible = False
        ToolStripSeparator5.Visible = False
        AlterarDadosDaContaDeUtilizadorToolStripMenuItem.Enabled = False
        AlterarDadosDaContaDeUtilizadorToolStripMenuItem.Visible = False
        SuporteTécnicoToolStripMenuItem.Enabled = False
        SuporteTécnicoToolStripMenuItem.Visible = False
        AdministraçãoToolStripMenuItem.Enabled = False
        AdministraçãoToolStripMenuItem.Visible = False
    Catch ex As Exception
        'exception handling code ...
    End Try
End Sub

Зачем нужна призрачная форма? Вы можете проверить FirstRun в событии загрузки вашей MainForm и отобразить форму настройки в виде диалогового окна.

Han 28.05.2019 11:24

Ну, я указал, зачем мне это нужно, но я поясню, насколько смогу. При первом запуске приложения появится всплывающая форма для пользователя (администратора) для настройки некоторых параметров приложения. Когда не первый раз запускаешь приложение, то выскакивает основная форма. Я попробовал подход с призрачной формой, потому что попытка подхода, при котором вы должны изменить форму запуска проекта с помощью основного подпрограммы, похоже, не сработала.

Simbiose 28.05.2019 11:29

Вы объяснили, почему вам это нужно, думать, но, как и Хан, я не вижу причин использовать целую скрытую форму только для проверки значения переменной, а затем отображать другую форму.

ADyson 28.05.2019 12:10

Вы не можете ожидать, что кто-то найдет ошибку в коде по скриншоту. В любом случае это плохая идея, вы даете пользователю очень трудно выполнить задачу, прежде чем он сможет ознакомиться с приложением. Вполне вероятно, что он нащупает его, а затем безнадежно застрянет, потому что FirstRun теперь имеет значение False, и его невозможно сбросить. Вы даже не можете оказать помощь, когда он вам звонит, этот файл user.config почти невозможно найти обратно. Принадлежит элементу меню «Параметры» или файлу app.config, редактируемому администратором.

Hans Passant 28.05.2019 12:10

Пользователю будет оказана помощь в самой форме... Кроме того, здесь мы избавляемся от проблемы. Мне просто нужно знать, почему у toolstripitems такое поведение... Как я уже сказал, все, чем мне нужно поделиться, чтобы решить эту проблему, я поделюсь, я просто не знаю, чем еще поделиться, кроме того, что я уже сделал... Я разместил событие загрузки основной формы, и полоса меню, а также элементы инструментов были нарисованы из дизайнера, поэтому код был сгенерирован автоматически. Я также опубликовал, что делает тестовая кнопка, и на скриншотах показан сценарий. Что еще я могу опубликовать?

Simbiose 28.05.2019 12:14

@ADyson Хорошо ... скажем так. Я хочу, чтобы пользователь увидел форму A при первом запуске. Пользователь устанавливает переменные для первого запуска. После первого запуска приложения, когда пользователь запускает его снова, появляется форма B. Если у меня нет формы, скрытой для этой переменной, как я могу это сделать (кроме основной подпрограммы, о которой я упоминал ранее)? Я не могу писать код на форме B, иначе это всегда будет стартовая форма.

Simbiose 28.05.2019 12:19

Можете ли вы показать код после входа пользователя в систему, где вы пытаетесь сделать видимыми дополнительные элементы ToolStripItem?

AConfusedSimpleton 28.05.2019 12:32

Прошу прощения, так как я виноват... Я не понял, что не поделился событием загрузки формы основной формы. Я сразу же опубликую это, а также событие входа в систему.

Simbiose 28.05.2019 12:42

Вы можете просто написать код в своем методе Main, прежде чем вызывать Application.Run(). Вы можете проверить значение вашей переменной firstRun и использовать ее, чтобы решить, какую форму отображать (A или B). Если это не сработало для вас, было бы лучше показать этот код и исправить его, потому что это очевидное решение.

ADyson 28.05.2019 12:53

Я попробовал основной вспомогательный подход, отключив структуру приложения в проекте и выбрав Sub Main в качестве объекта запуска. Затем я написал точно такой же код для Sub (код, который отображается здесь в событии fGhostForm_FormClosed). Поведение toolstripitems такое же, как и в подходе Ghost Form. Поэтому я предполагаю, что если я выясню, почему это происходит, и решу ее, я могу вернуться к использованию основного вспомогательного подхода.

Simbiose 28.05.2019 13:06

Для меня я бы использовал реестр при настройке и сохранил там значение, он проверит для меня, новый он или нет, при настройке сделайте его 0, первый запуск, показать форму настроек, установить значение 1, при следующем запуске уже 1 основной форма покажет..

OctaCode 28.05.2019 13:34

@Devcon Я думал пойти по этому пути, но в моем случае это невозможно, потому что в приложении есть опция, которая позволяет пользователям с определенным уровнем доступа (например, администратором) восстановить настройки приложения по умолчанию и это момент, у меня не будет возможности проверить, запускается ли приложение впервые или нет. Проще говоря, каждый раз, когда приложение восстанавливается до настроек по умолчанию, флаг FirstRun будет обновляться до true.

Simbiose 28.05.2019 14:02

@Simbiose, с какой проблемой вы столкнетесь, если вы сделаете настройки из своей первой формы для загрузки? Хорошо, как насчет того, чтобы сначала запустить форму настроек, а при загрузке проверить, используется ли она в первую очередь, если верно, сохранить ее, если нет, закрыть и запустить основную форму, вот как вы удаляете свою призрачную форму. И вы можете сохранить my.settings, но убедитесь, что вы создали установщик (установку), иначе, когда он изменит местоположение приложения, файл настроек будет обновлен.

OctaCode 28.05.2019 14:38

и рассмотрите возможность создания случаев, когда у вас есть что-то подобное, или подпрограммы/функции для вызова, чтобы предотвратить повторения

OctaCode 28.05.2019 14:52

@Devcon Это точка зрения, о которой я не думал. Вместо этого я пойду на это, спасибо. Однако это все еще не решает мою текущую проблему.

Simbiose 28.05.2019 16:02

это может быть связано с тем, что вы сказали, что элементы инструментов отображаются в зависимости от того, какую форму вы установили в качестве первой формы для загрузки, вы можете попробовать, и мы посмотрим, что произойдет

OctaCode 28.05.2019 16:08

В методе Private Sub btnLogin_Click есть это утверждение fMainForm.ChefesToolStripMenuItem.Enabled = True и несколько других, которые устанавливают fMainForm родительские функции. Однако мы не видим, где объявлено fMainForm. Когда вы наводите курсор мыши на fMainForm, отображается ли «Свойство My.My.MyProject.MyForms.fMainForm как fMainForm»? Если это так, то это источник вашей проблемы, поскольку это адский экземпляр по умолчанию, и позже вы создаете новый fMainForm и отображаете его.

TnTinMn 28.05.2019 18:13

@TnTinMn О Боже ... Да, это действительно причина нынешнего поведения. Мне просто нужно было изменить цепочку подчинения с основной формы на призрачную. Кажется, что все работает так, как должно быть. Спасибо за помощь!

Simbiose 28.05.2019 19:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
18
125
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Благодаря TnTinMn ответ заключался в простом создании экземпляра основной формы в форме-призраке при объявлении переменной как общедоступной общей переменной. Затем все, что требовалось, это вызвать элементы меню через эту переменную.

Код для события загрузки Ghost Form:

Public Class fGhostForm

    Public Shared MainForm As fMainForm

    Private Sub fGhostForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.Close()
    End Sub

    Private Sub fGhostForm_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
        If My.Settings.FirstRun Then
            Dim FormToLaunch As fFirstRunApplicationSettings = New fFirstRunApplicationSettings()
            FormToLaunch.ShowDialog()
        Else
            MainForm = New fMainForm()
            MainForm.ShowDialog()
        End If
    End Sub
End Class

Код для вызова и управления элементами меню:

fGhostForm.MainForm.ChefesToolStripMenuItem.Enabled = True
fGhostForm.MainForm.ChefesToolStripMenuItem.Visible = True

Спасибо всем за уделенное время.

Другие вопросы по теме