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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странности с символами в Memo и XP Manifest 
:(
    Опции темы
bazzzman
  Дата 7.9.2006, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот в чем проблема:

1. Windows XP SP2 (обязательно надо включить визуальные стили) + Delphi 7 создаем новый пустой проект.

2. Кидаем на форму TMemo.

3. Кидаем TButton с обработчиком:
Код

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
 Caption := '';

 // проходимся по содержимому Memo1 и выводим в заголовке окна
 // порядковый номер символа

 for i := 1 to Length(Memo1.Text) do
  Caption := Caption + IntToStr( Ord(Memo1.Text[i]) ) + '  ';
end;

4. Запускаем проект. В Memo1 вводим 3 спец символа: Alt+0177, Alt+0178, Alt+0179
(Например, при включенном NumLock'е и зажатом Alt'е нажимаем на цифровой клавиатуре последовательно 0 1 7 7. Ну про это я думаю все знают  smile )

5. Нажимаем на кнопку.

В итоге видим вот такой результат:
user posted image

Все отлично - классно работает.



А терепь в Delphi на форму кидаем компонент XPManifest (вкладка Win32). Т.е. просто добавили manifest.

Запускаем, получаем:
user posted image


И ord у служебных символов не тот и показываются они криво. Как с этим бороться?


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 424
Регистрация: 18.5.2006
Где: Коломна

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



Возможно в ХР-шной теме используется другой шрифт для вывода в Memo.
Попробуй поэкспериментировать с Memo.Font
PM MAIL   Вверх
bazzzman
Дата 7.9.2006, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Шрифт тот же.

Побовал - шрифт никак не влияет на ord символа.
PM MAIL WWW   Вверх
Alexeis
Дата 7.9.2006, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



bazzzman, возможно меняется CHARSET у шрифта.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
dvamaster
Дата 7.9.2006, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Скорее у тебя с Виндой Криво что-то

У меня все норма

Цитата(bazzzman @  7.9.2006,  12:10 Найти цитируемый пост)
Запускаем проект. В Memo1 вводим 3 спец символа: Alt+0177, Alt+0178, Alt+0179


попробуй программно ввести

Код

s := Char(177);
s := s + Char(178);
s := s + Char(179);
Memo.Lines.Add(s);



--------------------
Хорошую информацию трудно добыть. Сделать с ней что-нибудь - еще труднее. /L. Skywalker/

Что же я сделал не так? /Король Лир/

Я делаю это для твоего же блага! /Любой родитель и палач/

PKUNZIP.ZIP /неизвестный/
PM MAIL WWW ICQ   Вверх
RideX
Дата 7.9.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

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



Цитата(dvamaster @  7.9.2006,  14:53 Найти цитируемый пост)
Скорее у тебя с Виндой Криво что-то
 Попробовал - тоже самое, без манифеста всё ОК.


bazzzman, это не только с TMemo. На WinAPI, диалог с обычным "EDIT" контролом - тоже самое, с манифестом те же самые проблемы. Причем не только Delphi, любой компилятор.
PM   Вверх
Yanis
Дата 7.9.2006, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2937
Регистрация: 9.2.2004
Где: Москва

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



А у меня с манифестом всё нормально работает в Memo. 
Комбинации 
Цитата(bazzzman @  7.9.2006,  10:10 Найти цитируемый пост)
Alt+0177, Alt+0178, Alt+0179
 по крайней мере работают.



--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
bazzzman
Дата 8.9.2006, 02:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(dvamaster @ 7.9.2006,  11:53)

попробуй программно ввести

Код

s := Char(177);
s := s + Char(178);
s := s + Char(179);
Memo.Lines.Add(s);

Так это должен делать пользователь через Alt+0178, не программно smile

Цитата
Скорее у тебя с Виндой Криво что-то

Пробовал на другой машине - тот же результат.

Yanis, у тебя визульные стили включены?

Добавлено @ 02:45 
Цитата(alexeis1 @ 7.9.2006,  11:42)
bazzzman, возможно меняется CHARSET у шрифта.

Charset меняет отображение символа, но Ord всегда = 63. При любом charset'е и разных символах (и для Alt+0178 и для Alt+0179 - ord = 63).

Может есть какая-то другая возможность получить код символа?
PM MAIL WWW   Вверх
Elfebet
Дата 8.9.2006, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



bazzzman, Кстати 63 символ - это символ знака вопроса. Вывод - у тя что-то с кодировкой.
зы. у меня тоже с манифестом всё нормально работает в Memo. 


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Snowy
Дата 8.9.2006, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Угу. Настроить хоткеи и панель кнопочек, вводящих по клику мыши.
А чего. Удобно - нажал Ctrl + "-" и тебе тире вылезло.
PM MAIL   Вверх
bazzzman
Дата 8.9.2006, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

bazzzman, Кстати 63 символ - это символ знака вопроса. Вывод - у тя что-то с кодировкой.
зы. у меня тоже с манифестом всё нормально работает в Memo. 

Нет Elfebet, дело не только в моей машине. Я уже .exe протестил на многих машинах и можно говорить про то что баг проявляется не в 100% случаев, но довольно часто. Где-то 50%.


Кажется проблема в том, что не удается получить unicode символы из TMemo.  smile 

Т.е. вызов типа Memo1.Text[1] всегда возвращает неверное значение и уже дальнейшее преобразование в WideChar бессмысленно (как мертвому припарки).


Тогда вот такой вопрос: есть TMemo с юникодом внутри, как получить именно unicode текст???
PM MAIL WWW   Вверх
Elfebet
Дата 8.9.2006, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



Цитата

Я уже .exe протестил на многих машинах и можно говорить про то что баг проявляется не в 100% случаев, но довольно часто. Где-то 50%.

так тут дело не в exe, а в самом твоем делфи (може он не такой как у всех  smile ), а exe ты скомпилировал и можеш на тысячи компьютеров юзать и все равоно будет такая лабуда.
p.s могу ошибаться.


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
bazzzman
Дата 8.9.2006, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, ты ошибаешься.
PM MAIL WWW   Вверх
Alexeis
Дата 8.9.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



bazzzman, ксати если мы ввели символ с некоторым кодом в memo, то не обязательно, что запишется именно этот символ. Если не установлен нужный чарсет, то винда заменяет расширеные символы, на наиболее близкие по виду символы, всякие там a u s t, с шляпочками, черточками и точками будут заменены, на a u s t без таковых, а символы не имеющие аналогов, по идее она должна заменить на квадратики имеющие код квадратиков, а не исходных символов.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
RideX
Дата 8.9.2006, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

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



У кого с манифестом работало, интересно, будет ли это работать. См. аттач ~2 Кб
P.S. Без манифеста работает нормально, если файл *.manifest убрать из папки с .ехе

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  TestManXP.zip 1,78 Kb
PM   Вверх
Elfebet
Дата 8.9.2006, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



RideX, работает как миленький. smile 


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
RideX
Дата 8.9.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

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



Мда.. а у меня не работает  smile 

Elfebet,  в смысле ты вручную ввел (Alt+0177, Alt+0178, Alt+0179), и получились те же три символа что там выведены программно?

Это сообщение отредактировал(а) RideX - 8.9.2006, 11:50
PM   Вверх
Elfebet
Дата 8.9.2006, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



Цитата

Elfebet,  в смысле ты вручную ввел (Alt+0177, Alt+0178, Alt+0179), и получились те же три символа что там выведены программно?

Да.


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
RideX
Дата 8.9.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

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



Интересно, одна и та же скомпилированная программа работает по разному на разных компьютерах. Значит, получается, что дело только в каких-то настройках Windows  smile 
PM   Вверх
Elfebet
Дата 8.9.2006, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 545
Регистрация: 15.5.2006
Где: Украина. Запорожь е.

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



еще есть момент поменял Юникод в Язык и региональные стандарты->Дополнительно с русского на английский и это все у меня перестало работать smile 


--------------------
Программист не должен всё знать... он должен знать где можно посмотреть
PM MAIL ICQ GTalk   Вверх
Snowy
Дата 8.9.2006, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



А это пробовали: http://forum.vingrad.ru/index.php?showtopic=82093

Добавлено @ 13:27 
Если чарсет выставлен на русский - работает везде.
PM MAIL   Вверх
RideX
Дата 8.9.2006, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

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



Elfebet, у меня здесь тоже русский стоял, с английским вообще всё криво работает smile

Snowy, в данном случае это и + LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT не помогает smile Ещё наблюдается проблема с DOS кодировкой при использовании манифеста. По видимому это всё из-за несовместимости XP-шной comctl32.dll со "старыми" контролами. Файл в DOS кодировке без манифеста читается нормально, с манифестом - нет. Конечно это справедливо только для TrueType шрифтов, для растрового Terminal - без разницы. Потому текст нужно выводить либо в ANSI, либо в Unicode, OEM умер.

P.S. В аттаче есть пример, если кому интересно, простой текстовый файл cp866.txt, нормально отображается без манифеста, с манифестом - нечитаем.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  TestManXP_02.zip 2,11 Kb
PM   Вверх
Snowy
Дата 9.9.2006, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

Memo1.Font.Charset := RUSSIAN_CHARSET
Проверил на 4-х машинах. На одной локаль ангельская. Работает без проблем.
PM MAIL   Вверх
RideX
Дата 9.9.2006, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Awaiting Authorisation
Сообщений: 94
Регистрация: 8.9.2004

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



Snowy, если не трудно, приаттач свой сходник, прямо на нём проверю.
PM   Вверх
bazzzman
Дата 11.9.2006, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Странно... Проверил на 4х машинах - на 3х не работает, а 1 одной работает.

Все 4 машины - Windows XP SP2 English.

Snowy ты точно все на Delphi 7 делаешь?

Добавлено @ 03:58 
Посоветовали:
http://www.tntware.com/delphicontrols/unicode/downloads.htm

Сами компоненты не ставил.  Смотрел исходники, все сводится к одному (если я правильно понял  smile ) вместо GetWindowTextA используется GetWindowTextW.

Пробовал вот так:
Код

function TntControl_GetText(Control: TControl): WideString;
begin
 SetLength(Result, GetWindowTextLengthW(TWinControl(Control).Handle) + 1);
 GetWindowTextW(TWinControl(Control).Handle, PWideChar(Result), Length(Result));
 SetLength(Result, Length(Result) - 1);
end;

procedure TForm1.Button2Click(Sender: TObject);
var c: PWideChar; w: WideString;
begin
 w := TntControl_GetText(Memo1);

 getmem(c, SizeOf(widechar)*1);
 StringToWideChar(r.Text[1], c, SizeOf(widechar)*1 + 1);
 
 Caption := Caption + IntToStr( Ord(c[0]) ) + '  ';
end;


Разницы никакой.

+ Отличие между Memo и RichEdit только в том что RichEdit нормально показывает символы, но RichEdit.Text возвращает ту же изуродованную строку.

Добавлено @ 03:59 
Попробую TTntMemo - отпишу про результат.
PM MAIL WWW   Вверх
Snowy
Дата 11.9.2006, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



try it

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  mmo1.zip 7,64 Kb
PM MAIL   Вверх
bazzzman
Дата 11.9.2006, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



С одной стороны пример работает. Но он не делает то, что мне надо:

Цитата

В Memo1 вводим 3 спец символа: Alt+0177, Alt+0178, Alt+0179


Проверь: удали весь текст в своем Memo и добавь спец символ с клавиатуры (через alt), а не в коде.
Так у меня ничего не работает  smile

Добавлено @ 11:22 
Анализ компонентов TTntMemo (они нормально работают) показал: проблему можно решить, путем ручного создания окна через CreateWindowExW, и далее используем GetWindowTextW, SetWindowTextW, GetWindowTextLengthW, ect.

Дело за малым: повторить все это в меленьком юните и оформить как компонент, не хочу таскать со своим приложением большой TTntMemo. И так уже много чего использую от сторонних разработчиков.

Единственный подводный камень - это работа на Windows 9x. Но моему приложению это не страшно, минимальные требования - Windows 2000  smile 

Спасибо всем за активную помощь при разборе этих грабель. vingard рулит!  smile 

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


Эксперт
****


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

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



У меня ещё одна мысль появилась на данную тему.
В манифесте по дефолну прописан язык "нейтральный".
Может в этом дело... Могет его на русский заменить?
PM MAIL   Вверх
IvanoffAndrey
Дата 11.9.2006, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



у меня то же не работает. на русский заменяю все пашет.
--------------------
Размерность пространства есть число Pi и в каждой точке вселенной оно стремиться к этому числу.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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