Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Нет нет никакого метода, чтобы получить доступ или перенаправить текст кнопки Messagebox по умолчанию.
единственный способ сделать это должно кодировать Ваше собственное или просто использовать один из многих свободных из Интернета:
Нет.
необходимо будет сделать пользовательскую форму с FormBorderType = FixedDialog
.
Вот немного учебного руководства:
James D. Murray на июне 12 2007, под 70-526
Microsoft Certification Exam: 70-526 (MCTS)
Цель: Создайте и используйте пользовательские диалоговые окна в приложениях Windows Forms.
Язык: Visual Basic 2005 (щелкают здесь для версии C# этой записи)
я помню первый раз, когда я должен был создать диалоговое окно в приложении.NET, которое я писал в C#. Будучи давним программистом Visual Basic, я предположил, что это могло легко быть выполнено при помощи шаблона диалогового окна, включенного с Визуальным Studio.NET. К моему удивлению никакой такой шаблон формы не существовал для C#, хотя каждый делает для Visual Basic 2005. После прохождения через несколько книг и Веб-страниц, заполненных информацией о программировании Windows Forms 2.0, основной набор шагов стал очевидным для меня для того, чтобы вручную преобразовать форму.NET в диалоговое окно Windows:
Шаг 1: Добавьте Форму к своему проекту.NET и назовите его “DialogBoxForm”.
Шаг 2: Отбросьте две кнопки в нижней правой области Формы и назовите их “OKButton” и “CancelButton”.
Шаг 3: Измените следующие свойства Формы для корректировки ее внешнего вида и поведения, чтобы быть похожими на стандартное диалоговое окно:
Property Value Description ----------------------------------------------------------------------------------------------------------------------------- AcceptButton OK button instance Causes form to return value DialogResult.OK. Only used on modal dialog boxes. CancelButton Cancel button instance Causes form to return value DialogResult.Cancel. Only used on modal dialog boxes. FormBorderStyle FixedDialog Create a non-sizable form with no control box on the title bar. HelpButton True The Help button appears in the caption bar next to the Close button. The ControlBox property must be True for these buttons to be visible. MaximizeBox False Hide the Maximize button in the title bar. MinimizeBox False Hide the Minimize button in the title bar. ShowIcon False The title bar icon is not visible in a dialog box. ShowInTaskBar False Do not indicate the presence of the form on the Windows Task Bar. Start Position CenterParent The initial position of a dialog box is over its parent form. Size As Needed The fixed size needed for the dialog box.
Эти свойства могут быть установлены с помощью Окна свойств для формы, или с помощью кода, помещенного в событие Form’s Load:
Me.AcceptButton = OKButton
Me.CancelButton = CancelButton
Me.FormBorderStyle = Windows.Forms.FormBorderStyle.FixedDialog
Me.HelpButton = True
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.ShowInTaskbar = False
Me.ShowIcon = False
Me.StartPosition = FormStartPosition.CenterParent
Шаг 4: Добавьте следующие обработчики событий нажатия кнопки к Форме:
Private Sub OKButton_Click(ByVal sender As Object, _ByVal e As EventArgs) ' User clicked the OK button Me.DialogResult = Windows.Forms.DialogResult.OK End Sub Private Sub CancelButton_Click(ByVal sender As Object, _ByVal e As EventArgs) ' User clicked the Cancel button Me.DialogResult = Windows.Forms.DialogResult.Cancel End Sub
Шаг 5: Добавьте свойства, что необходимо переместить данные в и из диалогового окна, как Вы были бы для любой Формы:
Private _LoginName As String Private _LoginPassword As String Public Property LoginName() As String Get Return _LoginName End Get Set(ByVal value As String) _LoginName = value End Set End Property Public Property LoginPassword() As String Get Return _LoginPassword End Get Set(ByVal value As String) _LoginPassword = value End Set End Property
Шаг 6: Покажите диалоговое окно модально путем вызова ShowDialog () формы:
Public Sub ShowDialogBox() Dim dialog As New DialogBoxForm dialog.LoginName = "JDMurray" dialog.LoginPassword = String.Empty If dialog.ShowDialog() = Windows.Forms.DialogResult.OK Then Debug.WriteLine("Login Name: " & dialog.LoginName) Debug.WriteLine("Password: " & dialog.LoginPassword) Else ' User clicked the Cancel button End If End Sub
Шаг 7: Для показа диалогового окна modelessly назовите Шоу () методом DialogBoxForm вместо этого. Необходимо будет добавить обработчик событий к событию Close DialogBoxForm для знания, когда пользователь закроет диалоговое окно:
Public Sub ShowDialogBox() Dim dialog As DialogBoxForm = New DialogBoxForm dialog.LoginName = "JDMurray" dialog.Password = String.Empty AddHandler dialog.FormClosed, AddressOf dialog_FormClosed dialog.Show() ' The Show() method returns immediately End Sub Private Sub dialog_FormClosed(ByVal sender As Object, _ ByVal e As FormClosedEventArgs) ' This method is called when the user closes the dialog box End Sub
MessageBox использует простое окно, которое может быть смешано с подобным любое другое окно. Это уже было возможно в Windows в течение очень долгого времени, хорошо более чем 20 лет. Методы становятся неясными, хотя, слишком много дружественных оберток класса, которые скрывают собственный winapi и не выставляют все, которое можно сделать с ним. Так так, чтобы программисты теперь автоматически предполагают, что это не возможно, как можно сказать из ответов upvoted. Это - вид программирования, которое Petzold преподавал нам в его оригинальной "книге" Windows Программирования. Замену MessageBox с пользовательской Формой или Окном на самом деле довольно трудно сделать, это делает нетривиальное автоматическое расположение для установки тексту и локализации поддержек без справки. Хотя это точно, что Вы, кажется, не любите :)
Anyhoo, окно окна сообщения легко найти назад. Это принадлежит потоку UI и имеет специальное имя класса, которое делает это уникальным. EnumThreadWindows () перечисляет окна, принадлежавшие потоку, GetClassName () позволяет Вам проверить вид окна. Затем просто введите текст по абсолютному адресу в кнопку с SetWindowText ().
Добавляют новый класс к Вашему проекту и вставляют код, показанный ниже. Вызовите его с кодом как это:
Nobugz.PatchMsgBox(New String() {"Da", "Njet"})
MsgBox("gack", MsgBoxStyle.YesNo)
Вот код:
Imports System.Text
Imports System.Runtime.InteropServices
Public Class Nobugz
Private Shared mLabels() As String '' Desired new labels
Private Shared mLabelIndex As Integer '' Next caption to update
Public Shared Sub PatchMsgBox(ByVal labels() As String)
''--- Updates message box buttons
mLabels = labels
Application.OpenForms(0).BeginInvoke(New FindWindowDelegate(AddressOf FindMsgBox), GetCurrentThreadId())
End Sub
Private Shared Sub FindMsgBox(ByVal tid As Integer)
''--- Enumerate the windows owned by the UI thread
EnumThreadWindows(tid, AddressOf EnumWindow, IntPtr.Zero)
End Sub
Private Shared Function EnumWindow(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
''--- Is this the message box?
Dim sb As New StringBuilder(256)
GetClassName(hWnd, sb, sb.Capacity)
If sb.ToString() <> "#32770" Then Return True
''--- Got it, now find the buttons
mLabelIndex = 0
EnumChildWindows(hWnd, AddressOf FindButtons, IntPtr.Zero)
Return False
End Function
Private Shared Function FindButtons(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
Dim sb As New StringBuilder(256)
GetClassName(hWnd, sb, sb.Capacity)
If sb.ToString() = "Button" And mLabelIndex <= UBound(mLabels) Then
''--- Got one, update text
SetWindowText(hWnd, mLabels(mLabelIndex))
mLabelIndex += 1
End If
Return True
End Function
''--- P/Invoke declarations
Private Delegate Sub FindWindowDelegate(ByVal tid As Integer)
Private Delegate Function EnumWindowDelegate(ByVal hWnd As IntPtr, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function EnumThreadWindows Lib "user32.dll" (ByVal tid As Integer, ByVal callback As EnumWindowDelegate, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function EnumChildWindows Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal callback As EnumWindowDelegate, ByVal lp As IntPtr) As Boolean
Private Declare Auto Function GetClassName Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal name As StringBuilder, ByVal maxlen As Integer) As Integer
Private Declare Auto Function GetCurrentThreadId Lib "kernel32.dll" () As Integer
Private Declare Auto Function SetWindowText Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal text As String) As Boolean
End Class
Код C# для выполнения того же самого может быть найден в статье под форумом MSDN, https://forums.microsoft.com/MSDN/ShowPost.aspx? PostID=3087899& SiteID=1.
Есть решение. Установив CBT-хук, можно "на лету" настроить широкий спектр визуальных параметров MessageBox: шрифты сообщений и кнопок, фон диалога, позиционирование диалога, иконки, надписи кнопок, таймаут, даже вставка дополнительных элементов управления.
Полное решение: Расширенная сборка MessageBox .NET http://www.news2news.com/vfp/?solution=5
Это полнофункциональная пробная версия, обычная версия включает полный исходный код на C#.