Версия для печати темы

Нажмите сюда для просмотра этой темы в оригинальном формате

CTPAX-X _ Полезности _ Работа с юникодовой строкой в типизированном файле

Автор: Siberian GRemlin Jul 5 2006, 06:46

Сталкнулся с одной проблемкой. Есть типизированный файл, в котором помимо всего прочего хранятся строчки в юникоде. Как с такими работать я не знаю, пока сделал изврат полнейший:

CODE
      for j:=1 to Header.NameArr[i].StringLenght do begin
        Mstr.ReadBuffer(c,1);
        Mstr.ReadBuffer(x,1);
        if x=4 then begin
          if c=01 then begin
            c:=$A8;
            Header.StringsArr[i][j]:=chr(c);
          end else if c=$51 then begin
            c:=$B8;
            Header.StringsArr[i][j]:=chr(c);
          end else
          Header.StringsArr[i][j]:=chr(c+$B0);
        end else
          Header.StringsArr[i][j]:=chr(c);
      end;
      StringGrid1.Cols[1].Strings[i]:=Header.StringsArr[i];

Тут у меня обрабатываются только латиница и кириллица, а юникод понятно дело только им не ограничивается. Если с первого взгляда непонятно, то поясняю, два байта на один символ, если первый четвёрка, то это кириллица, иначе работаем как с латиницей. В кириллице там еще два случая, с 'Ё' и 'ё'.

Может, кто подскажет как правильно считать строку в string (естественно, который расширенный, не стандартный ANSII) за один присест. Насколько мне известно, это реально... просто я с этим не сталкивался и ламачёк unsure.gif rolleyes.gif

Автор: -=CHE@TER=- Jul 5 2006, 09:00

Siberian GRemlin!
Попробуй так: S:=Utf8ToAnsi(S);
Сразу должна всё перевести в Win1251. У меня на ANSI+UNICODE файлах от Opera 8.5 сработало.

Строчку:
C:\Documents and Settings\USERNAME\Рабочий стол

Перевела в:
C:\Documents and Settings\USERNAME\Рабочий стол


P.S. Если не поможет попробуй заюзать перед ней ещё UnicodeToUtf8()

Автор: Siberian GRemlin Jul 5 2006, 17:41

А правильно считать её как?

Автор: -=CHE@TER=- Jul 6 2006, 14:02

QUOTE(Siberian GRemlin @ Jul 5 2006, 05:41 PM) *
А правильно считать её как?

Смотря откуда... Я так понимаю, по твоему сообщению, что у тебя "типизированный файл" - это, хотелось бы узнать, файл какого типа?
А вообще - создаёшь переменную типа WideString и жахаешь туда весь UNICODE-буфер. И уже с ней работаешь.

Автор: Siberian GRemlin Jul 8 2006, 05:17

Я имел ввиду не стандартного типа, а в котором записи типа record. В файле несколько массивов с переменными, в некоторых хранятся юникодовые строки. Вообщем, ладно, сделал корявыю работу с этими файлами, без учёта таких символов как троеточие и прочих наворотов.

Еще у меня есть одна старая проблема - стили ХР. Компилю прогу я под классическом стилем винды, а запускают её под разными и получается, что высота заголовка окна(полоска) увеличивается и элементы интерфейса уезжают в небытие и я подозреваю, что если бы стоял больший шрифт в настройках винду для заголовка окна, кнопки бы просто пропали. Вот как это выглядит:
http://img55.imageshack.us/my.php?image=blue19wi.gif

А должно выглядеть так:
http://img92.imageshack.us/my.php?image=blue39sc.gif

Как сделать, чтобы интерфейс отображался как положено на любом стиле винды?! Многие же пишут проги на Delphi и у них таких проблем нету. И зачем нужен компонент XPManifest и как им пользоваться, может это и есть то что нужно?! unsure.gif

Автор: -=CHE@TER=- Jul 8 2006, 10:10

QUOTE(Siberian GRemlin @ Jul 8 2006, 05:17 AM) *

Я имел ввиду не стандартного типа, а в котором записи типа record. В файле несколько массивов с переменными, в некоторых хранятся юникодовые строки. Вообщем, ладно, сделал корявыю работу с этими файлами, без учёта таких символов как троеточие и прочих наворотов.

Еще у меня есть одна старая проблема - стили ХР. Компилю прогу я под классическом стилем винды, а запускают её под разными и получается, что высота заголовка окна(полоска) увеличивается и элементы интерфейса уезжают в небытие и я подозреваю, что если бы стоял больший шрифт в настройках винду для заголовка окна, кнопки бы просто пропали. Вот как это выглядит:
http://img55.imageshack.us/my.php?image=blue19wi.gif

А должно выглядеть так:
http://img92.imageshack.us/my.php?image=blue39sc.gif

Как сделать, чтобы интерфейс отображался как положено на любом стиле винды?! Многие же пишут проги на Delphi и у них таких проблем нету. И зачем нужен компонент XPManifest и как им пользоваться, может это и есть то что нужно?! unsure.gif


XPManifest необходим, чтобы у тебя окна отображались как на скриншоте 1, иначе они будут отображаться как на скриншоте 2 (вид а-ля "классик", без тем). Т.е. если манифест есть - и темы в XP включены, то будет отображаться с темами. Если тем нет, или манифеста в программе нет - то будет выглядеть как в Windows 9x/ME.

Если форма сильно разъезжается, то попробуй выставить Scaled = False, в свойствах формы (делается в инспекторе свойств слева).

Автор: Siberian GRemlin Jul 8 2006, 11:51

1. Прикол в том, что я никогда не пользуюсь манифестом, а стиль меняется.
2. Кидание манифеста на форму, рузельтата не дало - всё осталось как я и описывал
3. При Scaled = False, после компиляции на форме появляются лишнее пустое место снизу и справа

Автор: jTommy Jul 8 2006, 12:51

Siberian GRemlin:

QUOTE

1. Прикол в том, что я никогда не пользуюсь манифестом, а стиль меняется.

При отсутствии манифеста (внутри exe или в каталоге с прогой) меняется только заголовок и еще что-то, а при наличии манифеста изменяются все контролы: например, кнопки и GroupBox'ы станут с закругленными углами.

QUOTE

получается, что высота заголовка окна(полоска) увеличивается и элементы интерфейса уезжают в небытие

У меня тоже была такая проблема в дельфи. Причем при смене темы во время работы программы все нормально. Попробовал поискать в своих программах - не нашел.
Если я правильно помню, я в обработчике OnCreate формы запрашивал с помощью WinAPI функции высоту заголовка, вычислял разницу между полученным значением и высотой стандартного заголовка(при котором компилилась программа) и эту разницу (или чуть больше) прибавлял к высоте формы.

Автор: Siberian GRemlin Jul 8 2006, 14:26

QUOTE(jTommy @ Jul 8 2006, 08:51 PM) *

Если я правильно помню, я в обработчике OnCreate формы запрашивал с помощью WinAPI функции высоту заголовка, вычислял разницу между полученным значением и высотой стандартного заголовка(при котором компилилась программа) и эту разницу (или чуть больше) прибавлял к высоте формы.

Если бы ты вспомнил название этой функции, я был бы очень признателен smile.gif

Автор: Xplorer Jul 8 2006, 14:45

QUOTE(Siberian GRemlin @ Jul 8 2006, 06:26 PM) *

Если бы ты вспомнил название этой функции, я был бы очень признателен smile.gif

GetSystemMetrics(SM_CYCAPTION)

Есть более простой способ. Установи Scaled = false и при создании формы задай нужные значения свойств ClientWidth и ClientHeight.

Автор: Siberian GRemlin Jul 12 2006, 11:35

Всем спасибо, но либо лыжи не едут, либо я... когда выставляю Scaled = false, то после компиляции у формы получаются лишние отступы...

Кто-нибудь объясните как понять выражение: "pасположение подpавнять по какой-нибудь OwnerDraw-панели"

Автор: -=CHE@TER=- Jul 12 2006, 12:45

QUOTE(Siberian GRemlin @ Jul 12 2006, 11:35 AM) *
Всем спасибо, но либо лыжи не едут, либо я... когда выставляю Scaled = false, то после компиляции у формы получаются лишние отступы...
Когда ты ставишь Scaled = False форма у тебя становится фиксированного размера - т.е. на всех Windows с любыми стилями она будет одинакового размера. Т.к. ты говоришь, что у тебя она нормальная, но после выставления Scaled = False появляются левые поля - следовательно у тебя сейчас стоит какая-то "не стандартная тема" или у тебя оформление винды уехало и сбилось (я такое не один раз наблюдал, в результате чего и стал ставить везде Scaled = False).


QUOTE(Siberian GRemlin @ Jul 12 2006, 11:35 AM) *
Кто-нибудь объясните как понять выражение: "pасположение подpавнять по какой-нибудь OwnerDraw-панели"
Скорее всего имелось ввиду, по какой-то панели, положение и размер которой не меняется.

Автор: Xplorer Jul 13 2006, 08:42

Вот, держи заначку для редактора строк: http://slil.ru/22919972