IPB

Добро пожаловать, гость ( Вход | Регистрация )

 
Reply to this topicStart new topic
> Работа с юникодовой строкой в типизированном файле, как правильно считывать и записывать
Siberian GRemlin
Jul 5 2006, 06:46
Сообщение #1


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



Сталкнулся с одной проблемкой. Есть типизированный файл, в котором помимо всего прочего хранятся строчки в юникоде. Как с такими работать я не знаю, пока сделал изврат полнейший:
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
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 5 2006, 09:00
Сообщение #2


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



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

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

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


P.S. Если не поможет попробуй заюзать перед ней ещё UnicodeToUtf8()
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Jul 5 2006, 17:41
Сообщение #3


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



А правильно считать её как?
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 6 2006, 14:02
Сообщение #4


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



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

Смотря откуда... Я так понимаю, по твоему сообщению, что у тебя "типизированный файл" - это, хотелось бы узнать, файл какого типа?
А вообще - создаёшь переменную типа WideString и жахаешь туда весь UNICODE-буфер. И уже с ней работаешь.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Jul 8 2006, 05:17
Сообщение #5


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



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

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

А должно выглядеть так:
http://img92.imageshack.us/img92/4937/blue39sc.th.gif

Как сделать, чтобы интерфейс отображался как положено на любом стиле винды?! Многие же пишут проги на Delphi и у них таких проблем нету. И зачем нужен компонент XPManifest и как им пользоваться, может это и есть то что нужно?! unsure.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 8 2006, 10:10
Сообщение #6


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



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

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

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

А должно выглядеть так:
http://img92.imageshack.us/img92/4937/blue39sc.th.gif

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


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

Если форма сильно разъезжается, то попробуй выставить Scaled = False, в свойствах формы (делается в инспекторе свойств слева).
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Jul 8 2006, 11:51
Сообщение #7


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



1. Прикол в том, что я никогда не пользуюсь манифестом, а стиль меняется.
2. Кидание манифеста на форму, рузельтата не дало - всё осталось как я и описывал
3. При Scaled = False, после компиляции на форме появляются лишнее пустое место снизу и справа
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
jTommy
Jul 8 2006, 12:51
Сообщение #8


Наблюдающий
***

Группа: CTPAX-X
Сообщений: 197
Регистрация: 4-February 08
Из: деревня Москва
Пользователь №: 6
Спасибо сказали: 19 раз(а)



Siberian GRemlin:
QUOTE

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

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

QUOTE

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

У меня тоже была такая проблема в дельфи. Причем при смене темы во время работы программы все нормально. Попробовал поискать в своих программах - не нашел.
Если я правильно помню, я в обработчике OnCreate формы запрашивал с помощью WinAPI функции высоту заголовка, вычислял разницу между полученным значением и высотой стандартного заголовка(при котором компилилась программа) и эту разницу (или чуть больше) прибавлял к высоте формы.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Jul 8 2006, 14:26
Сообщение #9


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



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

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

Если бы ты вспомнил название этой функции, я был бы очень признателен smile.gif
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Xplorer
Jul 8 2006, 14:45
Сообщение #10


Advanced Member
***

Группа: CTPAX-X
Сообщений: 52
Регистрация: 4-February 08
Пользователь №: 8
Спасибо сказали: 30 раз(а)



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

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

GetSystemMetrics(SM_CYCAPTION)

Есть более простой способ. Установи Scaled = false и при создании формы задай нужные значения свойств ClientWidth и ClientHeight.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Siberian GRemlin
Jul 12 2006, 11:35
Сообщение #11


Advanced Member
***

Группа: CTPAX-X
Сообщений: 537
Регистрация: 4-February 08
Пользователь №: 2
Спасибо сказали: 221 раз(а)



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

Кто-нибудь объясните как понять выражение: "pасположение подpавнять по какой-нибудь OwnerDraw-панели"
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
-=CHE@TER=-
Jul 12 2006, 12:45
Сообщение #12


Walter Sullivan
***

Группа: Root Admin
Сообщений: 1,361
Регистрация: 4-February 08
Пользователь №: 3
Спасибо сказали: 314 раз(а)



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-панели"
Скорее всего имелось ввиду, по какой-то панели, положение и размер которой не меняется.
User is offlineProfile CardPM
Go to the top of the page
+Quote Post
Xplorer
Jul 13 2006, 08:42
Сообщение #13


Advanced Member
***

Группа: CTPAX-X
Сообщений: 52
Регистрация: 4-February 08
Пользователь №: 8
Спасибо сказали: 30 раз(а)



Вот, держи заначку для редактора строк: http://slil.ru/22919972
User is offlineProfile CardPM
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0 -

 



Упрощённая версия Сейчас: 18th November 2024 - 19:49