На главную... Продукты | Технологии | Классификаторы | Проекты | Скачать | Цены| Форум | Статьи | Обучение | Контакты

Кодировка семантики в DelphiXE

Поиск  Пользователи  Правила  Войти
Форум » Настольные приложения » GIS ToolKit, GIS ToolKit Active, ГИС Конструктор для Windows
Страницы: 1
RSS
Кодировка семантики в DelphiXE, Не передается кодировка семантики в DelphiXE5
 
Объявляем переменные
Var
kpt_Cadastr : string;
Adress          : string;

Добавляем семантику
mapAppendSemantic(hObj,9,GTKPChar(kpt_Cadastr),25);
mapAppendSemantic(hObj,1002,GTKPChar(Adress),150);

Если ренее, в Delphi7 все это работало хорошо, то теперь в DelphiXE5
вместо 67:02:3190201:1, теперь пишет везде просто 6
вместо нормального длинного адреса г.Вязьма, ул.Новая, д.5, теперь пишет @-

Программа компилируется нормально.
Похоже не предусмотрели, что-то с кодировкой,
не пойму, что не так?
Изменено: Сергей Викторович - 05.10.2018 11:50:55
 
Сам отвечаю на свой вопрос, вот как надо.

mapAppendSemanticUn(hObj,9,PChar(kpt_Cadastr),25);
mapAppendSemanticUn(hObj,1002,PChar(Adress),150);
 
Цитата
Сергей Викторович написал:
Объявляем переменные
Var
kpt_Cadastr : string;
Adress          : string;

Добавляем семантику
mapAppendSemantic(hObj,9,GTKPChar(kpt_Cadastr),25);
mapAppendSemantic(hObj,1002,GTKPChar(Adress),150);

mapAppendSemantic - функция, принимающая на вход строки в однобайтовой кодировке ANSI.
Начиная с Delphi XE3 тип string - это юникод строки (для русского языка два байта в Windows).
Инструкция GTKPChar заставляет взять указатель на начало ANSI-строки, а передается юникод.

Выход:
1. либо использовать mapAppendSemanticUn, как Вы и сделали, и это наиболее верное решение (но, надо понимать, что если Вы в таком виде оставите код и попробуете потом вернуться в компилятор ниже, чем XE3, у Вас будет AccessViolation)
2. либо использовать mapAppendSemantic, но предварительно перевести строки в ANSI.
3. либо работать через компоненты GTK.

в maputil.pas есть функции:

Код
// преобразовать строку в WideString в зависимости от версии Delphi
function GTKWideString(aValue : string): WideString;

// преобразовать строку в AnsiString в зависимости от версии Delphi
function GTKAnsiString(aValue : string): AnsiString;
 
Цитата
Денис Вицко написал:
Цитата
Сергей Викторович написал:
Объявляем переменные
Var
kpt_Cadastr :  string ;
Adress          :  string ;

Добавляем семантику
mapAppendSemantic (hObj,9, GTKPChar ( kpt_Cadastr ),25);
mapAppendSemantic (hObj,1002, GTKPChar ( Adress ),150);
mapAppendSemantic - функция, принимающая на вход строки в однобайтовой кодировке ANSI.
Начиная с Delphi XE3 тип string - это юникод строки (для русского языка два байта в Windows).
Инструкция GTKPChar заставляет взять указатель на начало ANSI-строки, а передается юникод.

Выход:
1. либо использовать mapAppendSemanticUn, как Вы и сделали, и при работе через MAPAPI это наиболее верное решение (но, надо понимать, что если Вы в таком виде оставите код и попробуете потом вернуться в компилятор ниже, чем XE3, у Вас будет AccessViolation)
2. либо использовать mapAppendSemantic, но предварительно перевести строки в ANSI.
3. либо работать через компоненты GTK.

в maputil.pas есть функции:

Код
 // преобразовать строку в WideString в зависимости от версии Delphi
function GTKWideString(aValue : string): WideString;

// преобразовать строку в AnsiString в зависимости от версии Delphi
function GTKAnsiString(aValue : string): AnsiString; 
Страницы: 1
Читают тему (гостей: 1)



© КБ Панорама, 1991-2024

Регистрируясь или авторизуясь на форуме, Вы соглашаетесь с Политикой конфиденциальности