![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нестандартные шрифты [D7, WinXP]
Искандер В. © (2006-07-04 15:49:00)[I]Здравствуйте.[/I]
Задание:
Имеется текстовый файл.(из него данные только читаются)
Текст в нем на [B]азербайджанском[/B] языке.
Нужно в виде упорядоченного по убыванию списка,вывести [B]частоту появления букв[/B].
Т.е:
1) - a(16)
2) - r(11)
3) - z(5)
...
...
...
32) - f(0)
Алгоритм подсчета,составить не представляется сложным.
Но я не силен в работе со шрифтами.
Вопросы:
[B]1)[/B]
Зайдя в панель управления,затем в региональные настройки,затем добавив там азербайджанский язык,я т.о. устанавливаю на своем компьютере язык с кодировкой Unicode?
Если да,то стоит ли использовать кодировку Unicode,[U]будет ли она правильно отображаться [/U]в Win2000,если программа составлена на WinXP SP2?
Если нет,то что для этого сделать.
[B]2)[/B]
Можно установить готовый,имеющийся на моем компьютере шрифт Azeri Arial Lat.
Для этого я должен скопировать его в папку: [I]'%windir%\Fonts'[/I] компьютера - пользователя программы.
Надо потом перезагрузить комп???
Как лучше сделать...
Использовать Unicode,или же копировать шрифт?
[B]3)[/B]
Когда я пишу в текстовом редакторе на азербайджанском(установлен через путь,который я описал в пункте #1)
спецефические символы(не имеющие аналогов в кирилице и на латыне) отображаются как "?".
А когда пишу в MS Word'е 2000 Professional,то все нормально.
Что делать,и в чем проблема?
Очень признателен,если кто-то откликнется,буду рад и ссылкам на сайты и фрагментам,и простым советам.
[I]С уважением Искандер В.[/I]
guav (2006-07-05 20:49:00) [1]Видимо в 2000 установленна другая кодовая страница чем в ХР, поэтому в строке
>memResult.Lines.Add(AzChar[i].letter + ' <---> ' + IntToStr(AzChar[i].count));
перекодировка в ANSI из Unicode срабатывает неправильно.
Можно перекодировать вручную через WideCharToMultiByte, задав соответствующую кодировку. Для одного символа это будет выглядеть так:
function WCharToChar(const W: WideChar): AnsiChar;
begin
if WideCharToMultiByte( 1251, 0, @W, 1, @Result, 1, nil, nil) <> 1 then
RaiseLastOsError;
end;
...
memResult.Lines.Add(WCharToChar(AzChar[i].letter) + ' <---> ' + IntToStr(AzChar[i].count));
Вместо 1251подставить номер требуемой кодовой страницы. Его можно узнать, выполнив GetACP там, где код [13] работает правильно.
> И кстати,как программно узнать,в каком шрифте на данный
> момент текст в текстовом файле,который я открыл?
Текстовый файл не содержит никакой информации о шрифте.
Искандер В. (2006-07-05 18:39:00) [2]И кстати,как программно узнать,в каком шрифте на данный момент текст в текстовом файле,который я открыл?
Искандер В. (2006-07-05 18:34:00) [3]
> Это одна юникодная буква. Если текст НЕ-unicode, нужно объявить
> как Char.
> Если WideChar правильно работает с текстом, значит текст
> unicode.
> чтобы прочитать не один символ а более длиную строку, нужен
> тип string или PChar.
Текст юникодный,поэтому использую WideChar.
> Что именно работает на ХР и не работает в 2000 ? Нужен точный
> код.
Вот:
unit Statistics_;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TfrmMain = class(TForm)
btnOpen: TButton;
odOpen: TOpenDialog;
memResult: TMemo;
procedure btnOpenClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
TAzChar = record
letter: WideChar;
count: LongWord;
end;
const nOfChars = 32;
var
frmMain: TfrmMain;
implementation
{$R *.dfm}
procedure TfrmMain.btnOpenClick(Sender: TObject);
var AzFile: TextFile;
AzChar: array [1..nOfChars] of TAzChar;
c: WideChar;
i: Word;
Result: TextFile;
begin
AddFontResource('ariall.ttf');
SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0);
memResult.Font.Name := 'A3 Arial AzLat';
if odOpen.Execute = false then Exit;
AssignFile(AzFile,odOpen.FileName);
Reset(AzFile);
//Инициализация//
for i:=1 to nOfChars do
AzChar[i].count:=0;
AzChar[1].letter := Chr($00C0);
AzChar[2].letter := Chr($00C1);
AzChar[3].letter := Chr($00C2);
AzChar[4].letter := Chr($00C3);
AzChar[5].letter := Chr($00C4);
AzChar[6].letter := Chr($00C5);
AzChar[7].letter := Chr($00C6);
AzChar[8].letter := Chr($00C7);
AzChar[9].letter := Chr($00C8);
AzChar[10].letter := Chr($00C9);
AzChar[11].letter := Chr($00CA);
AzChar[12].letter := Chr($00CB);
AzChar[13].letter := Chr($00CC);
AzChar[14].letter := Chr($00CD);
AzChar[15].letter := Chr($00CE);
AzChar[16].letter := Chr($00CF);
AzChar[17].letter := Chr($00D0);
AzChar[18].letter := Chr($00D1);
AzChar[19].letter := Chr($00D2);
AzChar[20].letter := Chr($00D3);
AzChar[21].letter := Chr($00D4);
AzChar[22].letter := Chr($00D5);
AzChar[23].letter := Chr($00D6);
AzChar[24].letter := Chr($00D7);
AzChar[25].letter := Chr($00D8);
AzChar[26].letter := Chr($00D9);
AzChar[27].letter := Chr($00DA);
AzChar[28].letter := Chr($00DB);
AzChar[29].letter := Chr($00DC);
AzChar[30].letter := Chr($00DD);
AzChar[31].letter := Chr($00DE);
AzChar[32].letter := Chr($00DF);
//Инициализация//
while NOT EOF(AzFile) do
begin
Read(AzFile,c);
if c = AzChar[1].letter then Inc(AzChar[1].count);
if c = AzChar[2].letter then Inc(AzChar[2].count);
if c = AzChar[3].letter then Inc(AzChar[3].count);
if c = AzChar[4].letter then Inc(AzChar[4].count);
if c = AzChar[5].letter then Inc(AzChar[5].count);
if c = AzChar[6].letter then Inc(AzChar[6].count);
if c = AzChar[7].letter then Inc(AzChar[7].count);
if c = AzChar[8].letter then Inc(AzChar[8].count);
if c = AzChar[9].letter then Inc(AzChar[9].count);
if c = AzChar[10].letter then Inc(AzChar[10].count);
if c = AzChar[11].letter then Inc(AzChar[11].count);
if c = AzChar[12].letter then Inc(AzChar[12].count);
if c = AzChar[13].letter then Inc(AzChar[13].count);
if c = AzChar[14].letter then Inc(AzChar[14].count);
if c = AzChar[15].letter then Inc(AzChar[15].count);
if c = AzChar[16].letter then Inc(AzChar[16].count);
if c = AzChar[17].letter then Inc(AzChar[17].count);
if c = AzChar[18].letter then Inc(AzChar[18].count);
if c = AzChar[19].letter then Inc(AzChar[19].count);
if c = AzChar[20].letter then Inc(AzChar[20].count);
if c = AzChar[21].letter then Inc(AzChar[21].count);
if c = AzChar[22].letter then Inc(AzChar[22].count);
if c = AzChar[23].letter then Inc(AzChar[23].count);
if c = AzChar[24].letter then Inc(AzChar[24].count);
if c = AzChar[25].letter then Inc(AzChar[25].count);
if c = AzChar[26].letter then Inc(AzChar[26].count);
if c = AzChar[27].letter then Inc(AzChar[27].count);
if c = AzChar[28].letter then Inc(AzChar[28].count);
if c = AzChar[29].letter then Inc(AzChar[29].count);
if c = AzChar[30].letter then Inc(AzChar[30].count);
if c = AzChar[31].letter then Inc(AzChar[31].count);
if c = AzChar[32].letter then Inc(AzChar[32].count);
end;//while
for i := 1 to nOfChars do
memResult.Lines.Add(AzChar[i].letter + ' <---> ' + IntToStr(AzChar[i].count));
end;
end.
PS.Не использовалcase,потому что в нем не допускаетсяWideChar.
Юникодные коды букв брал из Таблицы символов,выбрав там соответствующий шрифт.
guav (2006-07-05 13:53:00) [4]> objavil kak WideChar.
Это одна юникодная буква. Если текст НЕ-unicode, нужно объявить как Char.
Если WideChar правильно работает с текстом, значит текст unicode.
чтобы прочитать не один символ а более длиную строку, нужен тип string или PChar.
> Na WinXP vsyo normalno rabotaet.
> A kogda perenoshu na Win2000,to kodi bukv sbivajutsja.
Что именно работает на ХР и не работает в 2000 ? Нужен точный код.
Iskander V. (2006-07-05 10:37:00) [5]
> объявление переменной a
objavil kakWideChar.
Iskander V. (2006-07-05 10:36:00) [6]Ok...
Na WinXP vsyo normalno rabotaet.
A kogda perenoshu na Win2000,to kodi bukv sbivajutsja.
Ja ved' regestriruyu ispolzovanniy 6rift na komp polzovatelya...
A proga vse ravno putayet kodi,vidayet ne te bukvi...
Eto iz-za rzli4iya platform?
guav (2006-07-04 23:00:00) [7]Покажите объявление переменной
aиз кода в [6]
Искандер В. (2006-07-04 22:42:00) [8]
> В файле Check.txt текст написан не в Unicode ?
Он написан шрифтом Arial AzLat,который я установил при помощи AddFontResource.
Спутал,он выдает не "?",а одну и ту же букву из этого шрифта,независимо от того,что записано в файле.
guav (2006-07-04 22:19:00) [9]> могу отображать юникодные символы в компанентах VCL.
Это вряд ли, если речь идёт о стандартных компонентах VCL для D7.
> x.Read(a,SizeOf(a));
> Edit1.Text:=a;
Здесь следует уточнить тип переменной a.
В файле Check.txt текст написан не в Unicode ?
Искандер В. (2006-07-04 21:50:00) [10]Парень...
Я плакал Ъ. :-)
Спасибо тебе...
Получилось!!!
Блин...
Сам не сообразил. :-(
С вашей помощью,теперь регестрирую временно шрифт,могу отображать юникодные символы в компанентах VCL.
Осталась последняя часть...
Делаю:
Edit1.Font.Name:=' Arial AzLat';
x:=TFileStream.Create('C:\Documents and Settings\MakedoneZ\Desktop\Check.txt',fmOpenRead);
x.Read(a,SizeOf(a));
Edit1.Text:=a;
x.Free;
Все же в эдите мне выдает "?",хотя данные в файле и записаны шрифтом Arial AzLat.
guav (2006-07-04 21:01:00) [11]А если поставить именно тот шрифт на, например, TEdit и выполнить
Edit1.Text :=Chr($00DE)?
Искандер В. (2006-07-04 20:30:00) [12]Делаю это:
ShowMessage(Chr($00DE));
Он мсне выдает совсем не тот символ,код которого я вижу в углу окна,сервисной программы Windows под названием Таблица символов.
ö
Искандер В. (2006-07-04 20:06:00) [13]Ага,спасибо. :-)
Проделал,фонт установлен.
Еще вопрос с вашего позволения...
Если я делаю проверку символа из текстового файла на равенство определенной букве азербайджанскогоалфавита,то как ее осуществить???
Т.е.
Грубо говоря, if c = <конкретный символ>.
Все дело в том,что когда я пишу этот сивол в редакторе кода,он отображается как "?".
Т.о. мне придется вместо самого символа,ставить его числовой номер,в функцию Chr.
Но как узнать,каков номер символа азербайджанской раскладки клавиатуры,при данном(установленном при первом запуске проги) шрифте?
guav (2006-07-04 18:35:00) [14]> Для этого я должен скопировать его в папку: [I]'%windir%\Fonts'[/I]
> компьютера - пользователя программы.
> Надо потом перезагрузить комп???
> Как лучше сделать...
Для установки шрифта требуется вызвать AddFontResource.
При установке шрифта он будет доступен без перезагрузки - сразу после вызова AddFontResource.
Шрифт можно устанавливать постоянно или временно, при временной установке можно его даже зашить в ресурс программы и устанавливать и использовать оттуда.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_2ylq.asp
Искандер В. (2006-07-04 17:47:00) [15]Никто? :-(