Версия для печати темы
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) за один присест. Насколько мне известно, это реально... просто я с этим не сталкивался и ламачёк
Автор: -=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 и как им пользоваться, может это и есть то что нужно?!
Автор: -=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 и как им пользоваться, может это и есть то что нужно?!
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 функции высоту заголовка, вычислял разницу между полученным значением и высотой стандартного заголовка(при котором компилилась программа) и эту разницу (или чуть больше) прибавлял к высоте формы.
Если бы ты вспомнил название этой функции, я был бы очень признателен
Автор: Xplorer Jul 8 2006, 14:45
QUOTE(Siberian GRemlin @ Jul 8 2006, 06:26 PM)
Если бы ты вспомнил название этой функции, я был бы очень признателен
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