Научите пользоваться динамической строкой!!

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
ingasoftplus
Ветеран
Сообщения: 426
Зарегистрирован: 26 Декабрь 2006, 17:07
Откуда: Оттуда :)
Благодарил (а): 90 раз
Поблагодарили: 5 раз

Научите пользоваться динамической строкой!!

Сообщение ingasoftplus »

вычитал следующее
Как минимум с версии Клариона 5.5 существует интерфейс IDynStr, который как раз и служит для цели создания динамических строк. Описание методов интерфейса вы можете найти в директории LibSrc в файле DynStr.inc, в стандартной документации описание отсутствует. Использовать интерфейс достаточно просто:

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

DS &IDynStr ! описание объекта
 code
 DS &= NewDynStr()             ! Обязательно используется ф-ия NewDynStr
 DS.Cat('динамическая строка') ! создали строку и заполнили ее данными
 message(DS.Str())             ! Показали строку
 DisposeDynStr(DS)             ! уничтожили строку
только вот не пойму - как мне простое действо сделать, а именно сконкатенировать текущую дин строку с новой, типа этого

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

mydinstr = mydinstr & myNewstring
т.е. в цикле мне надо наращивать содержимое дин строки добавляя в нее информацию.
Аватара пользователя
ingasoftplus
Ветеран
Сообщения: 426
Зарегистрирован: 26 Декабрь 2006, 17:07
Откуда: Оттуда :)
Благодарил (а): 90 раз
Поблагодарили: 5 раз

Научите пользоваться динамической строкой!!

Сообщение ingasoftplus »

похоже то что надо!
Cat (STRING inDataString) - заполнить строку данными
Метод заполняет строку указанными данными. Если строка уже содержит данные, то новые данные будут добавлены в конец старых данных. Длина строки при этом увеличится.

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

DS &= NewDynStr()                           ! создали объект
DS.Cat('Динамически созданная строка')      ! наполнили содержанием
message(DS.Str(),1)                         ! показали
DS.Cat('|вторая строка')                    ! добавили в конец строки
message(DS.Str(),2)                         ! показали
DisposeDynStr(DS)                           ! уничтожили объект
вопрос снимается!!! http://www.clarionlife.net/?file_id=2289 :cat:

только скорее

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

не DS.Str  а DS.CStr
Аватара пользователя
ingasoftplus
Ветеран
Сообщения: 426
Зарегистрирован: 26 Декабрь 2006, 17:07
Откуда: Оттуда :)
Благодарил (а): 90 раз
Поблагодарили: 5 раз

Научите пользоваться динамической строкой!!

Сообщение ingasoftplus »

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

Научите пользоваться динамической строкой!!

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

я где-то тут класс-обёртку над IDynStr уже выкладывал, в частности, он позволяет не заботиться о DISPOSE(). Прицепил тут, может пригодится.
Вложения
dynstrclass.CLW
(2.68 КБ) 415 скачиваний
dynstrclass.inc
(1.31 КБ) 415 скачиваний
С уважением, ДП
Аватара пользователя
ingasoftplus
Ветеран
Сообщения: 426
Зарегистрирован: 26 Декабрь 2006, 17:07
Откуда: Оттуда :)
Благодарил (а): 90 раз
Поблагодарили: 5 раз

Научите пользоваться динамической строкой!!

Сообщение ingasoftplus »

спасибо!!
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Научите пользоваться динамической строкой!!

Сообщение Губин Игорь »

А можно пример области применения? Что-то я пытаюсь представить где можно это использовать...
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Научите пользоваться динамической строкой!!

Сообщение Admin »

У меня почти все применение такое. Бывает на 2-3 экрана...

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

      DS.Kill()
      DS.Cat(' SELECT ')
      DS.Cat('   G.GoodsID, ')
      DS.Cat('   CF.CustomFieldValue ')
      DS.Cat(' FROM ')
      DS.Cat('   Goods G ')
      DS.Cat('   JOIN GoodsLink GL ON GL.GoodsID = G.GoodsID AND GL.LinkEnabled = 1 AND GL.CategoryID = ' & CategoryList.CategoryID)
      DS.Cat('   JOIN Category C ON C.CategoryID = GL.CategoryID AND C.ShopID = ' & SL:ShopID)
      DS.Cat('   LEFT JOIN CustomFields CF ON CF.GoodsID = G.GoodsID ')
      DS.Cat(' WHERE ')
      DS.Cat('   CF.CustomFieldName = '''&CLIP(CustomFieldList.FieldName)&''' ')
      DS.Cat(' ORDER BY ')
      DS.Cat('   G.GoodsID ')
      IF MAVLOAD(DS.Str(), CustomValuesList)
        MAVSHOWERROR()
      END
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Научите пользоваться динамической строкой!!

Сообщение Губин Игорь »

Admin писал(а): У меня почти все применение такое. Бывает на 2-3 экрана...
Ну, может быть... Спасибо На 2-3 экрана у меня нет, но можно попробовать расшить пару узких мест, где я просто закладываю строку с запасом
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Научите пользоваться динамической строкой!!

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

Admin писал(а): У меня почти все применение такое. Бывает на 2-3 экрана...
Потом это можно всё ужать, заменив серию пробелов на один: DS.Replace(' ', ' ')
С уважением, ДП
Аватара пользователя
Admin
Администратор
Сообщения: 3959
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Научите пользоваться динамической строкой!!

Сообщение Admin »

Дед Пахом писал(а): Потом это можно всё ужать, заменив серию пробелов на один: DS.Replace(' ', ' ')
Для SQL запросов большого смысла нет, хотя да - можно.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Научите пользоваться динамической строкой!!

Сообщение Yufil »

У меня класс Cstr https://mega.co.nz/#!RlAilJIT!2hvwWBkAn ... J3FmCLcmvw круче :D
Всё-таки, внутре хранится нормальная строка.
Аватара пользователя
Aragorn
Активист
Сообщения: 113
Зарегистрирован: 11 Июль 2005, 12:40
Откуда: Москва

Научите пользоваться динамической строкой!!

Сообщение Aragorn »


У меня класс Cstr круче
фурычит, подтверждаю 8) А вот что, все-таки, быстрее -

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

Str = Clip(Str) & ' abc'
или

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

Str[Len(Clip(Str)) : Len(Clip(Str)) + 3] = 'abc'
???
-------------------------------
В истинном золоте блеска нет...
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3133
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 10 раз
Поблагодарили: 28 раз
Контактная информация:

Научите пользоваться динамической строкой!!

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

Aragorn писал(а): Str[Len(Clip(Str)) : Len(Clip(Str)) + 3] = 'abc'
можно ещё вот так выежнуться:

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

Str[Len(Clip(Str)) : Len(Clip(Str)) + sqrt(9)] = '<61h><62h><63h>'
С уважением, ДП
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Научите пользоваться динамической строкой!!

Сообщение Yufil »

Ну, SQL-запросы разные бывают, иногда и по несколько страниц текста.
Так обидно бывает, когда ошибка в запросе из-за того, что десятка-другого байтов не хватает
А так красота...

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

Req   Cstr 
....
        Req.Set('Select .... ')
        Req.Cat('<13,10>From .... ') 
        Req.Cat('<13,10>Where .... ') 
        Loop ... 
            Req.Cat( ' and ' .... ' or ' ....) 
        End 
        File{Prop:SQL} = Req.S 
Примерно так же с XML

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

       Req.Set('<?xml version="1.0" encoding="UTF-8" ?>') 
       Loop Q# = 1 to records(Q) 
              Get(Q,Q#) 
              Req.cat('<hs name="' & ansi2Html( Q:Name) & '" topic="' & ansi2html(Q:topic) & '" /> ') 
       End 
       Req.toUtf8() 
       Req.SaveToFile('file.xml') 
А если надо большую кучку текстовых файлов пережевать - просто никак иначе.
Ответить