نصب صفحه‌کلید فارسی برای استفاده بهینه از Persian Type Tutor

به روزرسانی:
اگر از نسخه 1.7 و بالاتر نرم‌افزار استفاده می‌کنید نیازی به نصب صفحه کلید فارسی نمی‌باشد. فقط نیاز است که زبان فارسی سیستم را  تنظیم کنید.


چیدمان صفحه‌کلید فارسی پیش‌فرض ویندوز برای استفاده در فارسی‌نویس زیاد مناسب نیست، مثلاً در این چیدمان برخی از حروف فارسی مانند «پ»، «ژ»، «ک» و «ی» در جای استاندارد خود نیستند و امکان استفاده از نیم‌فاصله که با کلیدهای Shift+Space تایپ می‌شود، وجود ندارد.
برای استفاده بهینه از نرم‌افزار آموزش تایپ فارسی نیاز است تا فایل کیبورد فارسی سیستم عامل اصلاح گردد. چندین ابزار برای انجام این کار وجود دارد ولی برنامه‌ای که من از آن در فایل نصاب آموزش تایپ فارسی استفاده کرده‌ام ، برنامه‌ای است که توسط آقای احسان اخگری تولید شده‌است که با استاندارد ماتصا 9147 سازگار می‌باشد. توضیحات این نرم‌افزار را می‌توانید در اینجا مشاهده کنید.

نصب صفحه‌کلید فارسی
هنگام نصب آموزش تایپ فارسی در آخرین مرحله نصب، گزینه‌ای با عنوان «اصلاح کیبورد فارسی» علامت‌دار می‌باشد که در صورتی که این گزینه را از حالت انتخاب خارج نکنید پس از پایان نصب آموزش تایپ فارسی، مراحل نصب صفحه‌کلید فارسی شروع می‌شود

Persian Keyboard Setup

 

درصورتی‌که برنامه آموزش تایپ فارسی را نصب کرده و صفحه‌کلید فارسی را نصب نکرده‌اید می‌توانید از مسیر زیر آن را نصب کنید:
Start>All Programs>Persian Type Tutor>Persian Keyboard Setup
 
پس از نصب صفحه‌کلید فارسی مراحل زیر را جهت فعال کردن چیدمان کیبورد فارسی انجام دهید.
 
فعال کردن صفحه‌کلید فارسی در ویندوز XP:
1- تنظیمات زبان و صفحه‌کلید سیستم عامل را از مسیر زیر فراخوانی کنید:
Start>Control Panel>Regional and Language Options>Languages>Details...
 

Windows Xp Regional and Language

 
2- گزینه Persian experimental را از مجموعه Farsi انتخاب کرده و تأئید نمایید.
 
فعال کردن صفحه‌کلید فارسی در ویندوز 7:
1- تنظیمات زبان و صفحه‌کلید سیستم عامل را از مسیر زیر فراخوانی کنید:
Start>Control Panel>Regional and Language>Keyboards and Languages>Change keyboards...
 

Windows 7 Region and Language

 
2- گزینه Persian experimental را از مجموعه Persian انتخاب کرده و تأیید نمائید.
 
 
حال زمانی که شما صفحه‌کلید فارسی را توسط کلیدهای Shift+Alt فعال می‌کنید، این چیدمان فعال خواهد شد.

به روزرسانی:
برای جلوگیری از بروز برخی مشکلات مانند بروز خطا حین تایپ نیم‌فاصله در محیط نرم‌افزار پیشنهاد می‌شود که پس از نصب صفحه‌کلید فارسی، صفحه‌کلیدهای پیش‌فرض ویندوز را حذف نمایید (در ویندوز 7 صفحه‌کلید Persian و در ویندوز XP صفحه‌کلید Farsi)

به روزرسانی مجدد:
اگر در حین اجرای برنامه نوشته‌های صفحه‌کلید با بصورت علامت سوال (؟) نمایش داده می‌شود مراحل زیر را انجام دهید:

کاربران ویندوز XP:
در پنجره Regional and Language Options و در سربرگ Advanced لیست Language for non-Unicode programs باید بر روی Farsi تنظیم شده باشد

Windows Xp Advanced Regional and Language

 
 کاربران ویندوز 7:
در پنجره Region and Language و در سربرگ Administrative با استفاده از کلید Change system locale... لیست Current system locale را بر روی Persian تنظیم کنید
 

Windows 7 Region and Language Administrative

خطای ProxyFactory حین استفاده از NHibernate

بعضی اوقات در هنگام کار با NHibernate استثناء زیر صادر می‌شود:

Could not load type 'NHibernate.Bytecode.ProxyFactoryFactoryNotConfiguredException' from assembly 'NHibernate, Version=3.3.0.4000, Culture=neutral, PublicKeyToken=aa95f207798dfdb4'.
این استثناء زمانی رخ می‌دهد که شما از کتابخانه NHibernate Validator به همراه NHibernate استفاده می‌کنید.
برای رفع این مشکل ابتدا سورس این کتابخانه را از آدرس زیر دریافت نمایید:

پس از دریافت سورس پروژه آن را از حالت فشرده خارج کرده و سپس فایل پروژه را در ویژوال استودیو باز کرده و در صورت مغایرت نسخه‌ی کتابخانه NHibernate با نسخه‌ی که از آن استفاده می‌کنید، ارجاعاتی را که به اسمبلی NHibernate داده شده است را پیدا کرده و با نسخه مورد نظر جایگزین نمایید. (در زمان نگارش این مطلب آخرین نسخه، 3.3 می‌باشد)
سپس در پروژه NHibernate.Validator و در پوشه Util فایل NHibernateHelper.cs را بازکرده و متود IsProxyFactoryConfigurated را مطابق زیر تغییر دهید:
public static bool IsProxyFactoryConfigurated()
{
    try
    {
        var f = NHibernate.Cfg.Environment.BytecodeProvider.ProxyFactoryFactory;
        return f != null; //Instead of "return true;"
    }
    catch (UnableToLoadProxyFactoryFactoryException)
    {
        return false;
    }
}
حال پروژه را در ویژوال استودیو Build کرده و فایل NHibernate.Validator.dll تولید شده را با نمونه مشابه آن در پروژه‌تان تعویض نمایید.
 

مشکل عدم نمایش برخی سایت‌ها هنگام اتصال با ADSL

مدتی بود که برخی از سایت‌ها هنگام مرور اینترنت قابل مشاهده نبودند! بخاطر اتصال دیگر کامپیوترها در شبکه (workgroup) اتصال از طریق تنظیم نام کاربری و رمز عبور در خود مودم انجام می‌شد و همچنین کامپیوترها هم دارای IP ثابت بودند.
بعد از کلی سرو کله زدن با آن، متوجه شدم که این مشکل هنگامی که از طریق کانکشن به اینترنت متصل می‌شویم و یا کامپیوتر متصل شونده دارای IP پویا (Dynamic) می‌باشد رخ نمی‌دهد.

مشکل از کجا بود؟
مشکل از آنجا بود که موقع تنظیم IPهای سیستم‌ها و در قسمت DNS Server، شماره 4.2.2.4 را تنظیم کرده بودیم که آن را با IP خود مودم یعنی 192.168.1.1 جایگزین کردیم و مشکل حل شد

TCP/IP Properties

ترسیم کاراکتر به کاراکتر یک رشته فارسی در صفحه

Persian Type Tutor را که خاطرتان هست، قرار بود که در مورد بخش‌های مختلف آن توضیحاتی را ارائه کنم.

یکی از مواردی که در این نرم‌افزار استفاده شده، نمایش متنی است که کاربر قراراست آن را تایپ کند. به این صورت که این متن به رنگ مشکی در صفحه نمایش داده می‌شود و با تایپ کردن هر حرف از متن آن حرف به رنگ زرد رنگ در خواهد آمد و همچنین یک نشانگر به صو��ت چشمک‌زن در زیر حرف بعدی که قراراست تایپ شود نمایش داده می‌شود.

مسئله‌ای که وجود دارد نمایش حروف یک کلمه فارسی به صورت رنگی می‌باشد.
حتماً می‌پرسید چه مسأله‌ای؟
در ادامه یک توضیح در مورد حروف فارسی:
همانطور که می‌دانید بعضی از حروف فارسی با توجه به موقعیت آن در کلمه به شکل‌های مختلف نمایش داده می‌شود. به عنوان مثال حرف «س» را در کلمات زیر در نظر بگیرید:
 
Persian Type Tutor Image 1
 
این حرف با توجه به اینکه در اول، وسط و یا آخر کلمه باشد شکل‌های مختلفی به خود گرفته است.
حال قطعه کد زیر را در نظر بگیرید:


const
  Str = 'تست';
var
  I: Integer;
  XPos: Integer;
begin
  XPos := 400;
  for I := 0 to Length(str) - 1 do
  begin
    TextOut(Canvas.Handle, XPos, 10, @Str[I+1], 1);
    XPos := XPos - Canvas.TextWidth(Str[I+1]);
  end;
end;

می‌خواهیم کلمه‌ی «تست» را بصورت حرف به حرف در صفحه ترسیم کنیم. خروجی ای قطعه کد چیزی شبیه به این خواهد بود:

Persian Type Tutor Image 2

 
همانطور که می‌بینید حروف تماماً‌ بصورت غیر متصل در صفحه ترسیم شده‌اند. داستان از چه قرار است؟

وقتی که شما توسط یک دستور ترسیم، رشته‌ای را در صفحه ترسیم می‌کنید سیستم عامل در پس پرده با توجه به فونت انتخابی صفحه ترسیم (Canvas) و با توجه به موقعیت هر حرف در کلمه شکل مخصوص به آن حرف (گلایف) را از جدول فونت مربوطه استخراج کرده و در صفحه ترسیم می‌نماید.

من چطور این ترسیم را انجام دهم؟

کل کار با استفاده از دو تابع API ویندوز انجام می‌شود: 
GetCharacterPlacementW:جهت استخراج خصوصیات کاراکترهای رشته.
ExtTextOutW: جهت ترسیم رشته در صفحه.

و اما نحوه استفاده:
ابتدا رکورد زیر را تعریف می‌نماییم:

type
 
  PIntArray = array of Integer;
  PwcArray  = array of widechar;
 
  WideCharInfo = Record
    lpDx: PIntArray;
    lpGlyphs: PwcArray;
    lpOrder: PIntArray;
  End;


lpDx: آرایه‌ایست که در آن عرض گلایف مربوط به کاراکترهای رشته قرار می‌گیرد که از آن برای تعیین موقعیت ترسیم هر گلایف در صفحه (و یا نمایش نشانگر چشمک‌زن زیر کاراکترها) استفاده خواهیم کرد.
lpGlyphs: در این آرایه کد یونیکد هر گلایف قرار داده می‌شود.
lpOrder: در این آرایه هم شماره ترتیب هر گلایف در رشته قرار داده می‌شود. (این حالت برای زبان‌های راست به چپ استفاده دارد)
سپس توسط تابع زیر اطلاعات مربوط به رشته‌ای را که قصد ترسیم آن را داریم را استخراج می‌نمائیم:

function GetCharacterPlace(DC: HDC;
    sText:  WideString): WideCharInfo;
var
  GCP       : TGCPResults;
  TextLength: Integer;
begin
 
  TextLength := Length(sText);
 
  SetLength(Result.lpOrder, TextLength);
  SetLength(Result.lpDx, TextLength);
  SetLength(Result.lpGlyphs, TextLength);
 
  GCP.lStructSize := sizeof(TGCPResults);
  GCP.lpOutString := nil;
  GCP.lpOrder := Pointer(Result.lpOrder);
  GCP.lpDx := Pointer(Result.lpDx);
  GCP.lpGlyphs := Pointer(Result.lpGlyphs);
  GCP.lpCaretPos := nil;
  GCP.lpClass := nil;
  GCP.nGlyphs := TextLength;
  GCP.nMaxFit := 0;
 
  GetCharacterPlacementW(DC, Pointer(sText), TextLength, 0,
    GCP, GetFontLanguageInfo(DC))
 
end;

و در آخر نحوه ترسیم رشته در صفحه با استفاده از تابع بالا:

procedure DrawPersianText(Canvas: TCanvas; Str: WideString);
var
  aRect     : TRect;
  CharInfo  : WideCharInfo;
  Options   : LongInt;
  wChar     : widechar;
  I         : Integer;
  xPos      : Integer;
begin
 
  aRect := Canvas.ClipRect;
  CharInfo := GetCharacterPlace(Canvas.Handle, Str);
 
  xPos := aRect.Right - 100;
  Options := ETO_GLYPH_INDEX;
 
  I := 0;
  while I < Length(Str) do
  begin
    if (I mod 2) = 0 then
      Canvas.Font.Color := clBlack
    else
      Canvas.Font.Color := clRed;
 
    wChar := CharInfo.lpGlyphs[CharInfo.lpOrder[I]];
    xPos := xPos - CharInfo.lpDx[CharInfo.lpOrder[I]];
    ExtTextOutW(Canvas.Handle, xPos, 10, Options, @aRect, @wChar, 1, nil);
    Inc(I);
  end;
end;
 
procedure TfrmMain.FormPaint(Sender: TObject);
Const
  Str = 'تست';
begin
  DrawPersianText(Canvas, Str);
end;
که خروجی آن به صورت زیر خواهد بود:

 

Persian Type Tutor Image 3


دریافت سورس کد مثال:


برای مشاهده مثال کامل به سورس کد Persian Type Tutor مراجعه فرمائید.
همچنین اطلاعات بیشتر در مورد تابع GetCharacterPlacementW

 

فعال شدن خودکار زبان انگلیسی

نرم‌افزاری را توسط Delphi Xe2 ایجاد کرده‌ام که در در موقع اجرا زبان فارسی را فعال می‌کرد. ولی در حین کارکردن گاهگاهی زبان انگلیسی به صورت خودکار فعال می‌شد که واقعاً عذاب آور بود.

مشکل در کجاست؟

مشکل زمانی رخ می‌دهد که شما از کنترل DbGrid و یا کنترل‌های دیگری که از TCustomGrid دلفی مشتق شده باشند در فرم خود استفاده کرده‌‌اید.

راه حل:

در فایل Vcl.Grids و در خط 7144 قطعه کد زیر وجود دارد
if HWND(Message.FocusedWnd) &lt;&gt; Grid.Handle then
   ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);


در این قطعه کد مشخص نیست که به چه علت پس از خروج فوکوس از DbGrid زبان پیش‌فرض سیستم فعال می‌شود.

این دو خط را غیرفعال کرده و فایل را ذخیره کنید. سپس از مسیر Project --> add to project این فایل را به پروژه خود اضافه کنید.