Что есть тип данных LABEL ?

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Что есть тип данных LABEL ?

Сообщение Игорь Столяров »

Привет всем ! :)

Имею непреодолимое желание создать метод для обработки полей некой структуры данных.
Упрощённо что-то вроде:

Код: Выделить всё

MyGroup Group
S1 String(20)
   end
   
   Code
   Message(  MyMethod(MyGroup,MyGroup.S1)  )  ! Ожидается = 1 
...

MyMethod Procedure(*Group  xGroup, XXX xLabel)  !,Long
   Code
   Return Where(xGroup, xLabel)
Вопрос: какой тип данных должен быть вместо XXX что бы это всё заработало ?!
Или как-то вообще нужно по другому передавать метку поля MyGroup.S1 ?
Заранее спасибо за посильную помощь ... :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Что есть тип данных LABEL ?

Сообщение Дед Пахом »

Сам удивился, но если продублировать декларацию WHERE, то работает:

Код: Выделить всё

MyWhere(*GROUP pGrp, *? pLabel), SIGNED
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Что есть тип данных LABEL ?

Сообщение Игорь Столяров »

Спасибо - работает. :) Хотя вроде бы ранее проверял этот вариант ...

Судя по справке - происходит следующее:
------------------------------------------------------
Нетипизированные параметры-переменные представляются в прототипе процедуры звездочкой и знаком вопроса (*?).
Внутри процедуры параметр с типом переменной действует как объект такого же типа данных,
что и переменная в вызывающей процедуре, чье значение передается данным параметром.
Это означает, что во время выполнения процедуры тип данных параметра не изменяется.
Делать какие-либо предположения о типе данных принятого параметра небезопасно.

Т.е. по сути - передаётся указатель на буфер переменной неопределённого типа.
Как его использует потом Where() и что есть "метка поля в структуре" - так и осталось тайной.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Что есть тип данных LABEL ?

Сообщение Дед Пахом »

А вот так можно получить полное имя поля группы:

Код: Выделить всё

MyWho                         PROCEDURE(*GROUP pGrp, *? pLabel)
fldPos                          SIGNED, AUTO
fldRef                          ANY
grpRef                          &GROUP, AUTO
i                               LONG, AUTO
fldFullName                     STRING(256), AUTO
  CODE
  fldPos = WHERE(pGrp, pLabel)
  IF fldPos = 0
    !- the field is not a member of this group
    RETURN ''
  END

  fldFullName = ''
  
  LOOP i=1 TO fldPos-1
    fldRef &= WHAT(pGrp, i)
    IF ISGROUP(pGrp, i)
      grpRef &= GETGROUP(pGrp, i)
      IF WHERE(grpRef, pLabel) > 0
        !- the label is a member of this inner group,
        !- so append a group name and a dot.
        fldFullName = CLIP(fldFullName) & WHO(pGrp, i) &'.'
      END
    END
  END

  !- append a label name itself.
  fldFullName = CLIP(fldFullName) & WHO(pGrp, fldPos)
  RETURN fldFullName
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Что есть тип данных LABEL ?

Сообщение Игорь Столяров »

Это пример неудачного использования Вашей предыдущей красивой идеи. ;)
Потому, что вызов получения полного имени поля будет выглядить что-то вроде:

Код: Выделить всё

  MyWho(Loc:Group,Loc:Group.File.Document.SvSchFact.SvProd.Address.AdrRF.Region)
т.е. для того, что бы получить полное имя - мы его сначала должны указать. :)
Единственно, что будут учтены значения Name() полей, но это можно сделать
проще - если интересно, см. класс tXML в соседней ветке форума.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Что есть тип данных LABEL ?

Сообщение Дед Пахом »

Ну по такой логике и WHO не нужен.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Что есть тип данных LABEL ?

Сообщение Игорь Столяров »

Дед Пахом писал(а): 13 Март 2023, 14:59 Ну по такой логике и WHO не нужен
Who() возвращает символьное имя поля по номеру - это несколько другое.
Задаём номер (выражение) - получаем имя поля.
И это имя может дублироваться в других полях структуры (и тем более с NAME)

В MyWho (или штатный Where) нужно передать полное уникальное имя поля в структуре.
И если Where вернёт номер поля, то MyWho вернёт ... полное уникальное имя поля в структуре. :)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Что есть тип данных LABEL ?

Сообщение Дед Пахом »

Игорь Столяров писал(а): 13 Март 2023, 17:22 В MyWho (или штатный Where) нужно передать полное уникальное имя поля в структуре.
Отнюдь.

Код: Выделить всё

fldref         ANY
  CODE
  fldref &= MyGroup.InGroup3.InGroup4.S8  !- или fldRef &= WHAT(MyGroup, 12)
  fldName = MyWho(MyGroup, fldref)  !- вернёт INGROUP3.InGroup4_Renamed.S8_Renamed
Вообще не понимаю, о чём спор, я привёл код чисто из академического интереса, сам его не использую и понятия не имею, есть ли применение знанию полного имени поля, разве что в лог писать.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Что есть тип данных LABEL ?

Сообщение Игорь Столяров »

Дед Пахом писал(а): 13 Март 2023, 17:52 я привёл код чисто из академического интереса
Полностью с Вами согласен ! Нет никакого спора. :)
Это просто академический пример обработки структуры у которого нет практического применения.
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3131
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Что есть тип данных LABEL ?

Сообщение Дед Пахом »

А вот обратной функции (MyWhat, здесь не публикую), по полному имени поля возвращающей само это поле, можно найти применение, и не одно.
С уважением, ДП
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7322
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Что есть тип данных LABEL ?

Сообщение Игорь Столяров »

Дед Пахом писал(а): 13 Март 2023, 18:36 здесь не публикую
Ага ! Секретный код ! :)
Ну, если придумаю WHY - буду думать WHO ... ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Ответить