Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];

Вниз

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

 
Искандер В.   (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 вся ветка

Форум: "Основная";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.037 c
3-1150214247
Klaus B.
2006-06-13 19:57
2006.08.20
проблема с SET TERM


1-1151967710
MNC
2006-07-04 03:01
2006.08.20
фокус на первый символ в РичЕдит


2-1154054923
Leksey
2006-07-28 06:48
2006.08.20
открытие таблиц Excel


15-1153689754
Ломброзо
2006-07-24 01:22
2006.08.20
eMule


1-1152141034
xsid
2006-07-06 03:10
2006.08.20
Выделение картинки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский