powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / NextGen compiler и AnsiString
118 сообщений из 118, показаны все 5 страниц
NextGen compiler и AnsiString
    #38947499
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvвы полагаете, что ansistring - это какой-то чемодан, который можно выкинуть за ненадобностью, просто по дурацкой прихоти Embarcadero? А может, геморрою по реализации ansistring через юникодные строки на мобилах было больше, чем смысла в этом?

http://developer.android.com/reference/java/lang/String.html Спасибо Andreas Hausladen показавшему что каждый может убедиться что данное ограничение введено искусственно. И однобайтные строки без проблем могут работать и на мобилках.
Не вижу смысла в ограничении т.к. это не более чем слепое подражание java и дотнету. Сами себя высекли.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947502
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947509
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это все и ко строкам начинающимся с нуля относится.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947511
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

это я уже видел.
И еще раз подниму вопрос - если убрали, значит на это были причины. Мое личное мнение - нафиг не уперлись на мобилах не-юникодные строки. Это потенциальный путь в обрыв.
А мифический перенос приложений с десктопа на мобилы - это фантазии тех, кто никогда мобилы в руках не держал.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947514
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще возникает впечатление что nextgen создавали дотнетовцы, которых насильно заставили делать компилятор для дельфи.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947520
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почти не пользую AnsiString и на Windows. Страдания тех, кто пользует AnsiString как byte buffer не разделяю - это концептуально не верно и в XE7 последнее практически доделали для TBytes чтобы им заменить весь такой код.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947528
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

Имешь право на мнение, конечно.
Однако нельзя навязывать свое мнение окружающим насильно, ставя всех перед фактом.

Не нравиться - не используй. Ну или как абсолютный минимум пометь функционал как deprecated.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947534
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckПочти не пользую AnsiString и на Windows. Страдания тех, кто пользует AnsiString как byte buffer не разделяю - это концептуально не верно и в XE7 последнее практически доделали для TBytes чтобы им заменить весь такой код.
+ 0.83 :)
Если бы TBytes умел автоматически дополняться #0 или #0#0, то это было бы +1.
По сути, это тот RTL / compiler magic, которого не достает.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947535
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatОднако нельзя навязывать свое мнение окружающим насильно, ставя всех перед фактом.
можно. причем, я не навязываю, я лишь поддерживаю "навязанный" факт, если так угодно.
анси-строки на мобилах это граната для обезьяны. Если бы Дельфи 1 была сходу юникодная, про анси-строки никто бы уже и не помнил.

Можете привести осмысленный пример использования ansistring именно на мобильных устройствах?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947541
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Longneck,

Оплачивать переделку компонентов и горы кода будешь ты или эмбаркаберо?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947546
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat
Объясни, зачем они тебе ...
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947555
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кто-нибудь поспорит что функционал у TBytes до сих пор меньше чем у строк, которые он призван заменить?
Кроме того уже не простой тип а генерик.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947557
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvесли убрали, значит на это были причинывозможно и были но пошли вразрез с потребностями части клиентов

Michael LongneckПочти не пользую AnsiString и на Windowsнаоборот, до сих пор не юзаю уникод за ненадобностью. иногда и с семибитными текстами приходится работать, но такого уж конечно не прошу
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947562
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatОплачивать переделку компонентов и горы кода будешь ты или эмбаркаберо?
Кому переделка кода не рентабельна, тот сидит на Ansi версиях. Что же касается мобилок, то никакого "переноса" туда сделать нельзя, заново писать надо.

Кто-то приведёт реалистичный пример нужды в этих строках?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947574
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckrgreatОплачивать переделку компонентов и горы кода будешь ты или эмбаркаберо?
Кому переделка кода не рентабельна, тот сидит на Ansi версиях. Что же касается мобилок, то никакого "переноса" туда сделать нельзя, заново писать надо.Ага, ^спасибо^ нексгену.

Кто-то приведёт реалистичный пример нужды в этих строках?Приведи пример необходимости оператора For и Repeat .. until.
Можно же и без них. Переделаешь, а потом и привыкнешь обходиться без них.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947576
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry Arefiev,

Удобно, быстро, много наработанного кода.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947578
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvМожете привести осмысленный пример использования ansistring именно на мобильных устройствах?
Я могу привести, оно специфично, но оно живет. С андроида общаюсь с устройствами через свисток usb-rs.

П.С. Оно мне не мешает, я лишь в качестве примера привел.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    private int sendString(final String text, final boolean needCalcBcc, final int timeout) {
        byte[] bytes;
        try {
            bytes = needCalcBcc ? (text+calcBcc(text)).getBytes("US-ASCII") : text.getBytes("US-ASCII");
        } catch (UnsupportedEncodingException e) {
            Log.e(LOG_TAG, "Encoding error: "+e.getMessage(), e);
            return ERROR_CODE_PAGE;
        }



Из прочих примеров разве что кто-то где-то поддерживает dbf файлы в кодировках 866 и 1251. Пример в разделе "андроид".
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947588
Kerk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatКто-нибудь поспорит что функционал у TBytes до сих пор меньше чем у строк, которые он призван заменить?
Кроме того уже не простой тип а генерик.

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

Я сейчас много работаю с поступающими извне ascii-строками. Чтобы такую строку из TBytes превратить в полноценный string или наоборот, требуется ровно одна строка кода. Ну и нафига лишние типы строк"
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947594
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kerk,

"Чтобы такую строку из TBytes превратить в полноценный string или наоборот, требуется ровно одна строка кода."
Если изначально работал со строками ничего превращать и не требовалось. 0 строк кода. 0 загрузки процессора и памяти.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947610
Kerk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если раньше работал со строками, приходилось по всей программе помнить что за мусор в какой строке и в какой кодировке. А теперь статическая типизация позволяет жестко отделить буферы от строк и точка конвертации ровно одна и понятная.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947649
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kerk,

Если у меня нет и не было таких проблем, может вы делали что-то не так?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947664
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У строк, в отличии от динамического массива, есть COW, без которого иногда очень плохо. Если этого кому-то никогда не требовалось, то это свидетельствует лишь о его опыте, но не более.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947669
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvА мифический перенос приложений с десктопа на мобилы - это фантазии тех, кто никогда мобилы в руках не держал.поскольку delphi думает, что может создавать софт не только для мобилок, но и для планшетов, то можно случаи придумать: раньше софт работал на тач-терминалах на винде, сейчас - на андроидных планшетах. почему бы тупо не перекомпилить все, как было? :-)

Michael Longneckв XE7 последнее практически доделали для TBytes чтобы им заменить весь такой кодне в курсе последних XE. там у TBytes уже есть счетчик счетчик ссылок и COW + стандартные функции Replace/Pos/RPos/Starts/Ends/Trim/(De)Quote?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947677
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Осталось только ответить на вопрос: что за зверь такой ANSI Code Page на ведроиде и где он выбирается?..
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947684
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovОсталось только ответить на вопрос: что за зверь такой ANSI Code Page на ведроиде
Это стандарт ISO.

и где он выбирается?..Операционка это не только визульный интерфейс.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947696
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЭто стандарт ISO.
ANSI это ISO? Крутая у вас трава...

rgreatОперационка это не только визульный интерфейс.
Мы всё ещё говорим о ведроиде и прочих мобильных недоразумениях?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947716
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovrgreatЭто стандарт ISO.
ANSI это ISO? Крутая у вас трава...
Они участвовали в разработке стандарта ISO.

rgreatОперационка это не только визульный интерфейс.
Мы всё ещё говорим о ведроиде и прочих мобильных недоразумениях?..
Вы серьезно верите что мобильные оси это исключительно визуальный интерфейс?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947723
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatВы серьезно верите что мобильные оси это исключительно визуальный интерфейс?

Вопрос не в том во что верю я, а в том какое значение, где и как у мобильных ОСей
установлено в качестве ANSI Code Page. Ну и для OEM Code Page до кучи.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947851
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВопрос не в том во что верю я, а в том какое значение, где и как у мобильных ОСей
установлено в качестве ANSI Code Page. Ну и для OEM Code Page до кучи.
Мобильным осям надо взаимодействовать с устройствами которые этот стандарт используют.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947884
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВопрос не в том во что верю я, а в том какое значение, где и как у мобильных ОСей
установлено в качестве ANSI Code Page.
Ты этим странным вопросом что-то сказать хочешь? Если тебе действительно интересно, то открываешь исходник TEncoding.GetANSI и смотришь каким кодпейджем инициализируется возвращаемый объект. Раскопки приведут тебя в system.getacp, там и увидишь.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947896
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatэтот стандарт
Из трёх слов ты видишь только одно, с самыми большими буквами? Может, стоит поменять очки?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947907
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947914
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatОплачивать переделку компонентов и горы кода будешь ты или эмбаркаберо?
ну каких компонентов? Которые работают на десктопе, и не годятся для мобил?

vavanвозможно и были но пошли вразрез с потребностями части клиентов
ну конечно. Эмбаркадеро враг, потому что не дает сесть голой жопой на ежа.

rgreatПриведи пример необходимости оператора For и Repeat .. until.
прекратите валять дурака. вы сравниваете неюникодные строки с циклами, которым никто не мешает нигде выполняться.

fd00chсейчас - на андроидных планшетах. почему бы тупо не перекомпилить все, как было?
не получится же. еще раз - те, кто имеют мысли на эту тему, никогда не держал в руках мобильных устройств и не работал с их приложениями.
Если же неохота отказываться от ansi - ну выбирайте тогда для приложений планшеты на Surface с виндой (не RT).
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947916
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
kdvrgreatПриведи пример необходимости оператора For и Repeat .. until.
прекратите валять дурака. вы сравниваете неюникодные строки с циклами, которым никто не мешает нигде выполняться.

перестань включать дурака. rgreat толсто намекал о том, что вместе с убиванием AnsiString можно убить и лишние типы циклов - зачем они ? Оставить только один - while, как завещал дедушка Вирт, а пипл, он схавает...
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947921
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvну каких компонентов? Которые работают на десктопе, и не годятся для мобил?
Чего тебя всё в гуй тянет, другого кода не бывает что-ли?

kdvну конечно. Эмбаркадеро враг, потому что не дает сесть голой жопой на ежа.
Кто боиться куда-то там сесть, тот просто не пользуется и дышит ровно. А возвращение байтовых строк - самый голосуемый репорт в QC.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947925
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvrgreatОплачивать переделку компонентов и горы кода будешь ты или эмбаркаберо?
ну каких компонентов? Которые работают на десктопе, и не годятся для мобил?
Моих компонентов.
Которые могли бы работать везде и даже без {$IFDEF}, еслиб не идиотские игры со строками в NextGen.

kdvrgreatПриведи пример необходимости оператора For и Repeat .. until.
прекратите валять дурака. вы сравниваете неюникодные строки с циклами, которым никто не мешает нигде выполняться.
Почему бы не сравнить. И то и то - возможности языка.
Почему в XE9 кому-то не взбредет в голову что 3 вида циклов одновременно - это слишком сложно для юзера?

kdvfd00chсейчас - на андроидных планшетах. почему бы тупо не перекомпилить все, как было?
не получится же. еще раз - те, кто имеют мысли на эту тему, никогда не держал в руках мобильных устройств и не работал с их приложениями.
Если же неохота отказываться от ansi - ну выбирайте тогда для приложений планшеты на Surface с виндой (не RT).
Есть отличная фраза на мой взгляд прекрасно подходящая в данном случе:
"Не указывайте мне что делать и я не скажу куда Вам идти."
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947930
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе COW семантика TBytes не помешала бы.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947936
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckВ принципе COW семантика TBytes не помешала бы.
Угу, и еще бы много чего не помешало.
И тогда да, выйдет конфета.

Правда в итоге окажеться что все это проще всего реализуется через type TBytes = System.RawByteString;
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947937
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckВ принципе COW семантика TBytes не помешала бы.
Как и возможность использовать для определения констант.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947940
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в чём проблема с константами? Константный массив объявить всегда можно было.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947949
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Longneck, ну объяви константу типа TBytes...
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947950
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Longneck,

Как то так?
Код: pascal
1.
2.
const
  ConnLostMessage : TBytes = 'Connection is lost!';



Или мы будем наблюдать нечто нечитаемое человеком?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947953
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ээээ. А смысл? TBytes это массив байт. Я могу понять пожелание типа

Код: pascal
1.
const Test: TBytes = 0x353464576467adadff;



А ещё и строковая константа? Вам попросту нужна строка да и всё.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947955
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorrgreat толсто намекал о том, что вместе с убиванием AnsiString можно убить
и лишние типы циклов
rgreat порет полную чушь, вероятно, наивно полагая, что AnsiString имеют конкретную
кодировку. Спорим, он не сможет ответить на вопрос что должно получиться в результате
присваивания AnsiString := WideString?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947956
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatИли мы будем наблюдать нечто нечитаемое человеком?
Я бы согласился даже на это, но увы и ах.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947957
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckЭэээ. А смысл? TBytes это массив байт.
А ещё и строковая константа? Вам попросту нужна строка да и всё .
Вот тут ты попал в точку.

Мне нужна строка а не TBytes ибо она умеет все преимущества перед TBytes не имея его ограничений.
А байтовые строки они просто взяли и отключили!
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947959
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckЭэээ. А смысл? TBytes это массив байт
Ну так покажи, как ты объявишь этот массив байт.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947961
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК, а зачем тебе байтовая строка? Чем обычный string плох?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947964
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
const
  Test: TBytes = [0,45,45, 245];



Компилируется в XE7.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947966
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckОК, а зачем тебе байтовая строка? Чем обычный string плох?
Потому что в строке не байты, а мне нужны, внезапно, байты и не нужны лишние преобразования.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947967
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Longneck
Код: pascal
1.
2.
const
  Test: TBytes = [0,45,45, 245];



Компилируется в XE7.
Зато совершенно точно не компилируется в XE2.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947973
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...и даже в XE6 оно не компилируется.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947976
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну я же говорил что в XE7 динамические массивы доработали

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
var
  A: array of integer;
  B: TBytes = [1,2,3,4]; //Initialization can be done from declaration
begin
  ...
  A:=[1,2,3]; // assignation using constant array
  A:=A+[4,5]; // addition - A will become [1,2,3,4,5]

  A := Concat([1,2,3],[4,5,6]); //A will become [1,2,3,4,5,6]
 
  A:=[1,2,3,4];
  Insert(5,A,2); // A will become [1,2,5,3,4]

end;
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947978
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a RawByteString тоже ведь выпилен?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947979
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
последний end. потому как локальные переменные не инициализирует.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947980
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckНу я же говорил что в XE7 динамические массивы доработали
Еще 2-3+ версий дельфи и TBytes будет похож по функционалу на жалкое подобие RawByteString.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947981
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fd00cha RawByteString тоже ведь выпилен?
Да.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947984
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут сейчас такую жопу нарыл... Решил посмотреть как происходит присваивание константного массива переменной. Оказалось, в момент присваивания делается его полная копия, это для ссылочного-то типа. Ладно, подумал я, COW там нет, поэтому просто не стали заморачиваться и сделали тупо. Решил проверить строки. И жопа обнаружилась именно тут - теперь (проверял на XE7) они тоже делают копию строки, а не просто копируют ссылку. На XE2 копировалась только ссылка, с какой версии это млядство с полным копированием началось выяснять лень.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947986
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А пример? Что-то я такого не вижу.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947987
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckНу я же говорил что в XE7 динамические массивы доработали
XE7 это теперь означает "всегда"?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947989
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckА пример? Что-то я такого не вижу.
Какой пример? Объявляешь константы, затем переменным присваиваешь значение этих констант. Ставишь бряк на присваивание и трейсишь до CopyDynArray (или что-то вроде того) или _NewUnicodeString.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947991
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyРешил проверить строки. И жопа обнаружилась именно тут - теперь (проверял на XE7) они тоже делают копию строки, а не просто копируют ссылку. На XE2 копировалась только ссылка, с какой версии это млядство с полным копированием началось выяснять лень.Это они походу в рамках подготовки к immutable strings родили.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947993
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
const
  sTest = 'Test';

procedure TForm17.FormCreate(Sender: TObject);
var
  s: String;
begin
  s := sTest;
  Caption := s;

...



Не вижу. Счётчик щёлкает и всё.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947996
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckНе вижу. Счётчик щёлкает и всё.
Трейси присваивание переменной значения константы.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38947997
Michael Longneck
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_UStrLAsg вот этот вызов и всё
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948001
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael Longneck_UStrLAsg вот этот вызов и всё
Его и нужно трейсить.

Но уже не нужно. Посыпаю голову пеплом. Оказалось, что копирование делается только для глобальных переменных, локальные инициализируются всё так-же - счетчиком. Написал маленький тест демонстрирующий это:
Тестик на скорую руку
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils;

var
 s:string;

procedure test;
const
 ss = '111111111111111111111111111111111111111111111111111111111111111111111111';
var
// s:string;
 ta : NativeUInt;
begin
 ta := getHeapStatus.TotalAllocated;
 s := ss;
 Writeln(getHeapStatus.TotalAllocated - ta);
end;
begin
 test;
 readln;
end.


Проверять при закоментированной и раскоментированной локальной переменной.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948002
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...а массивы в любом случае копирует полностью.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948007
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а давайте для примера вернемся во времена появления Delphi 2009 с юникодными строками.
PChar теперь другой. string другой. string[0] - ересь. Срочно пишем тикеты в QC на тему возврата старого поведения? Кому-то неохота переписывать компоненты?
Чем кончилось-то? Аааа... появился какой-то AnsiString, против которого началась борьба. А потом AnsiString где-то исчез, и за него опять начинается борьба. Не было ведь всей этой мутотени в Delphi 2007.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948009
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyОказалось, что копирование делается только для глобальных переменных, локальные инициализируются всё так-же - счетчиком
Оказалось, что полные копии строковых констант делаются не только для глобальных переменных, но и для полей объектов.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948010
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv,

Перевод в 2009 string на юникод был болезненнен но оправдан, ибо надо было перевести на него UI.
Однако для тех кому надо оставили полнофункциональные AnsiString и RawByteString.

Где они равноценная им замена в NextGen-е?
Ну и Zero Based Strings - зачем?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948011
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvstring[0] - ересь.
Я тебе освежу память - string[0] стал ересью с приходом ansistring.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948018
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyЯ тебе освежу память - string[0] стал ересью с приходом ansistring.
до выхода 2009 на ansistring большинство клало болт.
А я еще процитирую gunsmoker:
http://www.gunsmoker.ru/2013/05/modern-delphi.html

Если вы посмотрите на этот список, то заметите следующую вещь: всюду в вашей программе вы оперируете со строками типа string. Все прочие типы строк нужны вам исключительно для совместимости со сторонним кодом: вашим же старым кодом (AnsiString или Pascal-строки), ОС (нуль-терминированные или BSTR) и т.п. Такой зоопарк не только вызывает путаницу (вопросы вида "в чём разница между WideString и UnicodeString?"), но и весьма сложен для переноса на другие платформы (чему равен WideString на iOS?). Поэтому идея заключается в том, чтобы оставить один тип строк - самый удобный и универсальный. Гораздо лучше использовать не строковые типы (записи/классы) для коммуникации с внешним миром - так их семантика будет понятнее. А перегрузка операторов сделает безболезненным операции присваивания.

Именно поэтому на новых LLVM компиляторах iOS есть только тип string. Все прочие типы строк там не объявлены и при попытке ими воспользоваться сгенерируют вам ошибку вида "Undeclared identificator AnsiString". Новый тип string в целом равен UnicodeString (т.е. хранит данные строки в UTF-16, имеет счётчик ссылок и длины, а также поле кодовой страницы, которое перманентно равно CP_UTF16 = 1200 ($4B0), и поле размера символа, которое перманентно равно 2 байтам).
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948020
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvдо выхода 2009 на ansistring большинство клало болт.
Дима, до выхода D2009 ansistring был эквивалентом string.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948021
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...и если уж совсем позанудствовать, то появились они в Delphi 2, кажется. И именно тогда шортстринговый string[0] стал ересью.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948022
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyДима, до выхода D2009 ansistring был эквивалентом string.
эта фраза не стыкуется с
"Я тебе освежу память - string[0] стал ересью с приходом ansistring"

то есть, начиная с Delphi 2 никто не использовал string[0] ? Откуда тогда в документах по переходу на версию 2009 этот самый string[0] упоминается как однозначный источник проблем переноса кода с предыдущих Delphi, вплоть до 2007?
я бы предложил не буквоедствовать.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948023
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
kdvОткуда тогда в документах по переходу на версию 2009 этот самый string[0] упоминается как однозначный источник проблем переноса кода с предыдущих Delphi, вплоть до 2007?
Ошибка в документе. Но чтобы убедиться нужна цитата из документа.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948025
fd00ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv а также поле кодовой страницы, которое перманентно равно CP_UTF16 = 1200 ($4B0) ну хоть кто-то будет утилизировать 4 ГБ памяти на смартфонах
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948026
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvэта фраза не стыкуется с
"Я тебе освежу память - string[0] стал ересью с приходом ansistring"
Очень даже стыкуется т.к. сперва строки были и вовсе статическими. Потом пришли динамические строки (т.н. long-strings), и статические получили название shortstring, а динамические ansistring и стали псевдонимом для string (это регулировалось директивой компилятора $H).

kdvто есть, начиная с Delphi 2 никто не использовал string[0] ?
Только для shortstring, которые уж точно мало кто использовал.

kdvОткуда тогда в документах по переходу на версию 2009 этот самый string[0] упоминается как однозначный источник проблем переноса кода с предыдущих Delphi, вплоть до 2007?
я бы предложил не буквоедствовать.
В документах у абракадабры ещё и не такое отыскать можно.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948027
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил как там с присваиванием константных строк у FreePascal. Копирует только ссылку - зачёт!
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948028
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-Ошибка в документе. Но чтобы убедиться нужна цитата из документа.
во-первых, прочитайте статью Gunsmoker про строки
http://www.gunsmoker.ru/2013/05/modern-delphi.html
во вторых,
http://edn.embarcadero.com/article/38703
впрочем, в этой статье действительно не написано про string[0]. Признаю, насчет string[0] был неправ, в XE8 скомпилировался и работает (выдает тот же результат, что и в 2007) код

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure TForm1.Button1Click(Sender: TObject);
var
  s1, s2: string[20];
  b: byte;
begin
  s1:='abc';
  s2:='def';
  s1:=s1+s2;
  b:=byte(s1[0]);
  ShowMessage(IntToStr(b));
end;



а в статье 2 речь шла о том, что string[n] в 2009 уже не 1байтовый char, а widechar. Попутал, виноват.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948035
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyОчень даже стыкуется т.к. сперва строки были и вовсе статическими. Потом пришли динамические строки (т.н. long-strings), и


убили многопоточность на корню.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948038
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovубили многопоточность на корню.Чем ShortString лучше AnsiString для многопоточности?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948039
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreatЧем ShortString лучше AnsiString для многопоточности?
При копировании шортстрингов нет операций блокировки, в анси лочится инкремент счетчика ссылок. Правда я особых провалов не наблюдал. Вот что действительно убивает многопоточку так это список слабых ссылок на nextgen.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948040
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey Правда я особых провалов не наблюдал.

У меня еще как проваливалось
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948041
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovУ меня еще как проваливалось
На каком проце? http://stackoverflow.com/questions/3339141/x86-lock-question-on-multi-core-cpus
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948042
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyasviridenkovУ меня еще как проваливалось
На каком проце? http://stackoverflow.com/questions/3339141/x86-lock-question-on-multi-core-cpus

Детально тестировал давно, кажется это был AMD64
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948043
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно проблема именно в AMD
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948045
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asviridenkovДетально тестировал давно, кажется это был AMD64
В смысле, Athlon 64?

rgreatВозможно проблема именно в AMD
Правильнее будет так: Возможно проблема именно в старых AMD.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948046
asviridenkov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyasviridenkovДетально тестировал давно, кажется это был AMD64
В смысле, Athlon 64?


Да
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948208
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvЭмбаркадеро враг, потому что не дает сесть голой жопой на ежане эмбракоделова ума дело угадывать что нужно разработчику. им бы самим с ежа слезть на к-м они еще и задом наперед едут
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948580
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Michael LongneckВ принципе COW семантика TBytes не помешала бы.
Можно пример?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948612
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747Можно пример?
Есть некое внутреннее состояние, которое пользователь может получить функцией или свойством. Критически важно не позволить ему модифицировать это состояние.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948724
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey,

Копировать ему в буфер сразу, и пусть с ним делает всё что захочет.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948729
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cobalt747Копировать ему в буфер сразу, и пусть с ним делает всё что захочет.
Наличие COW, как раз, и позволяет избегать ненужных копирований.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948859
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на мой взгляд, COW, пытаясь решать мнимые проблемы, только создает реальные
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948895
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovна мой взгляд, COW, пытаясь решать мнимые проблемы, только создает реальные
Какие?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948911
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyAleksandr Sharahovна мой взгляд, COW, пытаясь решать мнимые проблемы, только создает реальные
Какие?

Какие мнимые или какие реальные? Чтобы не растекаться,
скажу, что в целом мне программировать было бы удобнее,
если бы COW для строк не было.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948922
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovКакие мнимые или какие реальные?
Какие реальные? Особенно если учесть, что COW обходится на раз-два.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948932
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyAleksandr SharahovКакие мнимые или какие реальные?
Какие реальные? Особенно если учесть, что COW обходится на раз-два.

Я типа знаю, как обходится. Только достает обходить.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38948938
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr SharahovТолько достает обходить.
Это и есть реальная проблема?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38949015
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyAleksandr SharahovТолько достает обходить.
Это и есть реальная проблема?

Реальная проблема - скорость в многопоточных приложениях, в пользовательском интерфейсе или в неумелых руках. И примеров тому море.

Вот из недавнего прошлого. Есть процедура, которая вызывается из UI. Интенсивно использует строки, варианты и прочее колдунство. Работает ~11 сек, что естественно нервирует пользователя. Ценой различных извращений время удалось снизить до 3 сек. Уверен, если бы у разработчиков не было под рукой всего этого супер-арсенала, время работы процедуры было бы в районе 0.3-0.5 сек.

Вот из очень далекого. Программист, который в жизни своей написал всего-то две-три прожки длиной больше 500 строк, ни с того ни с сего принялся писать довольно эффективные программы, в которых и строк было в достатке, и вычислений. А все потому, что в тогдашнем компиляторе всего этого супер-арсенала не было.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38949040
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TASM.EXE вам в руки.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38949070
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov, что, как-то, быстро ты перешёл от COW на управляемые типы вообще.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38949228
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey, ты хочешь поговорить об этом? только теперь не знаю уже, стоит ли.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38949302
Cobalt747
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev AlexeyCobalt747Копировать ему в буфер сразу, и пусть с ним делает всё что захочет.
Наличие COW, как раз, и позволяет избегать ненужных копирований.

BeltarВообще у любого нормального человека при работе с компом вырабатывается правило, прежде чем что-то править, делай копии и сохраняйся, как можно чаще, если не вырабатывается, то таких нельзя к компам на пушечный выстрел подпускать.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #38949339
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahovтолько теперь не знаю уже, стоит ли.
Не держи в себе.

Cobalt747BeltarВообще у любого нормального человека при работе с компом вырабатывается правило, прежде чем что-то править, делай копии и сохраняйся, как можно чаще, если не вырабатывается, то таких нельзя к компам на пушечный выстрел подпускать.
Ты сейчас о чём, вообще???
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
NextGen compiler и AnsiString
    #39618996
PalychXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот и я столкнулся с забавной ситуацией, когда при попытке перенести на Delphi 10.1/10.2 приличный объем кода с VCL (который изначально не предполагалось портировать под другие платформы) на Android радостно все отладил в FM под Виндой, а потом сменил платформу и вылезли грабли отсутствия типа AnsiString для Андроид.
В коде много строк в DOS-кодировке (идет работа с различным железом):
Код: pascal
1.
2.
type
  DosString = type AnsiString(866);


Было очень удобно совмещать такой тип с юникодом (задал кодировку и можно присваивать юникодную строку даже без явного приведения типа если уверен, что кроме латинских символов и кириллицы ничего нет) и копировать данные Move() в буфер для передачи в железо или обратно.
Попробовал хак из первого сообщения темы, только более свежую версию для D10.1 - для Андроида получил ошибку при попытке объявить тип "DosString = type AnsiString(866);" и заметил, что для Андроида при использовании Move начальным элементом анси-строки является нулевой элемент.
Еще вместо AnsiString попробовал RAWByteString и SetCodePage (небольшие задержки не критичны). Но тут если сменил кодировку на CP866, то и добавлять нужно тоже в этой же кодировке или сначала формировать все в Win1251 и только перед передачей в железку менять кодировку. Видимо, по этому пути и придется идти, но все это займет прилично времени на модификацию кода и как бы где-то чего-то не забыть.
Поэтому на всякий случай хочу спросить, может кто уже нашел более изящное решение для такой задачи и ему будет не жалко поделиться своими мыслями.
З.Ы. Попробовал и вот такой "велосипед" , но на 10.1/10.2 он сходу не завелся. Попробовал поправить ошибки насколько я понял смысл действий автора - не сработало даже банальное присваивание значения строке, не говоря уже об автоматической конвертации кодировок.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #39619001
Фотография krapotkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот поэтому всегда говорилось - не используйте хаки типа
PalychXXможно присваивать юникодную строку даже без явного приведения типа если уверен
INDY вообще тотально вместо массива байт строки гоняло
ни к чему хорошему это не приводит
если есть кодировки, то можно пользоваться TStringStream с явным указанием Encoding
там все будет перекодировываться нормально.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #39619148
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PalychXX,

Придётся писать костыли, никуда не денешься
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #39619235
PalychXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
krapotkinможно пользоваться TStringStream с явным указанием Encoding
Спасибо, но вот сходу не понял, как там явно указать кодировку (такое свойство есть, но ReadOnly).
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #39619259
PalychXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А, понял, ее при создании экземпляра можно указать:
Код: pascal
1.
ss := TStringStream.Create('', TEncoding.ANSI.GetEncoding(866));


Еще раз спасибо!
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #39619364
Василий №2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот когда хотя бы Pos сделают для TBytes, можно будет начать говорить о ненужности однобайтовых строк.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #39619444
PalychXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробовал вместо велосипеда на скорую руку сделать самокат, чтобы как-то приблизить функционал к AnsiString:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
const
  DefCodePage = 1251;

type
  MyString = packed record
    private
      ss: TStringStream;
      function GetData(a: integer): Char;
      procedure SetData(a: integer; const Value: Char);
    public
      class operator Implicit(a: String): MyString;
      property Data[a: integer]: Char Read GetData Write SetData; Default;
      Constructor Create(const CodePage: Cardinal);
      procedure Free;
  end;

implementation

{ MyString }

constructor MyString.Create(const CodePage: Cardinal);
begin
  ss := TStringStream.Create('', TEncoding.ANSI.GetEncoding(CodePage));
end;

procedure MyString.Free;
begin
  FreeAndNil(Self.ss);
end;

function MyString.GetData(a: integer): Char;
begin
  Result := ss.DataString[a];
end;

class operator MyString.Implicit(a: String): MyString;
var
  r: MyString;
begin
  R.Create(DefCodePage);
  R.ss.Clear;
  R.ss.WriteString(a);
  Result := r;
  //R.Free;
end;

procedure MyString.SetData(a: integer; const Value: Char);
var
  s: string;
begin
  s := ss.DataString;
  s[a] := Value;
  ss.Clear;
  ss.WriteString(s);
end;



Если оставить все как есть и в цикле присвоить сотню раз переменной одну и ту же строку:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
var
  ds: MyString;
  i: Integer;
begin
  ds := MyString.Create(866);
  for i := 1 to 100 do
    ds := 'Проверка связи';
  //ds := ds + ' 123';
  ShowMessage('ds[1] = ' + ds[1]);
end;


то при ReportMemoryLeaksOnShutdown := true; на выходе вижу инфу об утечках памяти:
---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:
21 - 28 bytes: TMBCSEncoding x 100
29 - 36 bytes: TStringStream x 100
The sizes of unexpected leaked medium and large blocks are: 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236, 8236
---------------------------
ОК
---------------------------

Если раскомментировать в MyString.Implicit строку "R.Free;", то обращение к ds.ss[1] ожидаемо выдает Access violation.

Столкнулся с проблемой создания автоматического деструктора для записи. На stackoverflow был совет делать так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
TMyRecord = record
  obj: TMyObject;
  guard: IInterface;
end;

rec.obj := TMyObject.Create;
rec.guard := rec.obj;



Но Дельфа шлет меня лесом - TStringStream это не IInterface.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #39619509
Василий №2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У записей деструкторов пока не сделали. Так что придется обернуть объект в интерфейс (потомок interfacedobject, чья единственная функция - в деструкторе делать Free объекту, с которым он связан).
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #39619518
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Достаточно type TInterfacedStringStream = class(TStringStream, IInterface) + скопировать реализацию TInterfacedObject.
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #39619653
PalychXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо! Но, пожалуйста, изложите последние 2 совета чуть развернутей.
Попробовал второй:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
  TInterfacedStringStream = class(TStringStream, IInterface)
{$IFNDEF AUTOREFCOUNT}
  private const
    objDestroyingFlag = Integer($80000000);
    function GetRefCount: Integer; inline;
{$ENDIF}
  protected
{$IFNDEF AUTOREFCOUNT}
    [Volatile] FRefCount: Integer;
    class procedure __MarkDestroying(const Obj); static; inline;
{$ENDIF}
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
  public
{$IFNDEF AUTOREFCOUNT}
    procedure AfterConstruction; override;
    procedure BeforeDestruction; override;
    class function NewInstance: TObject; override;
    property RefCount: Integer read GetRefCount;
{$ENDIF}
  end;

...

{ TInterfacedStringStream }

{$IFNDEF AUTOREFCOUNT}
function TInterfacedStringStream.GetRefCount: Integer;
begin
  Result := FRefCount and not objDestroyingFlag;
end;

class procedure TInterfacedStringStream.__MarkDestroying(const Obj);
var
  LRef: Integer;
begin
  repeat
    LRef := TInterfacedStringStream(Obj).FRefCount;
  until AtomicCmpExchange(TInterfacedStringStream(Obj).FRefCount, LRef or objDestroyingFlag, LRef) = LRef;
end;

procedure TInterfacedStringStream.AfterConstruction;
begin
// Release the constructor's implicit refcount
  AtomicDecrement(FRefCount);
end;

procedure TInterfacedStringStream.BeforeDestruction;
begin
  if RefCount <> 0 then
    Error(reInvalidPtr);
end;

// Set an implicit refcount so that refcounting during construction won't destroy the object.
class function TInterfacedStringStream.NewInstance: TObject;
begin
  Result := inherited NewInstance;
  TInterfacedStringStream(Result).FRefCount := 1;
end;

{$ENDIF AUTOREFCOUNT}

function TInterfacedStringStream.QueryInterface(const IID: TGUID; out Obj): HResult;
begin
  if GetInterface(IID, Obj) then
    Result := 0
  else
    Result := E_NOINTERFACE;
end;

function TInterfacedStringStream._AddRef: Integer;
begin
{$IFNDEF AUTOREFCOUNT}
  Result := AtomicIncrement(FRefCount);
{$ELSE}
  Result := __ObjAddRef;
{$ENDIF}
end;

function TInterfacedStringStream._Release: Integer;
begin
{$IFNDEF AUTOREFCOUNT}
  Result := AtomicDecrement(FRefCount);
  if Result = 0 then
  begin
    // Mark the refcount field so that any refcounting during destruction doesn't infinitely recurse.
    __MarkDestroying(Self);
    Destroy;
  end;
{$ELSE}
  Result := __ObjRelease;
{$ENDIF}
end;



А запись можно оставить как есть, просто добавить поле guard: IInterface; и в конструкторе сделать Self.guard := TInterfacedStringStream(Self.ss)? Компилируется, но на этйо строчке AV вылетает. ЧЯДНТ?
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #39620020
PalychXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Эх, просто не сразу догадался поменять тип в записи:
Код: pascal
1.
ss: TInterfacedStringStream {TStringStream};


После этого вроде бы все заработало. Всем большое спасибо!!!
...
Рейтинг: 0 / 0
NextGen compiler и AnsiString
    #39620362
Василий №2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну... так, конечно, тоже можно, но слишком уж сложно.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
  // Интерфейс-контейнер для объекта временного запроса. Удаляется при выходе
  // за границы области видимости.

  IAutoFreeQuery = interface
    function GetQuery: TQuery;
  property
    Query: TQuery read GetQuery;
  end;

  TAutoFreeQuery = class(TInterfacedObject, IAutoFreeQuery)
  private
    FQuery: TQuery;
  public
    destructor Destroy; override;
    function GetQuery: TQuery;
  end;

destructor TAutoFreeQuery.Destroy;
begin
  FreeAndNil(FQuery);
  inherited;
end;

function TAutoFreeQuery.GetQuery: TQuery;
begin
  Result := FQuery;
end;

// Создает обернутый в интерфейс (самоудаляемый) запрос для временных манипуляций
function TfrmMain.GetTempQuery: IAutoFreeQuery;
var res: TAutoFreeQuery;
begin
  res := TAutoFreeQuery.Create;
  res.FQuery := TQuery.Create(Self);
  res.FQuery... := ...;
  Result := res;
end;



Можно расширить на любой класс содержимого с помощью дженериков
...
Рейтинг: 0 / 0
118 сообщений из 118, показаны все 5 страниц
Форумы / Delphi [игнор отключен] [закрыт для гостей] / NextGen compiler и AnsiString
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]