Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5

Модерирует : ShIvADeSt

ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Продолжение темы Вопросы по Delphi (до версии 2009) - часть 4

Познаем сами, помогаем другим...
Обсуждаем вопросы, не связанные с юникоидными версиями Delphi - для этого есть соответствующая тема (см. ссылки ниже).

Правила топика:
    Прежде чем спрашивать:
  1. Желательно изучить вопрос, попытаться найти ответ в прилагаемых мануалах, хелпах и анализируя исходники.
  2. Выполнить поиск по топику (открыть "Версия для печати" и поискать ответ там).
  3. Применить фильтр по разделу "Прикладное программирование". Ответы на многие старые вопросы могли быть даны в отдельных темах.
  4. Продумайте вопрос. На поверхностные вопросы вы получите поверхностные ответы, или вообще ответов не получите.
  5. Желательно указывать версии используемого компилятора и операционной системы.
    Прежде чем отвечать:
  1. Если не можете помочь, не мешайте.
  2. Если уж вы отвечаете на вопрос, давайте ответ по сути.
  3. Если вы не уверены, так и говорите! Ошибочный, но авторитетно звучащий ответ хуже, чем отсутствие ответа.
  4. Задавайте дополнительные вопросы, чтобы получить больше информации.
  • Отсутствие ответа не равносильно игнорированию - иногда участники форума просто не знают ответ. Повторная посылка вопроса не приветствуется. Посты типа "неужели никто не знает ответа..." или "может мне все-таки кто-нибудь ответит" недопустимы.  
  • Все большие куски кода (более 5 строк) оформляем в тег [morе] дабы уменьшить размер поста. FAQ по тегу [morе].

  • Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 02:09 28-06-2009 | Исправлено: psa1974, 12:00 02-02-2010
    psa1974



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    проверил твой код. Все отлично работает - вылазит мессага 'D:\Temp\'.

    ----------
    У программёра есть два состояния: "Втупляю" и "Попёрло"...

    Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 13:11 18-05-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    AviDen
    Что-то с EM_GETTEXTEX не получается - видимо контрол не РичЭдит, а Мемо...  Проблема не в контроле - Мемо может и отображает Юникод (по-крайней мере те символы, которые мне нужны), но при обработке (даже простейшей) все теряется и обратно уже вставляется без Юникод-символов. Не знаю что делать... Перейти на 2009 не могу - есть компоненты под нее не работающие.


    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 19:38 18-05-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
     
    Посмотрите мой последний комментарий на предыдущей странице.

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 20:04 18-05-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Odysseos
    Я посмотрел. Но мне не нужен контрол - у меня и так показывает Юникод символы. Вопрос в обработке текста вне контрола и обратной его вставки. Уже в процесс обработки он становится не-юникод. То есть если в переменную WideString загрузить текст Memo, затем прибавить какой-нибудь символ, вставить обратно в Мемо - юникод теряется. Почему я не могу понять. Изначально-то показывается все нормально. Или я чего не догоняю  
     


    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 20:33 18-05-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
     
    Всю цепочку преобразований распишите. Ну, то есть - берем строку (какую - ansi или wide, и почему именно ansi или wide), засовываем ее туда-то (куда?), получаем ее оттуда-то (откуда?), как-то анализируем (как?), как-то изменяем (как?), засовываем еще куда-то (куда?) - etc.

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 21:15 18-05-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Man_Without_Face
    В GetDOSEnvVar должно быть SetLength(Result, i-1). О таких подвохах хорошо написано тут: http://transl-gunsmoker.blogspot.com/2009/09/pchars.html

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 22:13 18-05-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Odysseos
    Без разницы что делать со строкой. Я закомментил весь код и написал чистый, с нуля "пустой". Уже приводил выше. Но могу опять привести...
    var
      ws : WideString;
    ...
      ws := Memo1.Text;
      ws := ws + 'xxx';
      Memo1.Text  := ws;
     
    Вообщем, ладно с сетами не пашет WideString, ничего обойдем это, но как из мемо запихнуть текст в WideString и потом обратно вставить в Мемо без потери юникодности? Это вообще реализуемо?

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 23:13 18-05-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
     
    Свойство Memo1.Text - ansi. Поэтому wide-содержимое из TMemo получить через него принципиально невозможно. То есть - уже на этапе

    Код:
     
    ws := Memo1.Text;
     

    текст в ws попадает не unicode-ный. Во всем коде происходит такая конвертация:

    Код:
     
    ws := Memo1.Text; // ansi (Memo1.Text) -> unicode (ws)
    ws := ws + 'xxx'; // unicode (ws) + (ansi ('xxx' - строковая константа, которые в Delphi < 2009 - ansi) -> unicode)
    Memo1.Text  := ws; // uncode (ws) -> ansi (Memo1.Text)
     

    Зачем вообще здесь работать с unicode'ом? Почему ws - именно WideString, а не просто обычный простой AnsiString?
     
    ...Интересно - а как изначально в этот memo попадает unicode-текст? Если обычными способами его туда засунуть, в общем, нельзя?

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 23:22 18-05-2010 | Исправлено: Odysseos, 23:23 18-05-2010
    Bonivur



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Odysseos

    Цитата:
    Свойство Memo1.Text - ansi. Поэтому wide-содержимое из TMemo получить через него принципиально невозможно. То есть - уже на этапе

    Тогда как этот текст получить, сохранив юникодность?
     

    Цитата:
    Зачем вообще здесь работать с unicode'ом? Почему ws - именно WideString, а не просто обычный простой AnsiString?

    Теряется символы юникода (см. скриншот в моем посте выше). У меня сейчас все в простом string. Но надо чтобы юникод в этом Мемо поддерживался.
     

    Цитата:
    ...Интересно - а как изначально в этот memo попадает unicode-текст? Если обычными способами его туда засунуть, в общем, нельзя?

    Копирование из текстового файла.

    ----------
    Что будет стоить тысяча слов когда важна будет крепость руки? (В.Цой)

    Всего записей: 655 | Зарегистр. 22-06-2003 | Отправлено: 23:32 18-05-2010 | Исправлено: Bonivur, 23:32 18-05-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Bonivur
     
    Тогда как этот текст получить, сохранив юникодность?
     
    Из обычного TMemo - никак. Контрол должен поддерживать unicode - а для этого он (его handle, если говорить в терминах WinAPI) должен быть создан особым образом. Пример можно посмотреть в предложенных Tnt Unicode Controls - либо, чтоб не городить огород, просто воспользоваться оными компонентами (там есть готовый TTntMemo, поддерживающий unicode "нативно").

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 00:00 19-05-2010
    Frodo_Torbins

    Silver Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Odysseos
    На счет того, что 'xxx' будет ANSI не уверен. По крайней мере в D7 компилятор оказался достаточно умным, чтобы сохранить ее как юникод.
     
    Предложение хотя бы попробовать Tnt Unicode Controls поддерживаю, а то наше обсуждение становится все ближе и ближе к флуду.

    Всего записей: 2318 | Зарегистр. 24-05-2007 | Отправлено: 00:09 19-05-2010 | Исправлено: Frodo_Torbins, 00:11 19-05-2010
    Odysseos



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Frodo_Torbins
     
    Если прямо в тексте выражения - да, но если ее где-то объявить как константу (и не указать, что она : TWideString = 'xxx') - то будет ansi.
     
    Это, впрочем, в данном случае - нюанс совершенно непринципиальный.
     
    Добавлено:
    Bonivur
     
    Для работы с WideString в Delphi 2007 (как в предыдущих - не знаю, нет под рукой) есть модуль WideStrUtils.pas, и там есть такая функция:

    Код:
     
    ...
    interface
    ...
    { in operator support for WideChar }
    type
      CharSet = set of ansichar;
     
    function inOpSet( W : WideChar; sets : CharSet ) : boolean;
    ...
    implementation
    ...
    function inOpSet( W : WideChar; sets : CharSet ) : boolean;
    begin
      if W <= #$FF then
        Result := Char(W) in sets
      else
        Result := False;
    end;
    ...
     

    Работать она будет, разумеется, только для символов с unicode-кодами меньше-равными $00FF (то есть - грубо говоря - знаками, цифрами и латиницей).

    Всего записей: 186 | Зарегистр. 02-01-2006 | Отправлено: 01:06 19-05-2010 | Исправлено: Odysseos, 01:10 19-05-2010
    EugeneBoss3



    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Коллеги, не подскажете, как нарисовать в Delphi текст с градиентной заливкой? Смотрел компонент GradText (Harm: harmdog@ne.uswest.net), но реализация не устраивает - вывод текста с "черным контуром". Заранее благодарен.

    Всего записей: 247 | Зарегистр. 15-09-2009 | Отправлено: 03:28 19-05-2010
       

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (до версии 2009) - часть 5
    ShIvADeSt (19-05-2010 05:14): Продолжаем тут http://forum.ru-board.com/topic.cgi?forum=33&topic=11215


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru