Конференция "WinAPI" » Как исправить компонент TCoolTrayIcon для выведения юникодов? [D7, WinXP]
 
  • Dr.Andrew (19.08.08 19:19) [0]
    Доброго дня!
    Есть прекрасный компонент TCoolTrayIcon.
    Исходник можно видеть здесь:
    http://files.codes-sources.com/fichier.aspx?id=47399&f=CoolTrayIcon%2fCoolTrayIcon.pas

    И есть в нем функция нужная мне - function TCoolTrayIcon.ShowBalloonHintUnicode, но беда в том что она не выводит правильно юникодные символы.

    Я попробывал несколько изменить код функции TCoolTrayIcon.ShowBalloonHintUnicode так:

    function TCoolTrayIcon.ShowBalloonHintUnicode(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 := WideCharToString(PWideChar(Text));
    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 := WideCharToString(PWideChar(Title));
    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;



    или так:

    function TCoolTrayIcon.ShowBalloonHintUnicode(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;



    Мои попытки просто изменить Char на WideChar и прочее в том же духе также не привели к успеху.

    Уважаемые Мастера, прошу Вашей помощи - что в этом модуле нужно изменить, чтобы правильно выводить WideChar (юникодные) символы.

    Спасибо.
  • Dr.Andrew (20.08.08 12:52) [1]
    Добрый день!

    Мастера, подскажите что необходимо исправить, чтобы корректно выводить в этом компоненте юникодные символы?

    Спасибо.
  • brother © (20.08.08 14:16) [2]
    преобразуй юникод в win1251 и отображай где хош...
  • Dr.Andrew (20.08.08 15:02) [3]
    Спасибо, а можно хотя бы небольшой пример?
  • brother © (20.08.08 15:09) [4]
    копипастер?
  • Dr.Andrew (20.08.08 15:15) [5]
    Навыерное, я не понял Вас правильно, а Вы меня. Мне нужно скорректировать конкретный модуль, приведенный выше. У Вас есть идеи по этому поводу. Может я что не так прописал или упустил. Спасибо.
  • brother © (20.08.08 15:18) [6]
    ты этот код понимаешь? или из инета взял? то что передаешь через Title, Text: WideString; преобразуй из Unicode в Win1251 кодировку и не парься...
  • Dr.Andrew (20.08.08 15:38) [7]
    Я понимаю, но не понимаю как можно преобразовать юникодный символ, например, ñ в русскую букву. Будьте так любезны и напишите как Вы себе это представляете. Спасибо.
  • brother © (20.08.08 15:42) [8]
    > но не понимаю как можно преобразовать юникодный символ,
    > например, n в русскую букву. Будьте так любезны и напишите
    > как Вы себе это представляете.

    спроси у гугла а?
  • Dr.Andrew (20.08.08 16:12) [9]
    Спасибо, Может Мастера все же подскажут возможность корректировки приведенного кода. Спасибо.
  • Dr.Andrew (21.08.08 10:34) [10]
    Доброе утро!
    Мастера. помогите найти решение!
    Спасибо.
  • DrPass © (21.08.08 10:59) [11]
    Насколько я знаю, Shell_NotifyIcon, вокруг которой вертится эта компонента, юникод не поддерживает
  • Dr.Andrew (21.08.08 12:51) [12]
    Тогда какое решение, может ее можно чем-то заменить? Я полагаю, что такое решение было бы интересно очень многим пользователям этого форума.
  • Anatoly Podgoretsky © (21.08.08 15:06) [13]
    Неdthyj


    > TNotifyIconDataA = _NOTIFYICONDATAA;
    > TNotifyIconDataW = _NOTIFYICONDATAW;
  • Dr.Andrew (21.08.08 15:21) [14]
    Спасибо за ответ, а можно немного по-подробне, пожалуйста. Как это может быть реально в коде компонента? Спасибо
  • Anatoly Podgoretsky © (21.08.08 16:49) [15]
    Вместо TNotifyIconData использовать явно TNotifyIconDataW
  • Anatoly Podgoretsky © (21.08.08 16:51) [16]
    Код конечно к черту переписать, код принципиально не сможет работать с Юникод.
  • Anatoly Podgoretsky © (21.08.08 17:05) [17]
    Кстати я обратил внимание, что Дельфи 7, а у нее редактор не Юникодовый!
  • Eraser © (09.09.08 00:39) [18]
    все стереть к черту, проект перевести на D2009 - там есть и юникод и компонент для запуздыривания иконки не хуже TCoolTrayIcon :-)
  • Германн © (09.09.08 01:14) [19]

    > Eraser ©   (09.09.08 00:39) [18]

    Некромант?
    (с) sniknik
  • GrayFace © (13.09.08 21:46) [20]
    Eraser, вот тебе экспонат для опытов: http://pda.delphimaster.net/?id=1174336615&n=12
  • Плохиш © (15.09.08 12:46) [21]

    > s: String;

    И хде тута юникода?

    Остальные "многа букав" читать не стал, боюсь глазки поломать...
 
Конференция "WinAPI" » Как исправить компонент TCoolTrayIcon для выведения юникодов? [D7, WinXP]
Есть новые Нет новых   [134435   +33][b:0][p:0.002]