Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обманка для свойства Name. Как бороться ? / 14 сообщений из 14, страница 1 из 1
27.09.2013, 20:06
    #38410396
thunder2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
Захотел сделать класс отвечающий за работу с записью в таблице. Всё бы ничего, но столкнулся с такой проблемой - в таблице есть поле Name и ему должно соответствовать свойство Name в моём классе. Так вот, это свойство зарезервировано VFP для именование объектов и выполнение операторов типа
Код: sql
1.
MyClass.Name = "Тра-ля-ля"


или
Код: sql
1.
2.
3.
DEFINE CLASS MyClass as Custom
  Name=""
ENDDEFINE


немедленно вызывает исключение VFP, хотя есть куча примеров, в которых авторы запросто манипулируют этим свойством.
Сам-то я обошел это ограничение VFP добавив в определение класс защищенное свойство _name и два метода с суффиксами _ACCESS и _ASSIGN:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DEFINE CLASS MyClass as Custom
  PROTECTED _Name

  PROCEDURE name_access(_name)
     RETURN this._name
  ENDPROC
  PROCEDURE name_assign(_name)
     this._name=m._name
  ENDPROC
ENDDEFINE


Но меня гложет сомнение - почему в примерах якобы манипуляции со свойство Name якобы работают, а у меня нет ?
Есть ли другое решение этой досадной заморочки ?
...
Рейтинг: 0 / 0
27.09.2013, 20:30
    #38410417
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
thunder2, а не было мысли попробовать класс Empty. Проще всего создать его объект командой SCATTER .. NAME ...
...
Рейтинг: 0 / 0
27.09.2013, 20:33
    #38410421
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
thunder2, правда, в классе Empty не предусмотрены методы, но ты можешь сделать объект Empty членогм класса с методами
...
Рейтинг: 0 / 0
27.09.2013, 20:37
    #38410431
thunder2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
Rostislav D. Kudryashov,

Была такая мысль, но тоже получаю ошибку. Я так понял Name без оберток вообще нельзя использовать, но я могу ошибаться, потому и пришел сюда.
...
Рейтинг: 0 / 0
27.09.2013, 20:44
    #38410437
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
thunder2, это уже чудо. Как тебе это удалось? У меня VFP9 SP2 отрабатывает без запинки
o = NEWOBJECT ('EMPTY')
ADDPROPERTY(o,'Name','')
Хотя, SCATTER ... NAME ... в некоторых случаях предпочтительнее
...
Рейтинг: 0 / 0
27.09.2013, 22:35
    #38410525
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
Дело в том, что свойство Name используется как некий внутренний идентификатор объектов. В силу этого, на его содержимое налагаются некоторые ограничения, свойственные для идентификаторов

- Это свойство не может быть пустым
- Это свойство не может содержать спец.символы. Только буквы и цифры. Причем начинаться должно с буквы.
- Разные объекты на одном уровне вложенности формы не могут иметь одинаковое значение свойства Name

Собственно, все ограничения соответствуют ограничениям на имена переменных (идентификаторов). Имя переменной не может быть пустым, не может начинаться с цифры, содержать спец.символы и быть одинаковыми в рамках одной области видимости

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

Код: sql
1.
2.
3.
4.
5.
oTest = CreateObject('Custom')
oTest.Name = 'test'
oTest.Name = 'MyTable'
oTest.Name = 'Таблица'
oTest.Name = 'Таблица123'


А вот если Вы попытаетесь присвоить имени пустое значение или добавите спец.символ (тире, точка, запятая и т.п.), то и получите ошибку или исключение.

Код: sql
1.
2.
3.
4.
oTest = CreateObject('Custom')
oTest.Name = ''           && Ошибка - недопустимое значение
oTest.Name = 'My-Table'   && Ошибка - недопустимое значение
oTest.Name = '1Таблица'   && Ошибка - недопустимое значение


Другими словами, использовать можно, но помня о том, что не все значения допустимо туда записывать.
...
Рейтинг: 0 / 0
27.09.2013, 23:34
    #38410549
thunder2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
ВладимирМ,

Ну, вообщем, как я и предполагал ограничения на значения свойства Name есть и похоже использование методов - единственный способ обойти эти ограничения.
...
Рейтинг: 0 / 0
27.09.2013, 23:36
    #38410550
thunder2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
Rostislav D. Kudryashovthunder2, это уже чудо. Как тебе это удалось? У меня VFP9 SP2 отрабатывает без запинки
o = NEWOBJECT ('EMPTY')
ADDPROPERTY(o,'Name','')
Хотя, SCATTER ... NAME ... в некоторых случаях предпочтительнее
Я почему-то делал через DEFINE CLASS MyClass AS EMPTY, но ничего хорошего не получилось. Да и такой способ меня не устраивает - NEWOBJECT("EMPTY"), по сути, создает структуру, а мне требуется полноценный класс
...
Рейтинг: 0 / 0
27.09.2013, 23:44
    #38410555
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
thunder2, если тебе нужно то чего нет, у тебя не будет ничего.
Но человек более скромный мог бы ограничиться вложением объекта Empty в объект класса с методами. Это, кажется, называется делегированием обязанностей в высокоумной теории
...
Рейтинг: 0 / 0
28.09.2013, 01:07
    #38410569
ЛДПР
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
Не корысти ради :))

ВладимирМ- Разные объекты на одном уровне вложенности формы не могут иметь одинаковое значение свойства Name
Rostislav D. Kudryashovв классе Empty не предусмотрены методы

все конечно так, но это же Fox и это таки в нем возможно :)
...
Рейтинг: 0 / 0
28.09.2013, 08:52
    #38410595
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
ЛДПР, а токмо ради святого и чистого Знания!
Как воткнуть методы в объект класса Empty? Чтоб вызывать их набором имени переменной объекта и через точку - именем метода: Obj.Method(). Т.е., традиционно, без извращений.
...
Рейтинг: 0 / 0
28.09.2013, 13:19
    #38410648
ЛДПР
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
Rostislav D. Kudryashov Чтоб вызывать ... без извращений.
Вызвать Да, при создании и редактировании придется поизвращаться :))

Пример объекта на основе класса Empty

Код: c#
1.
2.
3.
4.
5.
SET CLASSLIB TO _test.vcx ADDITIVE
loPattern     = CREATEOBJECT("pattern","Name=0;parent=[p]")
m.loPattern.AddProperty("_",9)
set step on
m.loPattern.Release()



И это еще далеко не все извращения которые можно сделать с Fox(ом) :))
...
Рейтинг: 0 / 0
28.09.2013, 13:59
    #38410662
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
ЛДПР, пытаюсь расшифровать содержимое библиотек _test.vcx. Предполагаю, что ты туда каким-то манером запихнул класс с именем pattern с базовым типом Empty.
Не уверен, что все знают, как это сотворить. Я пока не догадался.
...
Рейтинг: 0 / 0
28.09.2013, 14:22
    #38410667
Rostislav D. Kudryashov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обманка для свойства Name. Как бороться ?
ЛДПР, такой "уклончивый" ответ только усиливает интригу. И если есть охота её раскрыть, то лучше в той новой ветке, которую я открыл специально с этим вопросом "Как воткнуть метод в объект класса Empty"
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Обманка для свойства Name. Как бороться ? / 14 сообщений из 14, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]