Конференция "Прочее" » Купить можно, пользоваться - сложно
 
  • Eraser © (17.04.18 15:31) [40]

    > KSergey ©   (17.04.18 11:05) [36]


    > WriteLog

    я бы переписал WriteLog на юникод.
  • Eraser © (17.04.18 15:33) [41]
    вот с AnsiString была проблема в FMX, в виде отсутствия типа AnsiString вообще. Для некоторых библиотек это было большой проблемой, потратил изрядно сил в свое время. Однако, в новых версиях AnsiString добавили в FMX.
  • KSergey © (17.04.18 15:55) [42]
    > Eraser ©   (17.04.18 15:31) [40]
    > я бы переписал WriteLog на юникод.

    WriteLog в данном случае вообще внешняя функция хост-приложения, там без шансов юникод внедрить )
    Впрочем, у меня тоже была идея: т.к сейчас вообще не понять сколько там преобразований происходит на самом деле (похоже при конкатенации строк много раз туда-сюда всё гоняется, судя по ворнингам, там же иногда еще участвуют строковые переменные AnsiString, вернее даже PAnsiString указатели).

    Так вот у меня тоже была уже идея, но не проверил пока: возможно будет иметь смысл в дельфи сделать прослойку для WriteLog, которая будет принимать юникодный String, и потом при отдаче хост приложению - один раз её уже конвертировать в AnsiString.
    Обидно, что заставить дельфи все время работать только с AnsiString в таких частях кода похоже вообще не удаётся.
  • KSergey © (17.04.18 15:57) [43]
    Либо для конкатенации строк вообще отказаться от использования оператора +, а сделать свою просто функцию "добавить к буферу".

    О, кстати: а может тут нам поможет создание классов со своими перегруженными операторами ? о, "тема", надо подумать в эту сторону.
  • Alex-Sk © (17.04.18 17:22) [44]

    > Либо для конкатенации строк вообще отказаться от использования
    > оператора +, а сделать свою просто функцию "добавить к буферу".
    >


    Советую не просто "добавить к буферу", а "писать в буфер с заданной позиции".
  • Eraser © (17.04.18 18:56) [45]

    > KSergey ©   (17.04.18 15:55) [42]


    > возможно будет иметь смысл в дельфи сделать прослойку для
    > WriteLog

    думаю так и надо делать, по возможности, уходить от ANSI где только можно.


    > О, кстати: а может тут нам поможет создание классов со своими
    > перегруженными операторами ?

    http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Operator_Overloading_(Delphi)

    из пушки по воробьям.
  • ухты © (17.04.18 21:45) [46]

    > Либо для конкатенации строк вообще отказаться от использования
    > оператора +
    а кто то спец. функциями форматирования пользуется и не морочят людям голову по пустякам.
  • KSergey © (18.04.18 07:37) [47]
    > ухты ©   (17.04.18 21:45) [46]
    > а кто то спец. функциями форматирования пользуется и не морочят людям голову по пустякам.

    Это какими?
    Это где ты сначала пишешь форматную строку с подстановками, потом мучительно выстраиваешь параметры в нужном порядке, после чего молишься, чтобы не забыть поправить форматную строку, когда добавится еще параметр? вы про это?
    Если так - ну его нафик, за эту идею с форматными строками авторов вообще удавить следует. Оно только для студенческих лабораторных годится для вывода двух переменных: x и y.
    Когда подстановок пара десятков - это адок тот еще поддерживать.

    Если вы о чем-то другом - буду признателен за более развёрнутый ответ.
  • KSergey © (18.04.18 07:38) [48]
    > Eraser ©   (17.04.18 18:56) [45]
    > > перегруженными операторами ?
    > из пушки по воробьям.

    На сколько я понимаю, реализация перегрузки - вполне дешёвая операция, на уровне вызова функций.
    А т.к. речь про строки, что не быстро само по себе - то и вовсе ни о чем.
  • ухты © (18.04.18 10:05) [49]
    а зачем вы постоянно правите строки и добавляете параметры?
    есть подозрение что у вас что то не то в консерватории))
  • KSergey © (18.04.18 11:24) [50]
    А зачем вы внедряете новые фичи и правите баги?
    Ровно для этого.

    Правятся расчетные формулы, усложняются алгоритмы, в которые добавляются новые внешние параметры, которые хотелось бы отлогировать для разборы "что пошло не так".

    Вы всё еще уверены про консерваторию?
    Впрочем, даже единожды написать форматную строку с десятком параметров, а потом эти параметры приставить так, чтобы не ошибиться - уже вызывает неистребимое желание более так не делать всеми доступными способами.
  • KSergey © (18.04.18 11:30) [51]
    > KSergey ©   (18.04.18 07:38) [48]
    > На сколько я понимаю, реализация перегрузки - вполне дешёвая
    > операция, на уровне вызова функций.

    Поэкспериментировал.
    А вот тут я, увы, оказался сильно не прав.
    В Delphi эти место, к сожалению, сделано крайне криво: в записи вроде такой

    a: TMyType;
    ...
     a := a + str1 + int1 + int2 + str2 + int3 + str3 + str4;


    где в TMyType перегружен + для "добавления" разных типов (не важно как именно по смыслу)
    фактически для каждой операции "+" создаётся:
     1) временный пустой объект a
     2) в него копируется
     3 к нему "добавляется"
     4) он снова копируется (про этот шаг не уверен, возможно нет либо этого шага, либо шага 2)

    что капец, конечно.

    Даль, очень жаль. Формально перегрузка есть и работает, но реализация весьма специфичной получается.
    Разве что в Release варианте всё как-то более оптимально (это я дебажил дебажный вариант). Как проверить для релизного - не совсем мне понятно, разве что в ассемблерный код сгенерированный поштыриться
  • Дмитрий Белькевич © (20.04.18 00:42) [52]
  • Дмитрий Белькевич © (20.04.18 00:45) [53]

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


    Можно попробовать изобразить класс с именованными параметрами, присваивать куда что нужно ну и на выходе забрать либо собранную строку либо строку для format'а. Думаю, строк в 10-20 можно вложиться.
  • Дмитрий Белькевич © (20.04.18 00:52) [54]
    Что-то типа:

    Это мой крутой лог для рассылки :count сообщений пользователям :user1, :user2, :user3.

    Потом
    Params['count'] := '3'
    Params['user1'] := 'Вася Пупкин'
    ...

    Небольшой паресер по WordDelim с поиском параметров по разделителю и заменой их 'по ходу' парсинга.
  • Германн © (20.04.18 02:02) [55]

    > KSergey ©   (17.04.18 06:10) [34]
    >
    > > Германн ©   (17.04.18 03:03) [33]
    > > О какой совместивости  вы говорите? Единственная разница
    > > между Д2009+ и более ранними версиями - это использование
    > > Юникода взамен ANSII.
    >
    > Замечу: насильное использование юникода, без возможности
    > его не использовать.
    > Для чисто дельфовых проектов - это на самом деле фигня и
    > даже классно. Всё в юникоде - и это отлично.
    > Но как только есть связь с внешним миром - приплыли.

    Ну в таком варианте согласен.
    Именно поэтому я и отказался от использования Д2009+ в своих уже малочисленных и редко вспоминаемых проектах. Я хорошо помню как при переходе с Д1 на Д2 разработчики ввели опцию компилятора $H+/-. Перенос проектов был очень простым.
    А сейчас с одной стороны по слухам и разработчики гораздо более слабые и задачи у них в основном другие.
    А с другой стороны. Если ввести новую опцию компилятора по включению/выключению юникода, она явно будет конфликтовать с вышеуказанной опцией $H.
  • KSergey © (20.04.18 09:03) [56]
    > Дмитрий Белькевич ©   (20.04.18 00:42) [52]
    > Посмотри на TStringBuilder:

    А вот это спасибо! хорошая затея
    Надо глянуть реализацию, если он каждый раз возвращает ссылку на самого себя, т.е. просто в один буфер всё складывает без перекопирований - то очень даже толково  придумано в рамках синтаксиса Delphi
  • ухты © (20.04.18 19:16) [57]

    > толково  придумано в рамках синтаксиса Delphi
    стырено )
 
Конференция "Прочее" » Купить можно, пользоваться - сложно
Есть новые Нет новых   [134427   +34][b:0][p:0.001]