Вниз
Скачать: CL | DM;

Нестандартные шрифты   Найти похожие ветки 

← →
Искандер В.   (2006-07-04 15:49) [0]

[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]


← →
Искандер В.   (2006-07-04 17:47) [1]

Никто? :-(


← →
guav ©   (2006-07-04 18:35) [2]

> Для этого я должен скопировать его в папку: [I]"%windir%\Fonts"[/I]
> компьютера - пользователя программы.
> Надо потом перезагрузить комп???
> Как лучше сделать...

Для установки шрифта требуется вызвать AddFontResource.
При установке шрифта он будет доступен без перезагрузки - сразу после вызова AddFontResource.
Шрифт можно устанавливать постоянно или временно, при временной установке можно его даже зашить в ресурс программы и устанавливать и использовать оттуда.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/fontext_2ylq.asp


← →
Искандер В.   (2006-07-04 20:06) [3]

Ага,спасибо. :-)
Проделал,фонт установлен.

Еще вопрос с вашего позволения...
Если я делаю проверку символа из текстового файла на равенство определенной букве азербайджанского алфавита,то как ее осуществить???

Т.е.
Грубо говоря, if c = <конкретный символ>.
Все дело в том,что когда я пишу этот сивол в редакторе кода,он отображается как "?".
Т.о. мне придется вместо самого символа,ставить его числовой номер,в функцию Chr.
Но как узнать,каков номер символа азербайджанской раскладки клавиатуры,при данном(установленном при первом запуске проги) шрифте?


← →
Искандер В.   (2006-07-04 20:30) [4]

Делаю это:
ShowMessage(Chr($00DE));
Он мсне выдает совсем не тот символ,код которого я вижу в углу окна,сервисной программы Windows под названием Таблица символов.

&#246;


← →
guav ©   (2006-07-04 21:01) [5]

А если поставить именно тот шрифт на, например, TEdit и выполнить Edit1.Text :=Chr($00DE) ?


← →
Искандер В.   (2006-07-04 21:50) [6]

Парень...
Я плакалЪ. :-)
Спасибо тебе...
Получилось!!!
Блин...
Сам не сообразил. :-(

С вашей помощью,теперь регестрирую временно шрифт,могу отображать юникодные символы в компанентах 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 22:19) [7]

> могу отображать юникодные символы в компанентах VCL.

Это вряд ли, если речь идёт о стандартных компонентах VCL для D7.


> x.Read(a,SizeOf(a));


> Edit1.Text:=a;

Здесь следует уточнить тип переменной a.
В файле Check.txt текст написан не в Unicode ?


← →
Искандер В.   (2006-07-04 22:42) [8]


> В файле Check.txt текст написан не в Unicode ?

Он написан шрифтом Arial AzLat,который я установил при помощи AddFontResource.
Спутал,он выдает не "?",а одну и ту же букву из этого шрифта,независимо от того,что записано в файле.


← →
guav ©   (2006-07-04 23:00) [9]

Покажите объявление переменной a из кода в [6]


← →
Iskander V.   (2006-07-05 10:36) [10]

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?


← →
Iskander V.   (2006-07-05 10:37) [11]


> объявление переменной a

objavil kak WideChar.


← →
guav ©   (2006-07-05 13:53) [12]

> objavil kak WideChar.

Это одна юникодная буква. Если текст НЕ-unicode, нужно объявить как Char.
Если WideChar правильно работает с текстом, значит текст unicode.
чтобы прочитать не один символ а более длиную строку, нужен тип string или PChar.


> Na WinXP vsyo normalno rabotaet.
> A kogda perenoshu na Win2000,to kodi bukv sbivajutsja.

Что именно работает на ХР и не работает в 2000 ? Нужен точный код.


← →
Искандер В.   (2006-07-05 18:34) [13]


> Это одна юникодная буква. Если текст НЕ-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.
Юникодные коды букв брал из Таблицы символов,выбрав там соответствующий шрифт.


← →
Искандер В.   (2006-07-05 18:39) [14]

И кстати,как программно узнать,в каком шрифте на данный момент текст в текстовом файле,который я открыл?


← →
guav ©   (2006-07-05 20:49) [15]

Видимо в 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] работает правильно.

> И кстати,как программно узнать,в каком шрифте на данный
> момент текст в текстовом файле,который я открыл?

Текстовый файл не содержит никакой информации о шрифте.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.5 MB
Время: 0.026 c
4-1146143771
tytus
2006-04-27 17:16
2006.08.20
Какое сообщение указывает, что в ListBox-e появился скролбар?


2-1154520955
Grant
2006-08-02 16:15
2006.08.20
Денежный разделитель


2-1154198011
Aral
2006-07-29 22:33
2006.08.20
Вопрос о позиции каретки.


2-1154430637
Dysan
2006-08-01 15:10
2006.08.20
Как выловить утечку памяти в программе?


15-1153553033
Pazitron_Brain
2006-07-22 11:23
2006.08.20
Посоветуйте КПК




   Наверх