-
> KSergey © (17.04.18 11:05) [36]
> WriteLog
я бы переписал WriteLog на юникод.
-
вот с AnsiString была проблема в FMX, в виде отсутствия типа AnsiString вообще. Для некоторых библиотек это было большой проблемой, потратил изрядно сил в свое время. Однако, в новых версиях AnsiString добавили в FMX.
-
> Eraser © (17.04.18 15:31) [40] > я бы переписал WriteLog на юникод.
WriteLog в данном случае вообще внешняя функция хост-приложения, там без шансов юникод внедрить ) Впрочем, у меня тоже была идея: т.к сейчас вообще не понять сколько там преобразований происходит на самом деле (похоже при конкатенации строк много раз туда-сюда всё гоняется, судя по ворнингам, там же иногда еще участвуют строковые переменные AnsiString, вернее даже PAnsiString указатели).
Так вот у меня тоже была уже идея, но не проверил пока: возможно будет иметь смысл в дельфи сделать прослойку для WriteLog, которая будет принимать юникодный String, и потом при отдаче хост приложению - один раз её уже конвертировать в AnsiString. Обидно, что заставить дельфи все время работать только с AnsiString в таких частях кода похоже вообще не удаётся.
-
Либо для конкатенации строк вообще отказаться от использования оператора +, а сделать свою просто функцию "добавить к буферу".
О, кстати: а может тут нам поможет создание классов со своими перегруженными операторами ? о, "тема", надо подумать в эту сторону.
-
> Либо для конкатенации строк вообще отказаться от использования > оператора +, а сделать свою просто функцию "добавить к буферу". >
Советую не просто "добавить к буферу", а "писать в буфер с заданной позиции".
-
> 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] > а кто то спец. функциями форматирования пользуется и не морочят людям голову по пустякам.
Это какими? Это где ты сначала пишешь форматную строку с подстановками, потом мучительно выстраиваешь параметры в нужном порядке, после чего молишься, чтобы не забыть поправить форматную строку, когда добавится еще параметр? вы про это? Если так - ну его нафик, за эту идею с форматными строками авторов вообще удавить следует. Оно только для студенческих лабораторных годится для вывода двух переменных: x и y. Когда подстановок пара десятков - это адок тот еще поддерживать.
Если вы о чем-то другом - буду признателен за более развёрнутый ответ.
-
> Eraser © (17.04.18 18:56) [45] > > перегруженными операторами ? > из пушки по воробьям.
На сколько я понимаю, реализация перегрузки - вполне дешёвая операция, на уровне вызова функций. А т.к. речь про строки, что не быстро само по себе - то и вовсе ни о чем.
-
а зачем вы постоянно правите строки и добавляете параметры? есть подозрение что у вас что то не то в консерватории))
-
А зачем вы внедряете новые фичи и правите баги? Ровно для этого.
Правятся расчетные формулы, усложняются алгоритмы, в которые добавляются новые внешние параметры, которые хотелось бы отлогировать для разборы "что пошло не так".
Вы всё еще уверены про консерваторию? Впрочем, даже единожды написать форматную строку с десятком параметров, а потом эти параметры приставить так, чтобы не ошибиться - уже вызывает неистребимое желание более так не делать всеми доступными способами.
-
> 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 варианте всё как-то более оптимально (это я дебажил дебажный вариант). Как проверить для релизного - не совсем мне понятно, разве что в ассемблерный код сгенерированный поштыриться
-
-
> Впрочем, даже единожды написать форматную строку с десятком > параметров, а потом эти параметры приставить так, чтобы > не ошибиться - уже вызывает неистребимое желание более так > не делать всеми доступными способами.
Можно попробовать изобразить класс с именованными параметрами, присваивать куда что нужно ну и на выходе забрать либо собранную строку либо строку для format'а. Думаю, строк в 10-20 можно вложиться.
-
Что-то типа:
Это мой крутой лог для рассылки :count сообщений пользователям :user1, :user2, :user3.
Потом Params['count'] := '3' Params['user1'] := 'Вася Пупкин' ...
Небольшой паресер по WordDelim с поиском параметров по разделителю и заменой их 'по ходу' парсинга.
-
> KSergey © (17.04.18 06:10) [34] > > > Германн © (17.04.18 03:03) [33] > > О какой совместивости вы говорите? Единственная разница > > между Д2009+ и более ранними версиями - это использование > > Юникода взамен ANSII. > > Замечу: насильное использование юникода, без возможности > его не использовать. > Для чисто дельфовых проектов - это на самом деле фигня и > даже классно. Всё в юникоде - и это отлично. > Но как только есть связь с внешним миром - приплыли.
Ну в таком варианте согласен. Именно поэтому я и отказался от использования Д2009+ в своих уже малочисленных и редко вспоминаемых проектах. Я хорошо помню как при переходе с Д1 на Д2 разработчики ввели опцию компилятора $H+/-. Перенос проектов был очень простым. А сейчас с одной стороны по слухам и разработчики гораздо более слабые и задачи у них в основном другие. А с другой стороны. Если ввести новую опцию компилятора по включению/выключению юникода, она явно будет конфликтовать с вышеуказанной опцией $H.
-
> Дмитрий Белькевич © (20.04.18 00:42) [52] > Посмотри на TStringBuilder:
А вот это спасибо! хорошая затея Надо глянуть реализацию, если он каждый раз возвращает ссылку на самого себя, т.е. просто в один буфер всё складывает без перекопирований - то очень даже толково придумано в рамках синтаксиса Delphi
-
> толково придумано в рамках синтаксиса Delphi стырено )
|