Короче говоря, я разработал приложение и на его финальных стадиях задумался над созданием формы для первого запуска приложения, где пользователь (админ) будет задавать некоторые управляющие переменные.
Чтобы добиться этой функциональности, я должен был убедиться, что существует форма, которая будет контролировать, «видит» ли пользователь приложение в первый раз или нет, называя его формой-призраком (эта форма не будет видна) .
Эта «призрачная» форма будет проверять, является ли переменная 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», и появится новая форма, в которой пользователь должен ввести свои учетные данные:
После входа в систему, в зависимости от того, какой уровень безопасности имеет пользователь, в строке меню главной формы должны появиться новые элементы полосы инструментов. Теперь вот проблема:
Если я установлю «fMainForm» в качестве формы запуска для проекта, это произойдет. Однако, если я установлю «fGhostForm» в качестве формы запуска, я увижу всплывающую основную форму, но после входа в систему инструменты не отображаются вообще.
Чтобы изолировать проблему, я решил создать тестовую кнопку, просто чтобы создать новый экземпляр основной формы, вызвав ее точную копию. Теперь, когда я выполняю шаг входа в систему, в основной форме, которая была вызвана нажатием кнопки тестирования, элементы инструментов не отображаются. Однако в первой основной форме элементы toolstripitems отображаются так, как должны (я сделал это с «fMainForm» в качестве стартовой формы для проекта):
Это код тестовой кнопки:
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 теперь имеет значение False, и его невозможно сбросить. Вы даже не можете оказать помощь, когда он вам звонит, этот файл user.config почти невозможно найти обратно. Принадлежит элементу меню «Параметры» или файлу app.config, редактируемому администратором.
Пользователю будет оказана помощь в самой форме... Кроме того, здесь мы избавляемся от проблемы. Мне просто нужно знать, почему у toolstripitems такое поведение... Как я уже сказал, все, чем мне нужно поделиться, чтобы решить эту проблему, я поделюсь, я просто не знаю, чем еще поделиться, кроме того, что я уже сделал... Я разместил событие загрузки основной формы, и полоса меню, а также элементы инструментов были нарисованы из дизайнера, поэтому код был сгенерирован автоматически. Я также опубликовал, что делает тестовая кнопка, и на скриншотах показан сценарий. Что еще я могу опубликовать?
@ADyson Хорошо ... скажем так. Я хочу, чтобы пользователь увидел форму A при первом запуске. Пользователь устанавливает переменные для первого запуска. После первого запуска приложения, когда пользователь запускает его снова, появляется форма B. Если у меня нет формы, скрытой для этой переменной, как я могу это сделать (кроме основной подпрограммы, о которой я упоминал ранее)? Я не могу писать код на форме B, иначе это всегда будет стартовая форма.
Можете ли вы показать код после входа пользователя в систему, где вы пытаетесь сделать видимыми дополнительные элементы ToolStripItem?
Прошу прощения, так как я виноват... Я не понял, что не поделился событием загрузки формы основной формы. Я сразу же опубликую это, а также событие входа в систему.
Вы можете просто написать код в своем методе Main, прежде чем вызывать Application.Run(). Вы можете проверить значение вашей переменной firstRun и использовать ее, чтобы решить, какую форму отображать (A или B). Если это не сработало для вас, было бы лучше показать этот код и исправить его, потому что это очевидное решение.
Я попробовал основной вспомогательный подход, отключив структуру приложения в проекте и выбрав Sub Main в качестве объекта запуска. Затем я написал точно такой же код для Sub (код, который отображается здесь в событии fGhostForm_FormClosed). Поведение toolstripitems такое же, как и в подходе Ghost Form. Поэтому я предполагаю, что если я выясню, почему это происходит, и решу ее, я могу вернуться к использованию основного вспомогательного подхода.
Для меня я бы использовал реестр при настройке и сохранил там значение, он проверит для меня, новый он или нет, при настройке сделайте его 0, первый запуск, показать форму настроек, установить значение 1, при следующем запуске уже 1 основной форма покажет..
@Devcon Я думал пойти по этому пути, но в моем случае это невозможно, потому что в приложении есть опция, которая позволяет пользователям с определенным уровнем доступа (например, администратором) восстановить настройки приложения по умолчанию и это момент, у меня не будет возможности проверить, запускается ли приложение впервые или нет. Проще говоря, каждый раз, когда приложение восстанавливается до настроек по умолчанию, флаг FirstRun будет обновляться до true.
@Simbiose, с какой проблемой вы столкнетесь, если вы сделаете настройки из своей первой формы для загрузки? Хорошо, как насчет того, чтобы сначала запустить форму настроек, а при загрузке проверить, используется ли она в первую очередь, если верно, сохранить ее, если нет, закрыть и запустить основную форму, вот как вы удаляете свою призрачную форму. И вы можете сохранить my.settings, но убедитесь, что вы создали установщик (установку), иначе, когда он изменит местоположение приложения, файл настроек будет обновлен.
и рассмотрите возможность создания случаев, когда у вас есть что-то подобное, или подпрограммы/функции для вызова, чтобы предотвратить повторения
@Devcon Это точка зрения, о которой я не думал. Вместо этого я пойду на это, спасибо. Однако это все еще не решает мою текущую проблему.
это может быть связано с тем, что вы сказали, что элементы инструментов отображаются в зависимости от того, какую форму вы установили в качестве первой формы для загрузки, вы можете попробовать, и мы посмотрим, что произойдет
В методе Private Sub btnLogin_Click
есть это утверждение fMainForm.ChefesToolStripMenuItem.Enabled = True
и несколько других, которые устанавливают fMainForm
родительские функции. Однако мы не видим, где объявлено fMainForm
. Когда вы наводите курсор мыши на fMainForm
, отображается ли «Свойство My.My.MyProject.MyForms.fMainForm как fMainForm»? Если это так, то это источник вашей проблемы, поскольку это адский экземпляр по умолчанию, и позже вы создаете новый fMainForm
и отображаете его.
@TnTinMn О Боже ... Да, это действительно причина нынешнего поведения. Мне просто нужно было изменить цепочку подчинения с основной формы на призрачную. Кажется, что все работает так, как должно быть. Спасибо за помощь!
Благодаря 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
Спасибо всем за уделенное время.
Зачем нужна призрачная форма? Вы можете проверить FirstRun в событии загрузки вашей MainForm и отобразить форму настройки в виде диалогового окна.