List Data to String Parsing

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Developer
Ветеран
Сообщения: 407
Зарегистрирован: 26 Март 2012, 16:18

List Data to String Parsing

Сообщение Developer » 08 Сентябрь 2018, 23:00

Привет всем!

Есть ли возможность присвоить (распарсить) динамическое содержимое элементов List в переменные типа STRING (CSTRING) без отображения в Browse?

Есть ли возможность получить значение конкретного элемента?
С Уважением, Developer

kreator
Ветеран
Сообщения: 2901
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

List Data to String Parsing

Сообщение kreator » 09 Сентябрь 2018, 18:25

Переведите. Ничего непонятно. Или напомнить о функциях what, who, where?
We are hard at work… for you. :)

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3598
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

List Data to String Parsing

Сообщение Игорь Столяров » 10 Сентябрь 2018, 9:21

Да, немного не формализован вопрос … Здесь бы сначала определиться с терминологией.
LIST - базовый элемент интерфейса для списков;
BROWSE - формируемая шаблонами структура списка, состоящая из LIST, View, Files и т.д.

Т.е. в общем случае, для работы с содержимым LIST никакой BROWSE не нужен.
Если мы хотим разобрать структуру LIST, то просто работаем с ней напрямую.
Здесь хороший пример - это менеджер форматов списков (хотя в стандартных шаблонах он убогий)

Упрощённый пример разбора структуры LIST:

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

  ! Присвоили содержимое LIST в строку
  FormatSTR = ?MyList{PropList:Format}
  
  ! А далее можем LIST распарсить и получить параметры каждого элемента

  Loop Loc:xCount = 1 to ?MyList{PropList:Exists,0} by 1
  
    If ?MyList{PropList:Exists,Loc:xCount} = True
  
       ColWidth    = ?MyList{PropList:Width,Loc:xCount}   ! Ширина колонки
       ColResize   = ?MyList{PropList:Resize,                  Loc:xCount}
       BSColor     = ?MyList{PropList:BackSelected,            Loc:xCount}
       BColor      = ?MyList{PropList:BackColor   ,            Loc:xCount}
       TSColor     = ?MyList{PropList:TextSelected,            Loc:xCount}
       ColFormat   = ?MyList{PropList:Format      ,             Loc:xCount}
       FieldNo     = ?MyList{PropList:FieldNo     ,             Loc:xCount}
       ColFixed    = ?MyList{PropList:Fixed,                   Loc:xCount}
       GroupName   = ?MyList{PropList:Header + PropList:Group, Loc:xCount}
       GroupFormat = ?MyList{PropList:Format + PropList:Group, Loc:xCount}
       GroupNo     = ?MyList{PropList:GroupNo,                 Loc:xCount}  ! Номер группы
  
       GroupCount  = ?MyList{PropList:GroupNo + PropList:Group,Loc:xCount}  ! Кол-во колонок в группе
  
                                                                                     ! Есть группа
       If ?MyList{PropList:GroupNo + PropList:Group,Loc:xCount} > 0 then Loc:FGroup = True.
  
       Omit('**CW6**',_CWVER_ = 6100)
       HColor = ?MyList{PropList:HdrTextColor,Loc:xCount}
       **CW6**
       
       ! и т.д.
    end
  end
«V» значит Вендетта !

Developer
Ветеран
Сообщения: 407
Зарегистрирован: 26 Март 2012, 16:18

List Data to String Parsing

Сообщение Developer » 11 Сентябрь 2018, 11:21

kreator писал(а):
09 Сентябрь 2018, 18:25
Переведите. Ничего непонятно. Или напомнить о функциях what, who, where?
Kreator и Игорь Столяров спасибо за отклик и за правильные замечания. :wink:

Игорь Столяров точно понял мой вопрос и предоставил возможное практическое решения - сейчас попробую - необходимо получить значение конкретного элемента List :D

Kreator, а как применить what, who, where - к List (как на примере Игоря Столярова (Упрощённый пример разбора структуры LIST:)) - приведи, пожалуйста, рабочий пример применительно к List
С Уважением, Developer

kreator
Ветеран
Сообщения: 2901
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

List Data to String Parsing

Сообщение kreator » 11 Сентябрь 2018, 12:21

what, who, where к очереди применяются. Удобно оперировать номерами переменных в очереди, а не их наименованиями.
LOC:CurrentField &= WHAT(LOC:Queue,10) достаёт значение 10 члена очереди. И присваивать так же можно.
We are hard at work… for you. :)

Developer
Ветеран
Сообщения: 407
Зарегистрирован: 26 Март 2012, 16:18

List Data to String Parsing

Сообщение Developer » 11 Сентябрь 2018, 21:40

Вот, оказывается, мой-же вопрос, заданный ранее Игорем Столяровым в 2015 году viewtopic.php?f=1&t=3540- ответ от Rafael-я :wink:

Вот только проблема:


Объявлена переменная типа LIST с именем ?List

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

WINDOW                   WINDOW('Window'),CENTER,GRAY,IMM,SYSTEM,MAX,ALRT(F5Key),TOOLBOX,  DOUBLE
                               LIST,AT(10,100),USE(?List),VSCROLL
                    END 
в переменную ?List динамически попадает информация сформированная сторонним классом.

Как получить значение определённого элемента переменной в сформированной структуре LIST переменной ?List :?:

Выражение LOC:CurrentValue = WHAT(?List,1) вызывает ошибку: "No matching prototype available"

Пожалуйста, подскажите решение.
С Уважением, Developer

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3598
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

List Data to String Parsing

Сообщение Игорь Столяров » 12 Сентябрь 2018, 6:24

Developer писал(а):
11 Сентябрь 2018, 21:40
LOC:CurrentValue = WHAT(?List,1)
Я возьму на себя смелось ответить на это по пунктам …

1. Вообще, конечно, должно быть понимание, что ?LIST - это просто номер интерфейсного элемента внутри WINDOW …
И к нему нельзя применять операции для работы с структурированными типами данных.

2. Обязательным параметром LIST, является FROM - источник данных для списка, которого в Вашем примере просто нет.

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

   LIST,AT(80,0,20,20),USE(?List),FROM(MyQUEUE),FORMAT('5C~List~15L~Box~')
Так вот, правильно будет:

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

   LOC:CurrentValue = WHAT(MyQUEUE,1)
   LOC:CurrentValue = WHAT(?List{Prop:From},1)
3. Вы путаете две вещи. Упрощённо говоря: есть ящик (экранная структура ?List) и его содержимое (То, что указано в FROM()).
Ранее я показал в примере, как получить параметры самого "ящика" по его экранной метке ?List.
Kreator рассказал, как получить / изменять информацию об элементах содержимого структуры LIST.
Но это - две большие разницы … Совсем. :)
«V» значит Вендетта !

kreator
Ветеран
Сообщения: 2901
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

List Data to String Parsing

Сообщение kreator » 12 Сентябрь 2018, 11:14

Developer писал(а):
11 Сентябрь 2018, 21:40
в переменную ?List динамически попадает информация сформированная сторонним классом.
Подозреваю, задача нетривиальная. Формат этого листа известен? От формата зависит содержимое очереди (отдельные переменные для цветов, стилей). Надо ещё парсить формат листа.
We are hard at work… for you. :)

kreator
Ветеран
Сообщения: 2901
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

List Data to String Parsing

Сообщение kreator » 12 Сентябрь 2018, 11:27

kreator писал(а):
12 Сентябрь 2018, 11:14
Developer писал(а):
11 Сентябрь 2018, 21:40
в переменную ?List динамически попадает информация сформированная сторонним классом.
Подозреваю, задача нетривиальная. Формат этого листа известен? От формата зависит содержимое очереди (отдельные переменные для цветов, стилей). Надо ещё парсить формат листа.
А если ещё порядок элементов листа не совпадает с порядком элементов очереди?
We are hard at work… for you. :)

Аватара пользователя
Дед Пахом
Старичок
Сообщения: 2063
Зарегистрирован: 07 Июль 2005, 15:51
Откуда: Москва, Россия

List Data to String Parsing

Сообщение Дед Пахом » 12 Сентябрь 2018, 11:28

Игорь Столяров писал(а):
12 Сентябрь 2018, 6:24
Так вот, правильно будет:

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

   LOC:CurrentValue = WHAT(MyQUEUE,1)
   LOC:CurrentValue = WHAT(?List{Prop:From},1)
Так вот неправильно ни разу, и даже не скомпилируется.
С уважением, ДП

Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 3598
Зарегистрирован: 07 Июль 2005, 9:19
Откуда: г. Ростов-на-Дону

List Data to String Parsing

Сообщение Игорь Столяров » 12 Сентябрь 2018, 11:30

Упс ! :shock:
«V» значит Вендетта !

Developer
Ветеран
Сообщения: 407
Зарегистрирован: 26 Март 2012, 16:18

List Data to String Parsing

Сообщение Developer » 12 Сентябрь 2018, 13:13

Так вот, HeaderValue = ?List{PROPLIST:Header, Loc:xCount} - работает, но с помощью ?List{PROPLIST:XXX, XXX} без проблем получаем свойства (атрибуты) элементов ?List, а необходимо получить значение содержимого элементов ?List.
С Уважением, Developer

kreator
Ветеран
Сообщения: 2901
Зарегистрирован: 28 Май 2009, 14:54
Откуда: Москва

List Data to String Parsing

Сообщение kreator » 12 Сентябрь 2018, 14:09

Игорь Столяров писал(а):
12 Сентябрь 2018, 11:30
Упс ! :shock:
Свойство "Write-only". И, похоже, нет путей получить очередь только зная контрол.
Developer писал(а):
11 Сентябрь 2018, 21:40
в переменную ?List динамически попадает информация сформированная сторонним классом.
Видимо, придётся покопать в направлении стороннего класса.
We are hard at work… for you. :)

Ответить