Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Дельфи Хе функция и Chr 
:(
    Опции темы
PsiMagistr
Дата 1.9.2011, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Ребята, я пытаюсь записать:

Код

procedure TForm1.Button2Click(Sender: TObject);
begin
ShowMessage(IntToStr(Ord('я'))); // Результат: код 255
T2.Text:=(Chr(255)); // Непонятная закорючка вместо ожидаемой буквы "я".
end;




Шрифты кириллические




--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Snowy
Дата 1.9.2011, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 31
Всего: 484



Потому что в XE функция Chr создает WideChar, а не AnsiChar
А в юникоде и в анси код у букв разный.
PM MAIL   Вверх
PsiMagistr
Дата 2.9.2011, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Snowy,  аха-м... И как можно выйти из положения?

Добавлено через 2 минуты и 40 секунд
Snowy,  ох, туплю. AnsiChar же


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
PsiMagistr
Дата 2.9.2011, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Мда... Не все еще свершились чудеса. Взгляните:


Код

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(Ord('Д'))); // Возвращает код буквы Д (196)
T2.Text:= IntToStr(Ord(T1.Text[1])); // Несмотря на то, что первая буква в Т1.Text  та же 'Д' возвращает почему-то 1044.
end;





Это сообщение отредактировал(а) PsiMagistr - 2.9.2011, 09:51


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
AndreyIQ
Дата 2.9.2011, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 1
Всего: 8



Цитата(PsiMagistr @ 2.9.2011,  09:50)
Мда... Не все еще свершились чудеса. Взгляните:


Код

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(IntToStr(Ord('Д'))); // Возвращает код буквы Д (196)
T2.Text:= IntToStr(Ord(T1.Text[1])); // Несмотря на то, что первая буква в Т1.Text  та же 'Д' возвращает почему-то 1044.
end;

Код

ShowMessage(IntToStr(Ord(WideChar('Д')))); // Возвращает код буквы Д (1044)

 smile 
PM MAIL   Вверх
PsiMagistr
Дата 2.9.2011, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



AndreyIQ,  Хм... Мне нужна полная обратимость функций Ord и AnsiChar, но оно то как раз и не выходит

Добавлено через 10 минут и 6 секунд
Код

T2.Text:=IntToStr(Ord(AnsiChar(T1.Text[1]))); //Вообще 20 получается.



--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Keeper89
Дата 2.9.2011, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Код

T2.Text:=IntToStr(Ord(AnsiString(T1.Text)[1]));



--------------------
PM MAIL WWW   Вверх
AndreyIQ
Дата 2.9.2011, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 1
Всего: 8



Цитата(Keeper89 @ 2.9.2011,  11:22)
Добавлено @ 10:26
Код

T2.Text:=IntToStr(Ord(AnsiChar(T1.Text[1]))); //20

Код

T2.Text:=IntToStr(Ord(AnsiString(T1.Text)[1])); //196


Можете объяснить почему разный результат или дайте ссылку где почитать можно.
PM MAIL   Вверх
PsiMagistr
Дата 2.9.2011, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Keeper89,  Да, мне тоже интересно.


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Keeper89
Дата 2.9.2011, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



Перед тем как обрабатывать конкретный символ надо преобразовать строку в соотв. типу, чтобы избежать самостоятельных преобразований. А в варианте
Код

AnsiChar(T1.Text[1])

идет преобразование WideChar к AnsiChar, которое чтобы получилось надо сделать как-то так:
Код

function CharToAnsiChar(Ch: Char): AnsiChar;
begin
  WideCharToMultiByte(DefaultSystemCodePage, 0, @Ch, 1, @Result, 1, nil, nil);
end;

...
  ShowMessage(IntToStr(Ord(CharToAnsiChar(Edit1.Text[1]))));
...

и тоже будет верный ответ.

Это сообщение отредактировал(а) Keeper89 - 2.9.2011, 12:53


--------------------
PM MAIL WWW   Вверх
PsiMagistr
Дата 2.9.2011, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Keeper89,  Не совсем понял, но все равно спасибо.


--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
Keeper89
Дата 2.9.2011, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 9
Всего: 58



PsiMagistr, что именно?


--------------------
PM MAIL WWW   Вверх
PsiMagistr
Дата 2.9.2011, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 479
Регистрация: 31.12.2009

Репутация: 1
Всего: 1



Keeper89,  просто незнаком  с этой функцией.


 WideCharToMultiByte(DefaultSystemCodePage, 0, @Ch, 1, @Result, 1, nil, nil);







--------------------
"Арфы нет? Возьмите бубен!

Ребята, будем жить!"

 (с) "В бой идут одни старики"

---

"ИЕ" - один из самых сумасшедших браузеров в нашей галактике.
PM MAIL   Вверх
AndreyIQ
Дата 2.9.2011, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 5.2.2007

Репутация: 1
Всего: 8



Цитата(Keeper89 @ 2.9.2011,  12:51)
Перед тем как обрабатывать конкретный символ надо преобразовать строку в соотв. типу, чтобы избежать самостоятельных преобразований. А в варианте
Код

AnsiChar(T1.Text[1])

идет преобразование WideChar к AnsiChar, которое чтобы получилось надо сделать как-то так:
Код

function CharToAnsiChar(Ch: Char): AnsiChar;
begin
  WideCharToMultiByte(DefaultSystemCodePage, 0, @Ch, 1, @Result, 1, nil, nil);
end;

...
  ShowMessage(IntToStr(Ord(CharToAnsiChar(Edit1.Text[1]))));
...

и тоже будет верный ответ.

Всегда думал что Wide в Ansi и обратно должен без проблем преобразоваться.
А оказалось, что строки без явного приведения преобразовываются, а символы почему-то нет.
Код

var
  WStr: WideString;
  AStr: AnsiString;
  WChar: WideChar;
  AChar: AnsiChar;
begin
  WStr:= 'Д';
  AStr:= WStr; // AStr = 'Д'
  AStr:= 'Д';
  WStr:= AStr; // WStr = 'Д'
  WChar:= 'Д';
  AChar:= AnsiChar(WChar); // AChar = ''
  AChar:= 'Д';
  WChar:= WideChar(AChar); // WChar = 'Ä'

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1333 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.