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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.08.2008, 16:25   #1
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
Восклицание Как исправить компонент TCoolTrayIcon для корректного выведения юникодных символов?

Доброго дня!
Хочу показывать всплывающую подсказку типа баллона. Есть такой прекрасный компонент TCoolTrayIcon как (исходник можно видеть здесь - http://files.codes-sources.com/fichi...olTrayIcon.pas) и есть там функция нужная мне - function TCoolTrayIcon.ShowBalloonHintUnicod e, но беда в том что она не выводит правильно символы юникодные. Мои попытки просто изменить Char на WideChar и прочее в том же духе не привели к успеху. Кто-то может подсказать мне, что в этом модуле нужно изменить, чтобы правльно вывводить WideChar символы, Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 18.08.2008, 16:36   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Гм. Это вроде уже нарушение идет. Только что на ваш вопрос отвечал
BOBAH13 вне форума Ответить с цитированием
Старый 18.08.2008, 16:44   #3
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Извинте, какой вопрос? Об этом компоненте я в первый раз спрашиваю. и только зашел в эту рубрику.
SkAndrew вне форума Ответить с цитированием
Старый 18.08.2008, 16:57   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Это вроде уже нарушение идет
Ну кросспостом тут только отдаленно попахивает... Тем паче тема предидущая закрыта.
Думаю что ничего такого страшного
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 18.08.2008, 17:20   #5
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо, надеюсь, что возможно мне здесь кто-нибудь поможет. Еще раз спасибо за помощь.
SkAndrew вне форума Ответить с цитированием
Старый 18.08.2008, 19:07   #6
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Просто смешно. Ну лично когда я постил та тема была не закрыта и решение я предложил, т.к. такой код перевода с уникода в анси это просто "бред" сумашедшего!

Код:
FillChar(szInfo, 0, SizeOf(szInfo));
    for I := 0 to SizeOf(szInfo)-1 do
      szInfo[I] := Char(Text[I]);
    szInfo[0] := #1;
Думаю все поняли что я имею ввиду так что еще раз посмотрите в сторону System.pas ->>> StringToWideChar и WideCharToString вроде так функции называются.
BOBAH13 вне форума Ответить с цитированием
Старый 18.08.2008, 21:12   #7
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Вы имеете ввиду, что приведенный кусок кода нужно заменить на:
szInfo := WideCharToString(Text); ? Но, не проиворечит ли это объявленным полям и например - szInfo? Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 18.08.2008, 22:38   #8
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Там все поля, что текст, что инфа, что заголовок являются массивами чаров ( Char ) он же байт. Уникод занимает 2 байта... т.е. надо грубо говоря делать немного не так... ну без проверки могу сказать сразу что думаю такой способ сработает:

Код:
var
  l: Integer;
  s: String;
begin
FillChar(szInfo, #0, SizeOf(szInfo)); // чтобы был 0 в конце
// следовательно max длинна строки = SizeOf(szInfo) - 1
// тут тип того
l := SizeOf(szInfo) - 1;
s := WideCharToString(Text);
if (l > Length(s)) then l := Length(s);
Move({source}PCHAR(s)^, {dest}szInfo, l);
ну вроде так... на быструю руку прямо тут написал, дальше уж сами думаю сможете разобраться.
BOBAH13 вне форума Ответить с цитированием
Старый 18.08.2008, 22:49   #9
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
По умолчанию

Спасибо. Но, без ошибок код выглядит так:

FillChar(szInfo, 0, SizeOf(szInfo)); // чтобы был 0 в конце
// следовательно max длинна строки = SizeOf(szInfo) - 1
i := SizeOf(szInfo) - 1;
s := WideCharToString(PWideChar(Text));
if (i > Length(s)) then i := Length(s);
Move({source}PCHAR(s)^, {dest}szInfo, i);

Только юникодные символы все равно неправильно отображаются.
Что не так?
Спасибо.
SkAndrew вне форума Ответить с цитированием
Старый 18.08.2008, 23:14   #10
SkAndrew
Форумчанин
 
Регистрация: 05.04.2008
Сообщений: 244
Восклицание

Пробовал уже разными способами, но результата нет.
Вот код, который не вызывает ошибки, но и результата никакого:

function TCoolTrayIcon.ShowBalloonHintUnicod e(Title, Text: WideString;
IconType: TBalloonHintIcon; TimeoutSecs: TBalloonHintTimeOut): Boolean;
// Show balloon hint. Return false if error.
const
aBalloonIconTypes: array[TBalloonHintIcon] of Byte =
(NIIF_NONE, NIIF_INFO, NIIF_WARNING, NIIF_ERROR, NIIF_USER);
var
i: Integer;
s: String;
begin
// Remove old balloon hint
HideBalloonHint;
// Display new balloon hint
with IconData do
begin
uFlags := uFlags or NIF_INFO;

FillChar(szInfo, 0, SizeOf(szInfo)); // чтобы был 0 в конце
// следовательно max длинна строки = SizeOf(szInfo) - 1
i := SizeOf(szInfo) - 1;
s := WideStringToStringEx(Text, 1252);
if (i > Length(s)) then i := Length(s);
Move({source}PCHAR(s)^, {dest}szInfo, i);

FillChar(szInfoTitle, 0, SizeOf(szInfoTitle)); // чтобы был 0 в конце
// следовательно max длинна строки = SizeOf(szInfo) - 1
i := SizeOf(szInfoTitle) - 1;
s := WideStringToStringEx(Title, 1252);
if (i > Length(s)) then i := Length(s);
Move({source}PCHAR(s)^, {dest}szInfoTitle, i);

TimeoutOrVersion.uTimeout := TimeoutSecs * 1000;
dwInfoFlags := aBalloonIconTypes[IconType];
end;
Result := ModifyIcon;
// Remove NIF_INFO before next call to ModifyIcon (or the balloon hint will redisplay itself)
IconData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
end;

Что можно еще переделать в исходном коде (http://files.codes-sources.com/fichi...lTrayIcon.pas), чтобы он выводил юникодные символы?
Спасибо.
SkAndrew вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
исправить компонент под делфи 2007 Roof Компоненты Delphi 1 31.08.2008 09:09
Как запретить/разрешить ввод от клавиатуры любых символов (в том числе и юникодных)? SkAndrew Общие вопросы Delphi 8 15.08.2008 15:30
Как исправить??? BlackMamba Microsoft Office Word 1 03.08.2008 12:23
Исправить ошибку LLIypLLIyH Помощь студентам 5 16.06.2008 16:50
Суммирование значений и выведения максимального значения Bor_man Microsoft Office Excel 2 12.04.2007 19:49