Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
 Аватар для Petr_S
213 / 230 / 87
Регистрация: 21.04.2013
Сообщений: 404

Как правильно сделать свое свойство-структуру

18.06.2014, 17:10. Показов 3140. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Как правильно сделать свое свойство-структуру? Типа Location, Size и т.п.
Я делаю так:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Public Class UC
    Inherits UserControl
 
    Sub New()
        _Prop = New Struc With {.p1 = 1, .p2 = 2}
    End Sub
 
    Private _Prop As Struc
    Public Property Prop As Struc
        Get
            Return _Prop
        End Get
        Set(ByVal value As Struc)
            _Prop = value
        End Set
    End Property
End Class
 
Public Structure Struc
    Dim p1 As Integer
    Dim p2 As Integer
End Structure
Работает, но в свойствах вместо конкретных данных получается, как на картинке.
А хотелось бы, чтобы было как у свойства Size.
Миниатюры
Как правильно сделать свое свойство-структуру  
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.06.2014, 17:10
Ответы с готовыми решениями:

Как правильно сделать структуру сайта
Пожалуйста подскажите хочу сделать сайт по структуре очень похожий на http://vopros-remont.ru/ / Вопрос заключается как правильно сделать...

Как правильно сделать структуру в Laravel не нарушая MVC?
Добрый день.Первый раз работаю с Laravel,читаю много информации в Интернете, и меня смущает,то в что МНОГО информации о том,что данные со...

Пытаюсь правильно сделать своё приложение RestFull
Учусь ASP.NET MVC 5. Пишу первое приложение. Домашняя бухгалтерия. Надо забить список товаров, групп товаров, магазинов и покупки. В чём...

5
Почетный модератор
 Аватар для Памирыч
23251 / 9163 / 1084
Регистрация: 11.04.2010
Сообщений: 11,014
18.06.2014, 18:18
Petr_S, попробуйте переопределить метод ToString в структуре, пока навскидку только это
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
18.06.2014, 22:15
VB.NET
1
2
3
4
5
6
7
8
9
    Private _Prop As Struc
    Public Property Prop As Struc
        Get
            Return _Prop
        End Get
        Set(ByVal value As Struc)
            _Prop = value
        End Set
    End Property
Подобный код сгенерирует компилятор, если вы напишите лишь одну строку
VB.NET
1
Public Property Prop As Struc
Petr_S, я так и не понял, что за скрин вы привели? Здесь другой тип - вы хотите такой же вывод?
Тогда, по Памирычу
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Module MainModule
    Sub Main()
        Dim s = New MyStructure With {.x = 20, .y = -4}
        Console.WriteLine(s)  ' 20; -4
    End Sub
 
    Structure MyStructure
        Dim x As Integer
        Dim y As Integer
        Public Overrides Function ToString() As String
            Return String.Format("{0}; {1}", x, y)
        End Function
    End Structure
End Module
0
 Аватар для Petr_S
213 / 230 / 87
Регистрация: 21.04.2013
Сообщений: 404
18.06.2014, 22:56  [ТС]
Цитата Сообщение от tezaurismosis Посмотреть сообщение
я так и не понял, что за скрин вы привели?
Я хочу сделать так, чтобы я мог задавать значения своего свойства в окне свойств так, как это можно делать, например, для свойства .Size. Т.е. задавать два значения, разделенных точкой с запятой. А не только выводить эти значения.
0
Администратор
Эксперт .NET
 Аватар для tezaurismosis
9673 / 4825 / 763
Регистрация: 17.04.2012
Сообщений: 9,664
Записей в блоге: 14
18.06.2014, 23:28
Petr_S, тогда интереснее - нужно поиграться с атрибутами из System.Windows.ComponentModel
К свойствам приписывают атрибуты для придания им определённого поведения в редакторе.
Вот код свойства Size у Form
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
   [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
    [Localizable(false)]
    public new Size Size
    {
      get
      {
        return base.Size;
      }
      set
      {
        base.Size = value;
      }
    }
и у Control
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    [Localizable(true)]
    [SRCategory("CatLayout")]
    [SRDescription("ControlSizeDescr")]
    public Size Size
    {
      get
      {
        return new Size(this.width, this.height);
      }
      set
      {
        this.SetBounds(this.x, this.y, value.Width, value.Height, BoundsSpecified.Size);
      }
    }
Предлагаю установить dotPeek и хорошо всё это исследовать.
2
 Аватар для vova2112
148 / 136 / 34
Регистрация: 28.02.2014
Сообщений: 165
29.08.2021, 10:30
Хоть и прошло много времени:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
    Private pt1 As New Proba(10, 0.1!)
    Public Property Prop() As Proba
        Get
            Return pt1
        End Get
        Set
            pt1 = Value
        End Set
    End Property
 
    <Serializable, StructLayout(LayoutKind.Sequential), TypeConverter(GetType(ProbaConverter)), ComVisible(True)>
    Public Structure Proba
        Public Sub New(ByVal alpha As Integer, ByVal ratio As Single)
            If alpha > 255 OrElse alpha < 10 Then
                Throw New ArgumentOutOfRangeException("Alpha", "Диапазон допустимых значений от '10' до '255'")
            End If
            Me._Alpha = alpha
            If ratio > 0.9! OrElse ratio < 0.1! Then
                Throw New ArgumentOutOfRangeException("Ratio", "Диапазон допустимых значений от '0,1' до '0,9'")
            End If
            Me._Ratio = ratio
        End Sub
 
        Public ReadOnly Property Alpha As Integer
        Public ReadOnly Property Ratio As Single
    End Structure
 
Public Class ProbaConverter
    Inherits TypeConverter
 
    Public Overrides Function CanConvertFrom(ByVal context As ITypeDescriptorContext, ByVal sourceType As Type) As Boolean
        Return ((sourceType Is GetType(String)) OrElse MyBase.CanConvertFrom(context, sourceType))
    End Function
 
    Public Overrides Function CanConvertTo(ByVal context As ITypeDescriptorContext, ByVal destinationType As Type) As Boolean
        Return ((destinationType Is GetType(InstanceDescriptor)) OrElse MyBase.CanConvertTo(context, destinationType))
    End Function
 
    Public Overrides Function ConvertFrom(ByVal context As ITypeDescriptorContext, ByVal culture As CultureInfo, ByVal value As Object) As Object
        Dim str As String = TryCast(value, String)
        If (str Is Nothing) Then
            Return MyBase.ConvertFrom(context, culture, value)
        End If
        Dim str2 As String = str.Trim
        If (str2.Length = 0) Then
            Return Nothing
        End If
        If (culture Is Nothing) Then
            culture = CultureInfo.CurrentCulture
        End If
        Dim ch As Char = culture.TextInfo.ListSeparator.Chars(0)
        Dim separator As Char() = New Char() {ch}
        Dim strArray As String() = str2.Split(separator)
        Dim numArray As Single() = New Single(strArray.Length - 1) {}
        Dim converter As TypeConverter = TypeDescriptor.GetConverter(GetType(String))
        For i As Integer = 0 To numArray.Length - 1
            numArray(i) = CSng(converter.ConvertFromString(context, culture, strArray(i)))
        Next i
        If (numArray.Length = 2) Then
            If numArray(0) > 255 OrElse numArray(0) < 10 Then
                Throw New ArgumentOutOfRangeException("Alpha", "Диапазон допустимых значений от '10' до '255'")
            End If
            If numArray(1) > 0.9! OrElse numArray(1) < 0.1! Then
                Throw New ArgumentOutOfRangeException("Ratio", "Диапазон допустимых значений от '0,1' до '0,9'")
            End If
            Return New Proba(numArray(0), numArray(1))
        End If
        Throw New ArgumentException("TextParseFailedFormat")
    End Function
 
    Public Overrides Function ConvertTo(ByVal context As ITypeDescriptorContext, ByVal culture As CultureInfo, ByVal value As Object, ByVal destinationType As Type) As Object
        If (destinationType Is Nothing) Then
            Throw New ArgumentNullException("destinationType")
        End If
        If TypeOf value Is Proba Then
            If (destinationType Is GetType(String)) Then
                Dim point As Proba = DirectCast(value, Proba)
                If (culture Is Nothing) Then
                    culture = CultureInfo.CurrentCulture
                End If
                Dim separator As String = (culture.TextInfo.ListSeparator & " ")
                Dim converter As TypeConverter = TypeDescriptor.GetConverter(GetType(Integer))
                Dim strArray As String() = New String(2 - 1) {}
                strArray(0) = converter.ConvertToString(context, culture, point.Alpha)
                strArray(1) = converter.ConvertToString(context, culture, point.Ratio)
                Return String.Join(separator, strArray)
            End If
            If (destinationType Is GetType(InstanceDescriptor)) Then
                Dim point2 As Proba = DirectCast(value, Proba)
                Dim types As Type() = New Type() {GetType(Integer), GetType(Single)}
                Dim constructor As ConstructorInfo = GetType(Proba).GetConstructor(types)
                If (constructor IsNot Nothing) Then
                    Return New InstanceDescriptor(constructor, New Object() {point2.Alpha, point2.Ratio})
                End If
            End If
        End If
        Return MyBase.ConvertTo(context, culture, value, destinationType)
    End Function
 
    Public Overrides Function CreateInstance(ByVal context As ITypeDescriptorContext, ByVal propertyValues As IDictionary) As Object
        If (propertyValues Is Nothing) Then
            Throw New ArgumentNullException("propertyValues")
        End If
        Dim obj2 As Object = propertyValues.Item("Alpha")
        Dim obj3 As Object = propertyValues.Item("Ratio")
        If (((obj2 Is Nothing) OrElse (obj3 Is Nothing)) OrElse (TypeOf obj2 IsNot Integer OrElse TypeOf obj3 IsNot Single)) Then
            Throw New ArgumentException("PropertyValueInvalidEntry")
        End If
        If obj2 > 255 OrElse obj2 < 10 Then
            Throw New ArgumentOutOfRangeException("Alpha", "Диапазон допустимых значений от '10' до '255'")
        End If
        If obj3 > 0.9! OrElse obj3 < 0.1! Then
            Throw New ArgumentOutOfRangeException("Ratio", "Диапазон допустимых значений от '0,1' до '0,9'")
        End If
        Return New Proba(obj2, obj3)
    End Function
 
    Public Overrides Function GetCreateInstanceSupported(ByVal context As ITypeDescriptorContext) As Boolean
        Return True
    End Function
 
    Public Overrides Function GetProperties(ByVal context As ITypeDescriptorContext, ByVal value As Object, ByVal attributes As Attribute()) As PropertyDescriptorCollection
        Dim names As String() = New String() {"Alpha", "Ratio"}
        Return TypeDescriptor.GetProperties(GetType(Proba), attributes).Sort(names)
    End Function
 
    Public Overrides Function GetPropertiesSupported(ByVal context As ITypeDescriptorContext) As Boolean
        Return True
    End Function
End Class
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.08.2021, 10:30
Помогаю со студенческими работами здесь

Как можно добавить свое свойство (переменную) к стандартному объекту?
На форме есть несколько TMemo. На все эти текстовые объекты стоит один и тот-же обработчик OnChange. Обращение к объектам идет через...

Какие теги HTML5 и как правильно нужно их использовать, чтобы сделать оздать нужную структуру сайта
Я читал про новые теги HTML5, но до конца так и не смог разобраться. На разных сайтах по-разному пишут. 1) Нужно ли создавать слой...

Как правильно написать функцию, которая редактирует структуру по полю Name и возвращает новую, исправленную структуру?..
Нужно отредактировать структуру по выбору пользователя. Проблема заключается в создании функции. Подскажите, а лучше покажите, как...

Как правильно организовать своё обучение
Добрый вечер, дорогие) Всегда считал себя довольно грамотным человеком в обращении с компьютерами, в большинстве случаев решал...

Как правильно передать указатель на структуру, и правильно ее использовать
Я планирую сделать сортировку, но компилятор начал ругаться &quot;Нет существует подходящей функции преобразования &quot;Student&quot; в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru