Рейтинг@Mail.ru

Отсев резко отличающихся наблюдений в малых выборках

Published in Программирование

Предлагается программный класс, написанный под .NET на языках C# и VB.NET, который позволяет находить и отсеивать резко отличающиеся значения (грубые погрешности) в малых выборках наблюдений.

Читать далее...

WPF: Как использовать свойство объекта в качестве параметра конвертера IValueConverter.ConverterParameter

Published in Программирование

Допустим, у нас есть объект MyObject со свойствами MyData и MyProperty. Для его отображения в графическом пользовательском интерфейсе, построенном на XAML, мы хотим использовать эти два свойства, преобразовав MyData с помощью IValueConverter, а MyProperty использовать в качестве параметра конвертера ConverterParameter. Реально ли это?

Читать далее...

Как программно создать копию экземпляра класса в .NET

Published in Полезные советы

Чтобы создать копию экземпляра класса в приложении .NET, его нельзя просто присвоить значению другого объекта. Как известно, классы в .NET относятся к ссылочному типу, и при присваивании объекта другому объекту, будет присвоена только ссылка на исходный объект. А при попытке изменить какое-то из полей или свойств вновь созданного объекта, изменится соответствующее поле или свойство исходного объекта. Поэтому, как вариант, можно поступить так (код на VB.NET):

Public Shared Function GetCopy(ByVal myOriginalObject As MyObject) As MyObject

  'Получаем список публичных свойств экземпляра типа MyObject:'
  Dim props() As PropertyInfo = myOriginalObject.GetType.GetProperties(BindingFlags.Public Or BindingFlags.Instance)
  Dim myObjectCopy As New MyObject
 
  'Копируем значения всех свойств, доступных для записи:'
  For Each pi As PropertyInfo In props
    If pi.CanWrite Then
      Dim value As Object = pi.GetValue(myOriginalObject, Nothing)
        pi.SetValue(myObjectCopy, value, Nothing)
      End If
    Next
 
    Return myObjectCopy
 
End Function

Можно воспользоваться и таким решением:

Dim newObj as Object = obj.MemberwiseClone()

Нужно учесть, что этот метод MemberwiseClone() копирует объект не полностью. Члены значимого типы копируются, а ссылочного – нет, копируется только ссылка.

Читать далее...

Перенос текста TextWrapping в XAML

Published in Полезные советы

Зачастую нужно чтобы текст переносился на следующую строку, занимая всю ширину родительского элемента. За это отвечает свойство TextWrapping.Распространённые случаи:

<ListView HorizontalContentAlignment="Stretch" ScrollViewer.HorizontalScrollBarVisibility="Disabled">

Элементы ListViewItem при этом должны быть типа TextBlock, а горизонтальная полоса прокрутки HorizontalScrollBar отключена.

Или другой случай:

<GroupBox.Header>
  <TextBlock TextWrapping="Wrap" Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type GroupBox}}, Path=ActualWidth}" />
</GroupBox.Header>

Вместо GroupBox.Header может быть любой контейнер. Важно, что ширина устанавливается с помощью привязки к актуальной ширине ActualWidth родителя.

Читать далее...

Пример использования типа Lookup() в VB.NET

Published in Программирование

При хранении некоторых видов данных удобно использовать коллекции типа пара «ключ-значение» (тип KeyValuePair). В .NET для этого существует специальный тип Dictionary() – словарь, позволяющий хранить такие данные, добавлять и удалять данные в процессе выполнения программы, а также быстро и удобно извлекать их из словаря. Данные извлекаются по уникальному ключу. При попытке добавить значение с ключом, который уже существует в словаре, возникает исключение. Но что делать, если в реальных данных имеется ключ, которому соответствуют несколько разных значений? Для такого случая подойдёт тип Lookup(), работу с которым мы и рассмотрим далее.

Читать далее...

Как добавить обработчик неперехваченных исключений в WinForms (VB.NET)

Published in Полезные советы

Чтобы обработать неперехваченное исключение в приложение .NET, в основной модуль сборки, в процедуру загрузки главной формы приложения или в класс AppEvents.vb, добавим код:

Private Sub formLoading(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
    AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf onUnhandledException
End Sub

Собственно, сам обработчик исключения типа UnhandledException:

Private Sub onUnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
    MessageBox.Show(String.Format("Источник:{0}. Описание:{1}", sender, e.ExceptionObject), "Возникло необработанное исключение")
    '[Какая-то обработка...]'
End Sub

Теперь, при возникновении исключительной ситуации, которая не была обработана в коде приложения, она будет обработана в данной процедуре.

Читать далее...

MethodNotFoundException в Dispatcher.Invoke() в .NET версии 3.5

Published in Полезные советы

В .NET версии 3.5 без установленного пакета обновления SP1 метод Dispatcher.Invoke() вызывает исключение MethodNotFoundException. При этом средство IntelliSence в Visual Studio показывает порядок аргументов, передаваемых методу: делегат, [параметры].

Чтобы не вызывать исключение, нужно передавать методу Dispatcher.Invoke() параметры в следующем порядке: приоритет операции, делегат, [параметры]. Например (код на VB.NET):

Dispatcher.Invoke(DispatcherPriority.Normal, 
New myDeleg(AddressOf MyDelegate))
Читать далее...

Реализация SPI с помощью микросхем фирмы FTDI

Published in Программирование

Рассматриваются основные этапы программной реализации работы в режиме последовательного интерфейса SPI микросхем семейств FT2xx и FT4xx фирмы FTDI. А также предлагается готовое бесплатное программное обеспечение, которое реализует этот режим (а также I2C, 1-Wire, uWire). С помощью данной программы можно читать (и записывать) информацию с множества датчиков и прочих устройств, которые работают по интерфейсам SPI, I2C, OneWire, MicroWire.

Читать далее...
Subscribe to this RSS feed