NEW! Вопросы по UserControl: проблема c сохранением свойств

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

NEW! Вопросы по UserControl: проблема c сохранением свойств

Сообщение Wolfie » 06.01.2007 (Сб) 21:22

Приветствую - для знающего - ответ 1 минута - но для меня - тупик. Начал писать UC -
1.(уже все ясно) нужно сделать нормальное свойство FONT чтобы его PropertyBrowser показывал как пологается и чтобы всякие label.font=UC.Font работали... Как мне эти Let-Get описать? как stdFont объявлять или что?
2.(уже все ясно) можно ли вызвать из кода PropertyPage, ну чтобы не только создатель программы но и пользователь мог менять через PropertyBrowser свойства?
3.(уже все ясно) Возник еще вопрос - как можно сделать так, чтобы например кликнул по этому контролу, а в конкретном текстбоксе произошли изменения? Ну т.е. проассоциировать мой контрол с каким-либо другим контролом
4. (уже все ясно)Проблема: что-то я делаю не так (вернее как раз что-то не делаю) и после того как поменяю свойства в (Custom) [через PropPage] или даже через само окно свойств - свойства задаются только в дизайн-модэ, а в Рантайме опять стандартный.... что надо сделать?

Благодарю за ответы - если пошлете по ХОРОШЕЙ ссылки - схожу ;) :wink:

CASE CLOSED \ Тема закрыта
Последний раз редактировалось Wolfie 26.01.2007 (Пт) 21:08, всего редактировалось 7 раз(а).
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

BV
Thinker
Thinker
Аватара пользователя
 
Сообщения: 3987
Зарегистрирован: 12.09.2004 (Вс) 0:55
Откуда: Молдавия, г. Кишинёв

Сообщение BV » 06.01.2007 (Сб) 21:39

1. Да, как StdFont
2. Зачем PropertyPage? Разве окно Properties свойств не меняет?
const char *out = "|*0>78-,+<|"; size_t cc = char_traits<char>::length(out);
for (size_t i=0;i<cc;i++){cout<<static_cast<char>((out[i]^89));}cout<<endl;

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 06.01.2007 (Сб) 22:21

BV
1. с stdFont -не получается - через лет-гет все время ошибка что With Block не выбран, а через сет - PropertyBrowser не понимает... привидите пример, если не сложно, пжлст.

2. в том то и дело, что речь идет не о програмере, пользующимся этим ActiveX в DesignMode, а том, чтобы в RunTime вывести эту страницу свойство для конечного пользователя. Ну и насчет PropPage - так удобнее, чем через простые Properties...
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 06.01.2007 (Сб) 22:32

Нужно Get и Set.
Изображение

blinow
Обычный пользователь
Обычный пользователь
 
Сообщения: 53
Зарегистрирован: 27.06.2005 (Пн) 3:13

Сообщение blinow » 07.01.2007 (Вс) 8:02

Ну вот так можно
Код: Выделить всё
Public Property Let BackColorText(ByVal New_BackColor As OLE_COLOR)
    TextB.BackColor = New_BackColor
    Text1.BackColor = TextB.BackColor
    TextI.BackColor = TextB.BackColor
    UserControl.BackColor = TextB.BackColor
    PropertyChanged "BackColorText"
End Property

Public Property Get BackColorlist() As OLE_COLOR
    BackColorlist = ListB.BackColor
End Property

Public Property Let BackColorlist(ByVal New_BackColor As OLE_COLOR)
    ListB.BackColor() = New_BackColor
    PropertyChanged "BackColorList"
End Property

Public Property Get ForeColorText() As OLE_COLOR
    ForeColorText = TextB.ForeColor
End Property

Public Property Let ForeColorText(ByVal New_ForeColor As OLE_COLOR)
    TextB.ForeColor = New_ForeColor
    PropertyChanged "ForeColorText"
End Property

Public Property Get ForeColorList() As OLE_COLOR
    ForeColorList = ListB.ForeColor
End Property

Public Property Let ForeColorList(ByVal New_ForeColor As OLE_COLOR)
    ListB.ForeColor = New_ForeColor
    PropertyChanged "ForeColorList"
End Property

Public Property Get FontText() As Font
    Set FontText = TextB.Font
End Property

Public Property Set FontText(ByVal New_Font As Font)
    Set TextB.Font = New_Font
    Set ListB.Font = New_Font
    PropertyChanged "FontText"
End Property

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
    TextB.BackColor = PropBag.ReadProperty("BackColorText", &H80000005)
    ListB.BackColor = PropBag.ReadProperty("BackColorList", &H80000005)
    TextB.ForeColor = PropBag.ReadProperty("ForeColorText", &H80000012)
    ListB.ForeColor = PropBag.ReadProperty("ForeColorList", &H80000012)
    Set FontText = PropBag.ReadProperty("FontText", Ambient.Font)
End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
    Call PropBag.WriteProperty("BackColorText", TextB.BackColor, &H80000005)
    Call PropBag.WriteProperty("BackColorList", ListB.BackColor, &H80000005)
    Call PropBag.WriteProperty("ForeColorText", TextB.ForeColor, &H80000012)
    Call PropBag.WriteProperty("ForeColorList", ListB.ForeColor, &H80000012)
    Call PropBag.WriteProperty("FontText", TextB.Font, Ambient.Font)
End Sub


schalexey
Обычный пользователь
Обычный пользователь
 
Сообщения: 96
Зарегистрирован: 18.02.2005 (Пт) 17:41
Откуда: Сургут

Сообщение schalexey » 07.01.2007 (Вс) 10:07

Wolfie для начинающего можно использовать встроенную тулзу "VB ActiveX Control Interface Wizard" в Add-In добавляется. Там сможешь свзять все стандартные свойства и события что те надо для контрола со своими. А потом подчистить код

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 08.01.2007 (Пн) 19:08

Спасибо, господа, за помощь - связал :)
я и так использую стандартную Wizard для создания PropPage, но учту

А как быть с пунктами 2 и 3? как в 3 сделать - set ... as Object или as Control или as Что?
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 09.01.2007 (Вт) 19:33

Ну что, никто никогда не пользовался UserControl'ом? Никто не может мне подсказать эти вещи:
2. можно ли вызвать из кода PropertyPage, ну чтобы не только создатель программы но и пользователь мог менять через PropertyBrowser свойства?
3. Возник еще вопрос - как можно сделать так, чтобы например кликнул по этому контролу, а в конкретном текстбоксе произошли изменения? Ну т.е. проассоциировать мой контрол с каким-либо другим контролом
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

VB-constructor
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.07.2006 (Пн) 21:37
Откуда: Ростов-на-Дону

Сообщение VB-constructor » 09.01.2007 (Вт) 21:28

3. Возник еще вопрос - как можно сделать так, чтобы например кликнул по этому контролу, а в конкретном текстбоксе произошли изменения? Ну т.е. проассоциировать мой контрол с каким-либо другим контролом
в свойстве пропиши findwindow и делай, что хочешь
Человек рождён для того, чтобы достичь жизни...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 09.01.2007 (Вт) 22:15

VB-constructor
Сам хоть понял, что сказал?
Wolfie
В Design-mode по идее - никак. Можно, правда, установить имя и индекс целевого контрола, а потом через UserControl.Parent.Controls его вытаскивать, но это некрасиво. В рантайме можно сделать через Property Set объявив как TextBox
Изображение

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 09.01.2007 (Вт) 22:50

keks-n в рантайме так в рантайме, значит
Код: Выделить всё
' UserControl
Dim Targ as TextBox
...
Property Set(Target as textbox)
   set targ=target
end property
...
private sub command1_Click()
targ.seltext="<" & targ.seltext & ">"
end sub
спасибо, попробую. Насчет дизайн-модэ - в коммонконтролах есть контрол который пристраивается к текстбоксу и делает больше\меньше его знчение, и если не ошибаюсь, то он в дизайне с текстбоксом линкится... вот как он это делает... :(
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

VB-constructor
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.07.2006 (Пн) 21:37
Откуда: Ростов-на-Дону

Сообщение VB-constructor » 10.01.2007 (Ср) 0:12

Сам хоть понял, что сказал?

Да
Код: Выделить всё
Dim targ As Long
Property Set sendTextBox(Target as String)
targ = findwindow(Target, "")
SetWindowText targ, "текст"
end property



keks-n


Сам хоть понял, что сказал?

А вы можете нормально общаться на форуме?
Человек рождён для того, чтобы достичь жизни...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.01.2007 (Ср) 4:28

VB-constructor, можем. Только на глупость, сказанную уверенным тоном, будем реагировать именно так. Вот ты её сейчас снова повторил, да ещё и бредовым кодом - поэтому вопрос, сам хоть понял, что сказал?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

VB-constructor
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 160
Зарегистрирован: 24.07.2006 (Пн) 21:37
Откуда: Ростов-на-Дону

Сообщение VB-constructor » 10.01.2007 (Ср) 16:01

Зато рабочим и выполняющим требования автора
Человек рождён для того, чтобы достичь жизни...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.01.2007 (Ср) 16:07

То есть (на время опустим остальные аспекты бредовости этого кода) ты его даже не удосужился проверить.
Ну-ну.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 10.01.2007 (Ср) 16:23

3. читай про биндинг коллекшен, примеры смотри в сборнике примеров , которые идут к VS 6.0

ЗЫ
или я не совсем понял что ты хочешь получить. может ты хочешь сделать что-то похожее на UpDown контрол? тогда это все ручками надо позиционировать, а внешний контрол, к которому привязываешься искать через UserControl.ParentControls

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 12.01.2007 (Пт) 19:48

Насчет 3 - спасибо, господа! хорошо работает вариант с set...as textbox :) Насчет UpDown - именно о нем я и говорил, т.е. в идеале - чтобы в дизайн-модэ связывать по имени с произвлольным текст-боксом, но и так хорошо :)

Видимо, без Ваших советов мне контрол не дописать... насчет 4 и 2 подсобите!
Не хочется дублировать PropPage на отдельной форме
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 14.01.2007 (Вс) 23:24

Я же правдо не знаю! :bounce:
4. Проблема: что-то я делаю не так (вернее как раз что-то не делаю) и после того как поменяю свойства в (Custom) [через PropPage] или даже через само окно свойств - свойства задаются только в дизайн-модэ, а в Рантайме опять стандартный.... что надо сделать?
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 15.01.2007 (Пн) 11:36

2. Можно (GUID свой только поставь)

Код: Выделить всё
Private Type GUID
    Data1                   As Long
    Data2                   As Integer
    Data3                   As Integer
    Data4(7)                As Byte
End Type

Private Declare Function CLSIDFromString Lib "ole32.dll" (ByVal lpszProgID As Long, pCLSID As GUID) As Long
Private Declare Function GetSystemDefaultLCID Lib "kernel32" () As Long
Private Declare Function OleCreatePropertyFrame Lib "oleaut32.dll" (ByVal hWndOwner As Long, ByVal x As Long, ByVal y As Long, ByVal lpszCaption As Long, ByVal cObjects As Long, ByRef ppUnk As Long, ByVal cPages As Long, ByRef pPageClsID As GUID, ByVal lcid As Long, ByVal dwReserved As Long, ByVal pvReserved As Long) As Long
'

Public Sub ShowMyProperty(ByVal hWnd As Long, ByVal Caption As String, ByRef MyObject As Object)
Dim CLSID As GUID
'эту константу надо заменить на свою
Const myGeneralPage = "{CC72240A-CFB5-4124-A007-296F23BC7822}"

    CLSIDFromString StrPtr(myGeneralPage), CLSID
    OleCreatePropertyFrame hWnd, 0&, 0&, StrPtr(Caption), 1, ObjPtr(MyObject), 1, CLSID, GetSystemDefaultLCID, 0&, 0&

End Sub

Public Sub ShowFontProperty(ByVal hWnd As Long, ByVal Caption As String, ByRef MyObject As Object)
Dim CLSID As GUID

    CLSIDFromString StrPtr("{7EBDAAE0-8120-11CF-899F-00AA00688B10}"), CLSID
    OleCreatePropertyFrame hWnd, 0&, 0&, StrPtr(Caption), 1, ObjPtr(MyObject), 1, CLSID, GetSystemDefaultLCID, 0&, 0&

End Sub


Вызов из контрола:

Код: Выделить всё
Private Sub UserControl_DblClick()
        ShowMyProperty hWnd, "Основные свойства", Me
        RaiseEvent DblClick
End Sub

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 15.01.2007 (Пн) 20:03

Konst_One спасибо, а мне как этот GUID получить - самому как-то нехочется придумывать - их там столько в реестре :)
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 17.01.2007 (Ср) 11:30

когда скопилишь свой OCX в реестре найдешь GUID для его PropertyPage

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 20.01.2007 (Сб) 21:14

Konst_One
Спасибо - знаю где копаться теперь! Но у меня кстати не OCX - все равно прокатит? (UC в EXE)

ALL Ну не знаю я как мне сохранять свойства в контроле!
4. Проблема: что-то я делаю не так ...
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _

Wolfie
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 213
Зарегистрирован: 06.03.2006 (Пн) 18:52
Откуда: Россия, Москва, СЗАО

Сообщение Wolfie » 24.01.2007 (Ср) 17:50

Всем спасибо, моя проблема решилась в http://bbs.vbstreets.ru/viewtopic.php?p=6649896
··•··•••··•··••·•·•·•···••·•••···•···•••·•··•·•··
C:\> per asper ad astra
'ASTRA' answer: Path 'ASPER' Not Found
684 Errare humanum est!
C:\> _


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 120

    TopList