Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2017, 10:50   #1
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию Как вывести строку "старого" типа в компонентах Дельфи "нового" типа?

Здравствуйте!
Вопрос может показаться примитивным, элементарным, много раз решённым и т.п., но прошу, всё же, отнестись с пониманием.
До этого всячески пытался обходить эту проблему, но достало и хочу уже понять: как нормально вывести строку вида, которая была в Delphi 7 (если не ошибаюсь, ANSI) в Edit (например), Delphi XE (который работает с Unicode, если, опять же, не ошибаюсь)? Попытки найти это в интернете выводят на тонну самописных функций или недоотвеченные советы воспользоваться различными функциями различных юнитов. Ни одного законченного и простого ответа мне найти не удалось. Неужели Delphi не предусмотрело простой функции конвертации строк старого вида в новый и обратно?
Перед созданием темы попробовал воспользоваться StringToWideChar.
Код:
var
  wideChars   : array [0..1024] of WideChar;
  Str7:String;
  StrXE:WideString;
begin
    ...
    Str7:=DecodeWord(Edit1.Text);
    StrXE:=StringToWideChar(Str7,wideChars,Length(Str7)+1);
    ComboBox1.Items.Add(StrXE);
    ...
end;
DecodeWord возвращает строку, которая отлично понимается в D7, но в DXE вместо кириллицы выводятся крякозябры.
StringToWideChar ничего не поменял независимо от того вывожу ли я StrXE или wideChars.
Можно ли без лишних заморочек решить эту проблему?
Ship_1 вне форума Ответить с цитированием
Старый 23.06.2017, 10:57   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

String это и так WideString в XE.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.06.2017, 11:00   #3
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Ну это я тоже догадываюсь, встречал, пока пытался найти решение, но как мне его получить из прежнего String?
После написания темы я попробовал поменять
Код:
var
  Str7:String;
на
Код:
var
  Str7:ANSIString;
но результатов это тоже не дало.
Ship_1 вне форума Ответить с цитированием
Старый 23.06.2017, 11:04   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Какого прежнего? Там ж и в Edit1.Text не AnsiString.
А DecodeWord это что?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 23.06.2017, 11:09   #5
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Ну я ж пояснил
DecodeWord возвращает строку, которая отлично понимается в D7 - прежнем Дельфи, строка прежнего формата, наверное, ANSI, у которого значения кириллицы располагались до 255 номера таблицы символов, а не на 1000+, как в Юникоде. DecodeWord использует Chr, который возвращает символы по прежним номерам.

Последний раз редактировалось Ship_1; 23.06.2017 в 11:11.
Ship_1 вне форума Ответить с цитированием
Старый 23.06.2017, 11:10   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
но результатов это тоже не дало
разбирайтесь с функцией DecodeWord - проблема, похоже, как раз в ней.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.06.2017, 11:14   #7
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Serge_Bliznykov, DecodeWord использует Chr, который возвращает символы по прежним номерам, где кириллица находится в диапазоне от 100 с чем-то до 255, и возвращает строку соответствующую. Эта строка понимается в D7 (проверял), в функции проблемы нет. Проблема в том, как перевести эту строку в вид, который поймут компоненты Delphi XE.
Ship_1 вне форума Ответить с цитированием
Старый 23.06.2017, 11:37   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Ship_1 Посмотреть сообщение
Serge_Bliznykov, DecodeWord использует Chr, который возвращает символы по прежним номерам, где кириллица находится в диапазоне от 100 с чем-то до 255,
ничего не понял, что за номера, при чём здесь Chr(), что там происходит со строкой, что возвращает функция...


Цитата:
Сообщение от Ship_1 Посмотреть сообщение
в функции проблемы нет
а я Вам ещё раз повторяю - проблема как раз в этой функции.
Либо меняйте её код на нормальный, либо обеспечивайте ей на вход то, что она ждёт, а полученный от неё результат преобразуйте в то, что Вам надо.

так понятней?

я ещё раз повторю, я не понимаю, что делает функция DecodeWord, поэтому нижепредложенный код может оказаться бесполезным,
но, если Вы так уперлись и не хотите показывать (и менять) код функции, тогда попробуйте строку сконвертировать предвварительно в Ansi:
отсюда
Код:
function WideStringToString(const Source: WideString; CodePage: UINT): AnsiString;
...
begin
   ...
    // Convert source UTF-16 string (WideString) to the destination using the code-page
    strLen := WideCharToMultiByte(CodePage, 0,
        PWideChar(Source), Length(Source), //Source
        PAnsiChar(cpStr), strLen, //Destination
        nil, nil);
    ...
end;
использовать:
Код:
var
  StrXE:WideString;
begin
  StrXE:=Edit1.Text;
  ComboBox1.Items.Add( DecodeWord(WideStringToString( StrXE, 1251 )));
end;
p.s. не забудьте в DecodeWord исправить все String на AnsiString, а все Char и Chr - на AnsiChar

Последний раз редактировалось Serge_Bliznykov; 23.06.2017 в 11:46.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.06.2017, 12:07   #9
Ship_1
Форумчанин
 
Регистрация: 10.02.2014
Сообщений: 526
По умолчанию

Цитата:
...либо обеспечивайте ей на вход то, что она ждёт...
Да... Так понятней...
Непонятно что здесь strLen и cpStr...

Chr не меняется на AnsiChar - это же встроенная функция

Последний раз редактировалось Ship_1; 23.06.2017 в 12:13.
Ship_1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Нажатие ссылки типа <a class="button_mediu" href="blabla/44">Сражатmься</a> Dima170792 Работа с сетью в Delphi 1 25.01.2014 20:15
Как "повесить " передачу данных из формы на событие нажатия кнопки типа "button" ? vedro-compota JavaScript, Ajax 10 14.12.2010 21:05
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
Как преобразовать строку типа "яяя ччч" в %D1%D1%D1%20%DE%DE%DE kkkggg PHP 2 12.09.2007 13:33