Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу добавить новое свойство к TextBox, ActiveX 
:(
    Опции темы
korob2001
Дата 21.1.2005, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Привет!
Вобщем такая проблема, код из книги "Использование Visual Basic 6.0", со страницы 319 начинается пошаговое объяснение, как усовершенствовать элемент управления ActiveX. В данном случае речь идёт о текстовом поле, к которому нужно добавить свойство CharAccept, которое может иметь 3 значение от 0 до 3:
0 - текстовое поле принимает все символы ( значение по умолчанию )
1 - текстовое поле принимает только буквы и BackSpace
2 - текстовое поле принимает только цифры и BackSpace

Всё делал точно, как написано в книге, вот код:
Код

Option Explicit

Private chCharAccept As Integer
Public Event UserError()

Private Sub txtCharSet_KeyPress(KeyAscii As Integer)
   If KeyAscii = 8 Then Exit Sub
   Select Case chCharAccept
       Case 0
           Exit Sub
       Case 1
           If KeyAscii >= 48 And KeyAscii < 57 Then
               KeyAscii = 0
               Beep
               RaiseEvent UserError
           End If
       Case 2
           If KeyAscii >= 65 And KeyAscii < 90 Then
               Exit Sub
           ElseIf KeyAscii >= 97 And KeyAscii <= 122 Then
               Exit Sub
           Else
               KeyAscii = 0
               Beep
               RaiseEvent UserError
           End If
   End Select
End Sub

Private Sub UserControl_InitProperties()
   chCharAccept = 0
End Sub

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
   chCharAccept = PropBag.ReadProperty("CharAccept", 0)
End Sub

Private Sub UserControl_Resize()
   txtCharSet.Move 0, 0, UserControl.ScaleWidth, UserControl.ScaleHeight
End Sub

Public Property Get CharAccept() As Variant
   CharAccept = chCharAccept
End Property

Public Property Let CharAccept(ByVal vNewValue As Variant)
   Select Case chCharAccept
       Case 1 To 2
           chCharAccept = vNewValue
       Case Else
           chCharAccept = 0
   End Select
   PropertyChanged "CharAccept"
End Property

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
   PropBag.WriteProperty "CharAccept", chCharAccept, 0
End Sub

Вроде всё нормально, проект успешно скомпилирован в .OCX файл.
Добавляю его в новый проект Standard EXE, но не могу изменить новое свойство ни на стадии разработки, ни на стадии выполнения программы. На стадии разработки ввожу в поле CharAccept значение 1, но послетого как убераю фокус с этого поля, то сразу же востанавливается значение по умолчанию, т.е. 0.
Как я понимаю что-то не так в этих процедурах:
Код

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
   chCharAccept = PropBag.ReadProperty("CharAccept", 0)
End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
   PropBag.WriteProperty "CharAccept", chCharAccept, 0
End Sub

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

Заранее спасибо,
Денис

Это сообщение отредактировал(а) korob2001 - 21.1.2005, 23:07


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Gannibal
Дата 21.1.2005, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 742
Регистрация: 15.4.2003
Где: 010101

Репутация: 18
Всего: 17



как я смотрыу в этих процедурах всё нормально, даже пример нашёл на такую процедуру вот как оно используется смотри

Сохранение свойств
Из построения предыдущего ActiveX-элемента Вы знаете, что он может существовать в двух ипостасях - а именно на этапе разработки программы и на этапе её выполнения. Для передачи свойств из одного состояния в другое служит объект PropBag типа PropertyBag.

Вставьте в код Вашего ActiveX-элемента следующие строки:

Код

Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
 m_strPassword = PropBag.ReadProperty("Password", "")
 m_tMaxAttempt = PropBag.ReadProperty("MaxAttempt", 1)
End Sub

Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
 PropBag.WriteProperty "Password", m_rPassword, ""
 PropBag.WriteProperty "MaxAttempt", m_MaxAttempt, 1
End Sub


Убедитесь, что добавленный код позволяет запоминать свойства для нашего ActiveX-элемента. Для этого задайте какое-нибудь значение для свойств Password и MaxAttempt запустите программу и закройте её. Ваши значения для свойств Password и MaxAttempt будут сохранены (через объект PropBag).

http://casco.narod.ru/prog/vb/activex/passwrd6.htm



--------------------
Я родился в этом безумном мире - и Я сделаю всё чтобы в нём выжить!
PM MAIL ICQ   Вверх
korob2001
Дата 22.1.2005, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Да, похоже проблема действительно не в этом. Но почему тогда, после того как меняю значение параметра CharAccept на любое другое и убираю фокус из поля значения, то оно тут же меняется на значение по умолчанию.

Для того что бы вы могли протестировать у себя, просто создайте проект ActiveX Control, в форму добавьте текстовое поле, очитите его свойство Text, а свойству Name присвойте имя txtCharSet. Теперь в окно кода внесите код, который написан в первом посте, данной темы. Скомпилируйте проект в .OCX файл, подключите к проекту Standard EXE. Затем попробуйте изименить свойство CharAccept и уберите фокус из поля где только что изменили свойство.

Если лень писать, то выложу его в zip архиве, в этом же zip'e будет и уже скомпилированный .OCX файл.


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  TextLimit.zip


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Naghual
Дата 22.1.2005, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1893
Регистрация: 15.5.2004
Где: Украина, Днепр

Репутация: 26
Всего: 49



Тут все просто. Имеют место две ошибки.
1. В описаниях свойства Лет и Гет, переменная нового значения объявлена как вариант. При назначении нового значения, оно не является числом. Оно представляется в варианте как строковое значение.
2. В свойстве Лет происходит опознание не той переменной. Вы сравниваете текущее значение (chCharAccept, равный 0). Нужно сравнивать переменную назначенного значения (vNewValue).

Из всего сказанного приведу только измененный код. Все остальное без изменений.
Код

Private chCharAccept As Integer

Public Property Get CharAccept() As Integer
  CharAccept = chCharAccept
End Property

Public Property Let CharAccept(ByVal vNewValue As Integer)
  Select Case vNewValue
      Case 1 To 2
          chCharAccept = vNewValue
      Case Else
          chCharAccept = 0
  End Select
  PropertyChanged "CharAccept"
End Property


Это сообщение отредактировал(а) Naghual - 22.1.2005, 17:15


--------------------
Я желаю всем Счастья!
PM ICQ Skype   Вверх
korob2001
Дата 23.1.2005, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Naghual - спасибо, всё работает. Это я прошляпил, в книге тоже так ниписано. Просто ошибку ожидал увидеть в другом месте. Огромное спасибо.


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Staruha
Дата 23.1.2005, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1292
Регистрация: 1.2.2004
Где: Казань

Репутация: 2
Всего: 27



korob2001 (Online) - этого мало . У нас Naghual сегодня родился.Ура! smile smile


--------------------
Возмездие настигнет
PM MAIL   Вверх
korob2001
Дата 23.1.2005, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: нет
Всего: 61



Ну Naghual, спасибо тебе дважды. А так как ты ещё и из Днепра, то трижды. ;))))))


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.