-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
حالا بفرمایید چه طوری میشه این کار رو انجام داد!؟
در ضمن چرا وقتی من همه دستورات تغییر زبان رو از پروژه ام حذف کردم باز هم موقع فوکوس روی کنترلهای مثلا TEDIT خود به خود زبان فارسی میشه!!!
خطاب شما بنده نیستم ولی منظور اینه که یک بار لیست زبانهای موجود در سیستم رو در آرایه داشته باشید بعد از طریق اون آرایه زبانی را که مد نظر دارید active کنید.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
حالا بفرمایید چه طوری میشه این کار رو انجام داد!؟
می تونید از یک کلاس ساده مثل کد زیر استفاده کنید:
unit uKbLayoutFix;
interface
uses SysUtils, Windows;
type
TKbLayoutFix = class
private
const KLF_SETFORPROCESS = $00000100;
class var FBiDiLayoutHandle : Cardinal;
class var FNonBiDiLayoutHandle : Cardinal;
class var FBiDiKeyboard : string;
class var FNonBiDiKeyboard : string;
class procedure SetKeyboardLayout(Index: Integer; const Value: string); static;
public
class procedure ActivateBiDiKeyboard;
class procedure ActivateNonBiDiKeyboard;
class property BiDiKeyboard: string index 1 read FBiDiKeyboard write SetKeyboardLayout;
class property NonBiDiKeyboard: string index 2 read FNonBiDiKeyboard write SetKeyboardLayout;
end;
implementation
{ TKeyboardLayoutFix }
class procedure TKbLayoutFix.ActivateBiDiKeyboard;
begin
if FBiDiLayoutHandle > 0 then
ActivateKeyboardLayout(FBiDiLayoutHandle,KLF_SETFO RPROCESS);
end;
class procedure TKbLayoutFix.ActivateNonBiDiKeyboard;
begin
if FNonBiDiLayoutHandle > 0 then
ActivateKeyboardLayout(FNonBiDiLayoutHandle,KLF_SE TFORPROCESS);
end;
class procedure TKbLayoutFix.SetKeyboardLayout(Index: Integer; const Value: string);
var
CurrentKeyboard: PChar;
CurrentHandle : PCardinal;
begin
CurrentKeyboard := nil;
CurrentHandle := nil;
case Index of
1 :
begin
CurrentKeyboard := PChar(FBiDiKeyboard);
CurrentHandle := @FBiDiLayoutHandle;
end;
2 :
begin
CurrentKeyboard := PChar(FNonBiDiKeyboard);
CurrentHandle := @FNonBiDiLayoutHandle;
end;
end;
if Value <> CurrentKeyboard then
begin
UnloadKeyboardLayout(CurrentHandle^);
CurrentHandle^ := 0;
StrPCopy(CurrentKeyboard,Value);
CurrentHandle^ := LoadKeyboardLayout(CurrentKeyboard, KLF_ACTIVATE);
end;
end;
end.
برای استفاده ازش، به خصوصیات BiDiKeyboard و NonBiDiKeyboard مقدار بدید، و سپس هر جا که لازم داشتید، با استفاده از متدهای ActivateBiDiKeyboard یا ActivateNonBiDiKeyboard، زبان مورد نظرتان را فعال کنید:
TKbLayoutFix.BiDiKeyboard := '00000429';
TKbLayoutFix.NonBiDiKeyboard := '00000409';
TKbLayoutFix.ActivateBiDiKeyboard;
البته این متدها مثل حالت استفاده از Application.BiDiKeyboard به طور خودکار فراخوانی نمیشند. خوبی Application.BiDiKeyboard این بود که به طور خودکار، با توجه به BiDiMode هر کنترل، زبان رو تغییر می داد. اما نمیشه فعلا کاری برای اون کرد؛ تغییر سورس کد Application کار جالبی نیست. از طرف دیگه، استفاده از class helpers هم فایده ایی نداره، چون این تغییر زبان در متد CMEnter از TWinControl انجام میشه و این یک message handler به صورت private هست، و مستقیما از طرف کد ما فراخوانی نمیشه، در نتیجه تعریف class helper براش نتیجه ایی نداره.
نقل قول:
در ضمن چرا وقتی من همه دستورات تغییر زبان رو از پروژه ام حذف کردم باز هم موقع فوکوس روی کنترلهای مثلا TEDIT خود به خود زبان فارسی میشه!!!
نمیدونم، برای من که اینطوری نمیشه.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
سلام
هرچند که در کل، به نظر میاد تاپیک به نتیجه رسیده، اما مشکل بعضی از برنامههای کامپایل شده تو XP و اجرای کند اونا تو 7، غیر از تغییر زبان کیبورد، علی القاعده، دلایل دیگه هم داره.
مثلاً برنامهای که از افکتهای تصویری کامپوننت Billenium Effects استفاده میکنه، توی 7، کند اجرا میشه. که با کمپایل مجدد اون تو خود 7، اوضاع خیلی بهتر میشه.
متأسفانه تاپیک با داشتن بیشتر از 40 پست، آنچنان که باید، روی موضوع اصلی (کندی اجرای برنامهها در 7 نسبت به XP) نپرداخته.
البته تو پست 3 راه حلی بیان شده که اصولاً شاید بهترین راه حل باشه:
نقل قول:
نوشته شده توسط
nilidelphi
...همون برنامرو [برنامه رو] با دلفی 2009 یا بیشتر [بالاتر] تو خود ویندوز 7 ایجاد کن و از اول بنویس...
ولی قسمت قرمز رنگ نقل قول بالا که البته قاعدتاً درست نیست، باعث شد که بحث بی موردی ایجاد بشه و به اصل قضیه پرداخت نشه. هرچند آقای تاجیک تو چندتا پست بیان کردن که نیازی به از اول نوشتن کد برنامه نیست، ولی لحن تند ایشون و نگاه بالا به پایین به سایر اعضا، باعث این بحثهای بی مورد شده. این قضیه تو همون اولین پست ایشون (پست 4) دیده میشه:
نقل قول:
نوشته شده توسط
مجتبی تاجیک
از اول بنویسه یا از اول کامپایل کنه ؟ اگر بگی کامپایل[،] میشه قبول کرد ولی در مورد نوشتن برنامه از اول[،] مگر سورس ذخیره شده در دو ویندوز متفاوت[،] با هم فرق میکنه ؟!
و یا تو پست دوم ایشون (پست 7)
نقل قول:
نوشته شده توسط
مجتبی تاجیک
اشتباه فکر میکنی !
یعنی چی که نحوه ساخت ابزار ویژوال فرق میکنه ، ...
تنها به 2 چیز میشه شک کرد یکی تنضیمات [تنظیمات] ذخیره شده در پروژه و دیگری فایل ریسورس هست ، قبل از کامپایل تنضیمات [تنظیمات] رو بررسی کنید و فایل های dcu کامپایل شده و فایل ریسورس رو حذف و برنامه رو سیستم عامل مورد نظر کامپایل کنید .
هرچند تو این پست دقیقاً و به طور کامل راهکار (و احتمال قریب به یقین تنها راهکار) قابل اجرا برای رفع مشکل بیان شده، ولی باز هم تأکید میکنم که همون طرز نگاه، سبب شده تا دوستان دیگه، مطالبی رو ارائه کنن که خیلی نمیتونه درست باشه (و البته روش پافشاری هم بکنن).
تو پست 9 و 10، کار یه جورایی داره بالا میگیره و حتی بعد از توصیههای آقای عشایری و جناب استاد کشاورز (تو پستای 13 و 14)، باز هم بحث بی مورد تموم نمیشه.
من فکر میکنم که اولاً دانش هیچ کسی کامل نیست و به قولی "همه چیز را همگان دانند" و در صورتیکه چیزی رو بهتر از بقیه بلد هستیم، لزومی نداره با کسایی که از ما کمتر بلدن، بصورت تحقیر آمیز رفتار کنیم (صحبت کنیم). ثانیاً، کل این سایت برای تبادل اطلاعات علمی درست شده و فکر میکنم تمام اعضا، اومدن تا چیزی یاد بگیرن و چیزهایی رو هم که بلدن، در اختیار بقیه بذارن. این موضوع از شماره تعداد تشکر کردنحتی کاربری مثل استاد کشاورز هم مشخصه.
به نظر من، دوستان سایت، اگه علاقه مند هستن که با سواد بودنشون رو به بقیه ثابت کنن، بهتر این هست که توی بحثها شرکت نکنن، چون اینجوری میشه فکر کرد که، بحث برای اونا اینقدر پیش و پا افتادهس که ارزش وقت گذاشتن رو براشون نداره. ولی در صورتیکه لطف بیشتری دارن، بهتره نظر صحیح (یا لااقل چیزی که فکر میکنن درسته) رو وارد کنند و از به رخ کشیدن سواد خودشون و به رو اوردن کم دانشی بقیه خود داری کنن.
موفق باشید.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
به نظر من، دوستان سایت، اگه علاقه مند هستن که با سواد بودنشون رو به بقیه ثابت کنن، بهتر این هست که توی بحثها شرکت نکنن، چون اینجوری میشه فکر کرد که، بحث برای اونا اینقدر پیش و پا افتادهس که ارزش وقت گذاشتن رو براشون نداره. ولی در صورتیکه لطف بیشتری دارن، بهتره نظر صحیح (یا لااقل چیزی که فکر میکنن درسته) رو وارد کنند و از به رخ کشیدن سواد خودشون و به رو اوردن کم دانشی بقیه خود داری کنن.
قبل از موضع گیری بحث رو کامل مطالعه کن ؛ من چند بار گفتم نه قصد توهین دارم و نه قصد به رخ کشیدن چیزی رو ، جناب عالی تازه وارد این سایت و این بخش شدی ، انشاالله تا چند ماه دیگه به مباحث فنی! جناب خاکپور عادت میکنی ، اون وقت بیا ببینم نظرت چیه اگر میخوای زودتر با این مباحث آشنا بشی تو همین بخش مباحث فنی دیگه زیادی وجود داره !
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
من با یکم ابتکار تغییر زبان رو یکجور دیگه درست کردم البته باید حرفه ای درستش میکردم که نکردم میتونستم لیست تمامی زبانها رو بگیرم و بر اساس اون حلقه دور بزنه و عمل تغییر زبان با شبیه سازی ALT + SHIFT انجام بشه که این کد تنها برای ویندوزهایی که دو زبان نصبه کار میکنه و دیگه تو ویندوز 7 مکثی در کار نیست.
procedure TForm1.Button1Click(Sender: TObject);
var
Change : String;
Select : String;
GKLN: array [0..8] of Char;
i : Integer;
begin
Change := 'FA';
GetKeyboardLayoutName(GKLN);
if GKLN='00000409' then Select:='EN';
if GKLN='00000429' then Select:='FA';
if Select <> Change then
for i := 1 to 1 do
GetKeyboardLayoutName(GKLN);
if GKLN='00000409' then
keybd_event(VK_Menu,0,0,0);
keybd_event(VK_SHIFT,0,0,0);
keybd_event(VK_Menu,0,KEYEVENTF_KEYUP,0);
keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
end;
ضمنا ممنون میشم یکی از دوستان سورس نمونه کدی رو که جناب علی کشاورز دادن رو برام پیوست کنن آخه من خواستم از این کد استفاده کنم که نشد چون مدام خطا میداد. یک دنیا ممنونتون میشم اگه اینکار رو بکنید.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
سلام.
ممنون از همه دوستان.
فقط مشکلی که اینجا پیش میاد اینه که برنامه خیلی بزرگه. آیا باید برای هر رویدادی این تابع فراخوانی بشه؟
اینجوری خیلی سخت میشه.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
من با یکم ابتکار تغییر زبان رو یکجور دیگه درست کردم البته باید حرفه ای درستش میکردم که نکردم میتونستم لیست تمامی زبانها رو بگیرم و بر اساس اون حلقه دور بزنه و عمل تغییر زبان با شبیه سازی ALT + SHIFT انجام بشه که این کد تنها برای ویندوزهایی که دو زبان نصبه کار میکنه و دیگه تو ویندوز 7 مکثی در کار نیست.
نیازی به شبیه سازی کلیدهای صفحه کلید نیست، ActivateKeyboardLayout خودش پارامترهایی برای فعال کردن Layout بعدی و قبلی داره.
نقل قول:
فقط مشکلی که اینجا پیش میاد اینه که برنامه خیلی بزرگه. آیا باید برای هر رویدادی این تابع فراخوانی بشه؟
باید ببیند که اولا آیا شما در برنامه نیازی به سوئیچ کردن بین دو زبان دارید یا نه؟ اگر دارید، آیا فقط در چند مورد محدود هست، یا در جاهای مختلفی این نیاز وجود داره؟ اگر بر فرض در نقاط متعددی به همچین چیزی نیاز دارید، می تونید در هر فرم یک کد بنویسید که وضعیت BiDiMode یک کنترل رو بررسی کنه، و بر اساس همون، متد مورد نظر را برای لود کردن Layout مناسب فراخوانی کنه. اون وقت می تونید اون کد را به رویداد OnEnter هر کدوم از کنترل های اون فرم نسبت بدید.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
نیازی به شبیه سازی کلیدهای صفحه کلید نیست، ActivateKeyboardLayout خودش پارامترهایی برای فعال کردن Layout بعدی و قبلی داره.
بله کاملا درسته راستش قبلش دنبال همچین تابعی گشتم ولی پیدا نکردم برای همین مجبور شدم با شبیه سازی Alt + Shift اینکار رو بکنم و در کل میخواستم نمونه کار باشه که برسونم راه دیگری وجود داره و با کدنویسی کمتر
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
ممنون . من فقط در یکی دومورد نیاز به تغییر زبان دارم.
ولی در ابتدای برنامه زبان رو تغییر میدم. هنگام کار در فرمهای دیگه باز زبان انگلیسی هست باز مجبورم این تابع رو صدا بزنم.؟
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
ولی در ابتدای برنامه زبان رو تغییر میدم. هنگام کار در فرمهای دیگه باز زبان انگلیسی هست باز مجبورم این تابع رو صدا بزنم.؟
LoadKeyboardLayout فقط یک بار برای هر زبان فراخوانی بشه، کافی هست. برای ActivateKeyboardLayout، کدی که من نوشتم، زبان کیبورد کل Process را تغییر میده، ولی بررسی نکردم که آیا در هنگام ایجاد یک فرم، دلفی مجددا خودش زبان فعال فعلی را تغییر میده یا نه؛ اگر میده، مجبورید که در هنگام نمایش هر کدام از فرم ها، یک بار ActivateKeyboardLayout را برای زبان مورد نظرتان فراخوانی کنید.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
ممنون.
الان مشکل اینجاست که وقتی برای اولین بار فرم فراخوانی میشه و من زبان رو فارسی میکنم ، باز روی هر Edit که میاد English هست. یعنی باید در رویداد Onenter یک کامپوننت بنویسم بعد به مابقیشون Bind کنم. که باز مقداری تاخیر در ورود اطلاعات ایجاد میکنه.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
من اومدم یک پروژه جدید با چند تا فرم ایجاد کردم و روی هر کدوم چند تا TEdit قرار دادم. در فرم اصلی وقتی زبان تغییر میکنه در مابقی فرمها مشکلی نیست.
حتی فایل Resource پروژه اصلی خودمو حذف کردم ولی باز هم وقتی زبان تغییر میکنه هر فرمی و هر کامپوننتی باید مجدد زبانش تغییر کنه.
آیا در پروژه باید چیز خاصی رو تنظیم کرد یا...؟
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
کد زیر میتونه برای حل مشکلتان کمک کنه.
بهتره از این روش استفاده کنید و سرعت هم به حداقل میرسه اگه داخل ویندوز 7 مشکلی در مورد زبان ایجاد میشه تنها به خاطر لود مکرر لایه زبان نیست میتونه از فونتها و نحوه paint و repaint کنترلهای ویرایشی هم باشه.
procedure n_SetFocus(keyboard_HKL:HKL; win_handle:HWND);
begin
SetFocus(win_handle);
ActivateKeyboardLayout(keyboard_HKL,KLF_REORDER);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Farsi_HKL := LoadKeyboardLayout('00000429', KLF_ACTIVATE);
Latin_HKL := LoadKeyboardLayout('00000409', KLF_ACTIVATE);
end;
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if key=#13 then
n_Setfocus(Latin_HKL, Edit2.Handle);
end;
میتوانید لایه زبانهای موجود رو داخل یک آرایه بصورت عمومی لیست کنید همانند کد بالا که داخل FormCreate صورت گرفته است و با n_SetFocus به هر کنترلی که برنامه ایجاب میکنه بهش فوکاس کنید مانند مثال این کد که در event مربوط به Edit1KeyPress در بالا قرار داده شده است.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
ممنون.
ولی سوال من هنوز پابرجاست. در دو پروژه چه مواردی میتونند تاثیر گذار باشند.؟
چرا وقتی من یک پروژه جدید ایجاد کردم با چند فرم مختلف ، وقتی در ابتدای برنامه زبان رو تغییر میدم برای کل برنامه تغییر میکنه.
ولی در پروژه دوم وقتی در هر فرم زبان رو تغییر میدم باز روی هر Edit نیز باید اینکار صورت بگیره.
-
1 ضمیمه
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
من یک نمونه ساختم که براتون هم ضمیمش کردم که با 9 خط کدنویسی این مشکل تغییر زبان ویندوز 7 رو حل کردم که دیگه تو تغییر زبان مکثی بوجود نمیاد و سریع عمل میکنه برای تست میتونید بلافاصله که تو edit کلیک کردین تایپ کنید و ممنون میشم نظرتون رو بگین مخصوصا شما جناب آقای کشاورز و حمیدرضا صادقیان . با تشکر
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
ممنون.
دوست عزیز این برنامه شما پیش فرض زبانش فارسی هست و اون دکمه کار خاصی نیز انجام نمیده.
میشه کدش رو قرار بدید.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
یک نکته جالب دیگه ای که بهش برخوردم این هست که در بعضی از فرمها اصلا نیازی نیست زبان رو به فارسی تغییر بدم و همون یک باری که اول سیستم تغییر زبان دادم اون فرم هم درست کار میکنه.
در بعضی از فرمها باید در رویداد Oncreate فرم دوباره زبان رو فارسی کنم. ولی در بعضی از فرمها مجبورم برای هر Edit یک بار زبان رو تغییر بدم.
بااینکه خصوصیات فرمها رو هم دیدم مثل هم هستند.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
دوست عزیز این برنامه شما پیش فرض زبانش فارسی هست و اون دکمه کار خاصی نیز انجام نمیده.
نخیر دوست عزیز وقتی برنامه من رو اجرا میکنید زبان پیشفرض ویندوز برای برنامه من روی EN قرار میگیره و من اومدم تو رویداد OnEnter ادیتم دستور ابتکاری خودم رو قرار دادم تا وقتی فوکوسش میکنید زبان سیستم رو به فارسی تغییر بده و اون دکمه هم که قرار دادم برای این بود که اگه خواستین مدام تغییر زبان ادیت رو تست کنید نیاز نباشه مدام خودتون زبان سیستم رو تغییر بدین و دستورات توی دکمه هم زبان سیستم رو برای برنامه من روی EN تغییر میده اگه هم توجه کنید وقتی روی دکمه برای تغییر زبان به انگلیسی کلیک میکنید به هیچ وجه برنامه فریز نمیشه و سریع عمل تغییر زبان انجام میشه.
نقل قول:
میشه کدش رو قرار بدید.
بله اینم کدی که من تو رویداد OnEnter ادیت نوشتم:
procedure TForm1.Edit1Enter(Sender: TObject);
var
i: Longint;
AList: array [0..9] of Hkl;
b: Longint;
GKLN: array [0..8] of Char;
begin
i := GetKeyboardLayoutList(SizeOf(AList), AList);
for b:=1 to i do begin
GetKeyboardLayoutName(GKLN);
if GKLN='00000429' then GKLN:='FA';
if GKLN<>'FA' then begin
ActivateKeyboardLayout(HKL_PREV ,0);
end else begin
break;
end;end;end;
ضمنا دلیل اینکه تو تابع ActivateKeyboardLayout به جای HKL_NEXT از HKL_PREV استفاده کردم این بود که اگه شما تو ویندوز چه 7 و چه XP زبانهای دیگری رو اضافه کنید با پارامتر HKL_NEXT به مشکل برمیخورین مثلا شما 3 یا 4 تا زبان یا بیشتر رو نصب کرده باشین بین دو زبان گیر میکنید مثلا بین EN و FA پس اگه از HKL_PREV استفاده کنید این مشکل بوجود نمیاد و میشه زبان دیگری رو انتخاب کرد.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
ممنون.
تست کردم خیلی عالی جواب داد.
فقط سوال اینه که چرا با LoadkeyboardLayout اینقدر کند عمل میکنه در صورتی که الان با این دستور کوچکترین مکثی وجود نداره؟
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
من یک نمونه ساختم که براتون هم ضمیمش کردم که با 9 خط کدنویسی این مشکل تغییر زبان ویندوز 7 رو حل کردم که دیگه تو تغییر زبان مکثی بوجود نمیاد و سریع عمل میکنه برای تست میتونید بلافاصله که تو edit کلیک کردین تایپ کنید و ممنون میشم نظرتون رو بگین مخصوصا شما جناب آقای کشاورز و حمیدرضا صادقیان .
این کدی که نوشتید، چه کاری انجام میده؟ من که سورس رو می بینم، شما لیست Keyboard layout های موجود در سیستم رو میگیرید، بعدش در یک حلقه هر کدوم از اونا رو بررسی می کنید که آیا مربوط به زبان فارسی هست یا نه، اگر Layout مربوط به زبان فارسی توی لیست نبود، Layout قبلی رو در لیست Layout های لود شده توسط یک Process، فعال می کنید.
خب این کار بخصوصی نیست، در واقع کد شما همون یک خط فراخوانی ActivateKeyboardLayout هست، و مابقی کد کار خاصی انجام نمیده. البته پیش فرض شما مبنی بر اینکه حتما Layout قبل از Layout فعلی زبان فارسی هست، هم اشتباه هست. البته شاید متوجه این اشکال نشید، چون بالاخره کد شما داره در یک حلقه پیوسته Layout قبلی رو فعال میکنه، و بالاخره اگر زبان فارسی موجود باشه، یکی از این Layout ها مربوط به فارسی میشه.
در واقع اگر کیبورد فارسی در سیستم موجود باشه، فراخوانی LoadKeyboardLayout الزامی نیست، و همون فراخوانی ActivateKeyboardLayout کفایت میکنه.
نقل قول:
فقط سوال اینه که چرا با LoadkeyboardLayout اینقدر کند عمل میکنه در صورتی که الان با این دستور کوچکترین مکثی وجود نداره؟
در پست اولم در همین تاپیک توضیح دادم که پیاده سازی LoadKeyboardLayout در ویندوز سرور 2008 و ویندوز 7 تغییر پیدا کرده. اینکه این تغییر برای چی بوده یا دقیقا چی بوده، رو مایکروسافت اعلام نکرده. اون چیزی که من بهش برخوردم اینه که این تابع در پیاده سازی جدیدش به طور مکرر مقادیری رو از یک کلید رجیستری میخونه که در پیاده سازی های قبلی این کار انجام نمیشد.
نقل قول:
یک نکته جالب دیگه ای که بهش برخوردم این هست که در بعضی از فرمها اصلا نیازی نیست زبان رو به فارسی تغییر بدم و همون یک باری که اول سیستم تغییر زبان دادم اون فرم هم درست کار میکنه.
در بعضی از فرمها باید در رویداد Oncreate فرم دوباره زبان رو فارسی کنم. ولی در بعضی از فرمها مجبورم برای هر Edit یک بار زبان رو تغییر بدم.
بااینکه خصوصیات فرمها رو هم دیدم مثل هم هستند.
این یک بحث دیگه است. یک نمونه پروژه بذارید که بتونه مشکل شما رو باز تولید کنه، و بشه اون رو بررسی کرد.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
این کدی که نوشتید، چه کاری انجام میده؟ من که سورس رو می بینم، شما لیست Keyboard layout های موجود در سیستم رو میگیرید، بعدش در یک حلقه هر کدوم از اونا رو بررسی می کنید که آیا مربوط به زبان فارسی هست یا نه، اگر Layout مربوط به زبان فارسی توی لیست نبود، Layout قبلی رو در لیست Layout های لود شده توسط یک Process، فعال می کنید.
مثل اینکه شما خوب به کد بنده توجه نکردین اگر Layout مربوط به فارسی وجود نداشت همون زبان جاری که بوده انتخاب میشه.
نقل قول:
خب این کار بخصوصی نیست، در واقع کد شما همون یک خط فراخوانی ActivateKeyboardLayout هست، و مابقی کد کار خاصی انجام نمیده. البته پیش فرض شما مبنی بر اینکه حتما Layout قبل از Layout فعلی زبان فارسی هست، هم اشتباه هست. البته شاید متوجه این اشکال نشید، چون بالاخره کد شما داره در یک حلقه پیوسته Layout قبلی رو فعال میکنه، و بالاخره اگر زبان فارسی موجود باشه، یکی از این Layout ها مربوط به فارسی میشه.
همین کد تونست مشکل تغییر زبان ویندوز 7 رو حل کنه کافیه . نه من متوجه بودم و کاملا روش کار کردم و همه اشکالات احتمالی رو در نظر گرفتم برای اینکه باور کنید شما مثلا الان زبان EN و FA رو نصب کردین الان برین تو قسمت Region and Language و دوتا زبان دیگه اضافه کنید حالا با فشردن ALT+SHIFT سمت راست کیبورد مدام بخواین زبان ویندوز رو تغییر بدین که متوجه میشین بین دوتا زبان سیستمتون گیر میفتین و رو زبانهای دیگرتون غیر از اون 2 زبان نمیره که همینطور که میدونید کار ALT+SHIFT سمت راست همون کار HKL_NEXT رو انجام میده ولی وقتی هربار که ALT+SHIFT سمت چپ کیبورد رو فشار میدین بین همه Layoutها جابجا میشین و دیگه اشکال گیر افتادن بین زبانها پیش نمیاد که کارش همون کار HKL_PREV هست برای همین منم از HKL_PREV استفاده کردم که بعدا متوجه شدم مشکل از پارامتر KLF_REORDER تو تابع ActivateKeyboardLayou هست که من به جاش 0 قرار دادم که الان دیگه HKL_PREV یا HKL_NEXT فرقی نمیکنه چون هم به درستی کار میکنه و هم تو کدی که من قرار دادم هدف رسیدن به زبان خاصی هست.
نقل قول:
در واقع اگر کیبورد فارسی در سیستم موجود باشه، فراخوانی LoadKeyboardLayout الزامی نیست، و همون فراخوانی ActivateKeyboardLayout کفایت میکنه.
اگرم فارسی هم در سیستم نصب نباشه باز تابع LoadKeyboardLayout نمیتونه کاری بکنه چون اگرم فارسی رو به لیست Layoutها اضافه کنه چون زبان فارسی نصب نیست فارسی هم به درستی تایپ نمیشه پس حتما باید قبلش کاربر زبان فارسی رو نصب کنه و اگه زبان فارسی نصب بود و فارسی تو قسمت Layoutها نبود اون رو با تابع LoadKeyboardLayout اضافه کنیم و میشه تو اول برنامه چک کرد که اگه فارسی نصب بود و فارسی تو قسمت Layoutهانبود با تابع LoadKeyboardLayout اون رو اضافه کنیم که برای جلوگیری از فریز شدن اون رو تو Thread پیاده کنیم تا کاربر متوجه این موضوع نشه و برای تغییر زبان و جلوگیری از مکث در تغییر زبان از کد من استفاده کنیم.
ضمنا ممنون میشم اگه خودتون تابعی رو که نوشتین تو سورس قرارش بدین و ضمیمش کنید آخه راستش من تابحال با اینجور تابعها کار نکردم (مبتدی ام) و وقتی میارمش تو دلفی به خطا برمیخورم و میخوام تابع شما رو تست کنم. با تشکر
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
اگه زبان فارسی نصب بود و فارسی تو قسمت Layoutها نبود اون رو با تابع LoadKeyboardLayout اضافه کنیم و میشه تو اول برنامه چک کرد که اگه فارسی نصب بود و فارسی تو قسمت Layoutهانبود با تابع LoadKeyboardLayout اون رو اضافه کنیم
توضیح پیچیده ای در مورد تغییر زبان ارسال کردید فقط این قسمت آخر گفتید که لایه رو میخواهید به کجا اضافه کنید!؟
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
توضیح پیچیده ای در مورد تغییر زبان ارسال کردید فقط این قسمت آخر گفتید که لایه رو میخواهید به کجا اضافه کنید!؟
خوب بذارین واضحتر بگم وقتی کاربر فارسی رو نصب کرده باشه ولی FA تو لیست Layoutها یا همون لیست Keyboard های نصب شده در کنار ساعت ویندوز نباشه ما مجبوریم اون رو به اون لیست اضافه کنیم که اگه از کد من استفاده بشه اینکار رو نمیکنه جز همون تابع LoadKeyboardLayout پس اگه از این تابع هم استفاده کنیم باز مشکل فریز و مکث تغییر زبان تو ویندوز 7 اتفاق میفته برای همین گفتم میتونیم تو form1.Create کدنویسی کنیم که لیست تمامی Layoutها رو بگیره و بعدش چک کنیم آیا FA جزو این لیست هست یا نه که اگه نبود از تابع LoadKeyboardLayout برای اضافه کردن FA به لیست Layoutها استفاده کنیم که باز برنامه فریز میشه و کاربر متوجه میشه برای همین گفتم این تابع رو تو Thread پیاده کنیم که برنامه فریز نشه و کاربرم متوجه نشه حالا برنامه ما لود شده و FA هم به لیست اضافه شده پس میتونیم با کد من عمل تغییر زبان رو بدون مکث انجام بدیم.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
ما مجبوریم اون رو به اون لیست اضافه کنیم که اگه از کد من استفاده بشه اینکار رو نمیکنه جز همون تابع LoadKeyboardLayout
ولی اگه نباشه فکر نکنم LoadKeyboardLayout قادر باشه این کار رو انجام بده.
نمونه کد برای اضافه کردن به لیست کنار ساعت رو دارید؟
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
ولی اگه نباشه فکر نکنم LoadKeyboardLayout قادر باشه این کار رو انجام بده.
بله کاملا درسته من همینرو در جواب جناب کشاورز گفتم که اگه فارسی نصب نباشه کاری از دست LoadKeyboardLayout هم بر نمیاد پس حتما کاربر وقتی میخواد از برنامه فارسی استفاده کنه باید زبان فارسی رو هم نصب کنه.
نقل قول:
نمونه کد برای اضافه کردن به لیست کنار ساعت رو دارید؟
بله برای مثال میتونید با این کد زبان عربی رو به لیستتون اضافه کنید.
LoadKeyboardLayout('00000401',KLF_ACTIVATE);
ولی یک مشکلی که این روش داره اینه که درسته زبان مورد نظر به لیست زبان کنار ساعت اضافه میشه ولی این زبان به لیست Keyboard تو Region and Language اضافه نمیشه که اگه کاربر بخواد اون زبان رو حذف کنه باید تو لیست زبانهای Region and Language اون زبان رو پیدا و Add و بعد اون رو حذف کنه تا از لیست کنار ساعتم حذف بشه که این دردسر برای کاربر موجب ناراحتی کاربر میشه.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
با این کد زبان عربی رو به لیستتون اضافه کنید
ممنون
ولی منظور این بود که تو این لیست باقی بمونه!
نقل قول:
ولی یک مشکلی که این روش داره اینه که درسته زبان مورد نظر به لیست زبان کنار ساعت اضافه میشه ولی این زبان به لیست Keyboard تو Region and Language اضافه نمیشه .
این کاری که ما انجام میدیم روش پو.یای استفاده از لایه زبان هست اگه بخواهیم داخل Region and Language هم مشاهده کنیم باید داخل رجیستری پارامترهای زبان ثبت بشه .
نقل قول:
که اگه کاربر بخواد اون زبان رو حذف کنه باید تو لیست زبانهای Region and Language اون زبان رو پیدا و Add و بعد اون رو حذف کنه تا از لیست کنار ساعتم حذف بشه که این دردسر برای کاربر موجب ناراحتی کاربر میشه
اون زبان وجود خارجی نداره فقط توسط برنامه جاری لود شده نیازی به حذف نیست یک بار سیستم ری استارت بشه داخل لیست میاد.
منظور اینه که تا ری استارت یا تنظیمات زبان داخل کنترل پانل آپدیت نشه با کیبورد نمیتونید بهش سویچ کنید.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
ولی منظور این بود که تو این لیست باقی بمونه!
خوب اگه بخواین تو لیست کنار ساعت باقی بمونه با همین تابع LoadKeyboardLayout هم باقی میمونه.
نقل قول:
اون زبان وجود خارجی نداره فقط توسط برنامه جاری لود شده و سایر برنامه ها نمیتونن ازش استفاده کنن.و نیازی به حذف نیست
خیر - اگه نگاه کنید میبینید به اون لیست اضافه میشه و ماندگار میمونه و همه برنامه ها میتونن ازش استفاده کنن و همینطور خود کاربر.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
همین کد تونست مشکل تغییر زبان ویندوز 7 رو حل کنه کافیه .
کد شما مشکلی رو حل نکرد، هر کدی که درش از LoadKeyboardLayout استفاده نشه، اون مشکل ذکر شده رو نداره. همانطور که قبلا هم اشاره کردم، از اون چند خط کد شما، فقط فراخوانی تابع ActivateKeyboardLayout کفایت می کرد، و مابقی اش کد اضافی بود. ActivateKeyboardLayout هم که قبلا صحبتش رو کرده بودیم.
نقل قول:
اگرم فارسی هم در سیستم نصب نباشه باز تابع LoadKeyboardLayout نمیتونه کاری بکنه
من نگفتم اگر فارسی نصب نباشه، بلکه گفتم: "در واقع اگر کیبورد فارسی در سیستم موجود باشه..."، یعنی کیبورد فارسی در تنظیمات کیبورد Keyboards and Languages جزو کیبوردهای موجود در سیستم نباشه.
نقل قول:
خوب بذارین واضحتر بگم وقتی کاربر فارسی رو نصب کرده باشه ولی FA تو لیست Layoutها یا همون لیست Keyboard های نصب شده در کنار ساعت ویندوز نباشه ما مجبوریم اون رو به اون لیست اضافه کنیم که اگه از کد من استفاده بشه اینکار رو نمیکنه جز همون تابع LoadKeyboardLayout پس اگه از این تابع هم استفاده کنیم باز مشکل فریز و مکث تغییر زبان تو ویندوز 7 اتفاق میفته برای همین گفتم میتونیم تو form1.Create کدنویسی کنیم که لیست تمامی Layoutها رو بگیره و بعدش چک کنیم آیا FA جزو این لیست هست یا نه که اگه نبود از تابع LoadKeyboardLayout برای اضافه کردن FA به لیست Layoutها استفاده کنیم که باز برنامه فریز میشه و کاربر متوجه میشه برای همین گفتم این تابع رو تو Thread پیاده کنیم که برنامه فریز نشه و کاربرم متوجه نشه حالا برنامه ما لود شده و FA هم به لیست اضافه شده پس میتونیم با کد من عمل تغییر زبان رو بدون مکث انجام بدیم.
توی Thread؟!! کل معطلی LoadKeyboardLayout (روی سیستم من) در حدود نیم ثانیه هست. برای این نیم ثانیه، که فقط هم یک بار نیاز به اجرا شدن داره، طرف یه Thread بسازه و اجرا کنه؟! در واقع ساخت یک Thread جدید و اجرای اون خودش اونقدر سربار اضافی داره که عملا افزایش سرعت خاصی از اجرای اون تابع در یک Thread مستقل به دست نمیارید. در واقع مکث اون تابع از بسیاری از مکث های حاصل از کوئری ها و کارهای مختلف دیگه در برنامه کمتر هست.
مشکل چیز پیچیده ایی نیست، در چند صفحه قبل هم توضیح دادم، هر برنامه ایی که میخواد تغییر زبان کیبورد رو اعمال کنه، باید اولا از Application.BiDiKeyboard و Application.NonBiDiKeyboard پرهیز کنه، ثانیا، فقط یک بار LoadKeyboardLayout رو فراخوانی کنه، و ثالثا، هر جا نیاز به تغییر زبان داشت، از ActivateKeyboardLayout استفاده کنه. یک کد OOP ساده که این مکانیزم رو در یک کلاس استاتیک پیاده کنه هم قرار دادم. نمیدونم حالا این بحث ها چیه؟
چندتا بحث رو در تاپیک با هم مخلوط کردید؛ بحث اولیه تاپیک اینه بود که در بالا توضیح دادم، بعدش یک عده از کاربران درباره اینکه چطور در زمان نمایش فرم های مختلف این کد تغییر زبان اجرا بشه، سوال کردند. از طرف دیگه، آقای صادقیان درباره اینکه چرا در بعضی از فرم های برنامه اش زبان به طور پیش فرض فارسی هست، سوال کرد، بعد از اون، یک عده از کاربران راه حل هایی برای همون مشکل اولیه ارائه کردند که همگی مبتنی بر همون مورد اول (استفاده از ActivateKeyboardLayout) بود، الان هم که بحث شده چگونگی اضافه کردن کیبورد فارسی به ویندوز!
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
کد شما مشکلی رو حل نکرد، هر کدی که درش از LoadKeyboardLayout استفاده نشه، اون مشکل ذکر شده رو نداره. همانطور که قبلا هم اشاره کردم، از اون چند خط کد شما، فقط فراخوانی تابع ActivateKeyboardLayout کفایت می کرد، و مابقی اش کد اضافی بود. ActivateKeyboardLayout هم که قبلا صحبتش رو کرده بودیم.
ولی من کلا میخواستم یک راه حل برای تغییر زبان ارائه بدم نه اینکه مشکل LoadKeyboardLayout رو رفع کرده باشم.
نقل قول:
من نگفتم اگر فارسی نصب نباشه، بلکه گفتم: "در واقع اگر کیبورد فارسی در سیستم موجود باشه..."، یعنی کیبورد فارسی در تنظیمات کیبورد Keyboards and Languages جزو کیبوردهای موجود در سیستم نباشه.
ببخشید من اشتباه برداشت کردم.
نقل قول:
توی Thread؟!! کل معطلی LoadKeyboardLayout (روی سیستم من) در حدود نیم ثانیه هست. برای این نیم ثانیه، که فقط هم یک بار نیاز به اجرا شدن داره، طرف یه Thread بسازه و اجرا کنه؟! در واقع ساخت یک Thread جدید و اجرای اون خودش اونقدر سربار اضافی داره که عملا افزایش سرعت خاصی از اجرای اون تابع در یک Thread مستقل به دست نمیارید. در واقع مکث اون تابع از بسیاری از مکث های حاصل از کوئری ها و کارهای مختلف دیگه در برنامه کمتر هست.
بله کاملا درسته.
نقل قول:
مشکل چیز پیچیده ایی نیست، در چند صفحه قبل هم توضیح دادم، هر برنامه ایی که میخواد تغییر زبان کیبورد رو اعمال کنه، باید اولا از Application.BiDiKeyboard و Application.NonBiDiKeyboard پرهیز کنه، ثانیا، فقط یک بار LoadKeyboardLayout رو فراخوانی کنه، و ثالثا، هر جا نیاز به تغییر زبان داشت، از ActivateKeyboardLayout استفاده کنه. یک کد OOP ساده که این مکانیزم رو در یک کلاس استاتیک پیاده کنه هم قرار دادم. نمیدونم حالا این بحث ها چیه؟
چندتا بحث رو در تاپیک با هم مخلوط کردید؛ بحث اولیه تاپیک اینه بود که در بالا توضیح دادم، بعدش یک عده از کاربران درباره اینکه چطور در زمان نمایش فرم های مختلف این کد تغییر زبان اجرا بشه، سوال کردند. از طرف دیگه، آقای صادقیان درباره اینکه چرا در بعضی از فرم های برنامه اش زبان به طور پیش فرض فارسی هست، سوال کرد، بعد از اون، یک عده از کاربران راه حل هایی برای همون مشکل اولیه ارائه کردند که همگی مبتنی بر همون مورد اول (استفاده از ActivateKeyboardLayout) بود، الان هم که بحث شده چگونگی اضافه کردن کیبورد فارسی به ویندوز!
راستش کلا قصد کمک و ارائه راه حل برای تغییر زبان سیستم بوده نه اسپم کردن و بحث الکی که اگه اینطوره بنده از اینجا از شما عذرخواهی میکنم.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
راستش کلا قصد کمک و ارائه راه حل برای تغییر زبان سیستم بوده نه اسپم کردن و بحث الکی که اگه اینطوره بنده از اینجا از شما عذرخواهی میکنم.
من همچین برداشتی نکردم که شما یا دیگران که در این تاپیک بحث می کنند، در حال بحث الکی هستند، بلکه گفتم به طور کلی، چند بحث هم زمان داره در تاپیک مطرح میشه، که این موجب سردرگمی مباحث تاپیک میشه، و بهتره هر کدوم از اونها در تاپیک مستقلی بحث بشند.
موفق باشید
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
نقل قول:
یک کد OOP ساده که این مکانیزم رو در یک کلاس استاتیک پیاده کنه هم قرار دادم
ممنون از پاسخگویی تمام دوستان.
آقای کشاورز عزیز من ابتدا کدی که شما زحمت کشیدید رو تست کردم ولی متاسفانه باز همون مقدار تاخیر وجود داشت. عرض کردم من این مواردی که داره توی این پروژه پیاده میشه رو در یک پروژه جدید با هرروشی تست کردم مشکلی مشاهده نکردم.
ولی در این پروژه هنوز نفهمیدم چرا در بعضی از فرمها باید برای تک تک کامپوننتها زبان رو تغییر بدم در صورتی که در بعضی از فرمها در ابتدای همون فرم کفایت میکنه.
من همین تغییر زبان رو ابتدا با کد شما تست کردم که نتیجه اش رو هم اعلام کردم که باز همون مقدار مکث در تغییر زبان وجود داشت.
ولی وقتی از کد دوم با همون مکانیزم قبلی استفاده کردم اون مکث خیلی کوتاه هم مرتفع شد.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
سلا م
منم در پروژه كه داشتم وقتي از دلفي 7 سوئيچ كردم رو به 2010 دقيقا همين مشكل بود در بعضي از فرمها زبان عوض ميشد با دنبال كردن كد رسيدم به اين نتيجه كه فرمهايي كه dbgrid دارند اين مشكل پيش مياد
procedure TCustomDBGrid.WMKillFocus(var Message: TMessage);
begin
ImeName := Screen.DefaultIme;
ImeMode := imDontCare;
inherited;
if not ((InplaceEditor <> nil) and
(HWND(Message.WParam) = InplaceEditor.Handle)) then
ActivateKeyboardLayout(Screen.DefaultKbLayout, KLF_ACTIVATE);
بعد كد به شكل زير تغيير داد م
procedure TCustomDBGrid.WMKillFocus(var Message: TMessage);
var kblayout: HKL;
begin
kblayout := GetKeyboardLayout(0);
ImeName := Screen.DefaultIme;
ImeMode := imDontCare;
inherited;
if not ((InplaceEditor <> nil) and
(HWND(Message.WParam) = InplaceEditor.Handle)) then
ActivateKeyboardLayout(kblayout, KLF_ACTIVATE);
end;
فايل به پروژه اضافه كنيد ودوباره كامپايل كنيد
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
ممنونم.ولی در فرمهایی که بهم میریزه من دارم از String Grid استفاده میکنم و با نگاه به کد اون یک همچین موردی رو نیافتم.
یعنی در WmKillFocus در داخل TCustomGrid یک همچین کدی نوشته نشده و کاری با ActivateKeyboardLayout نداره.
-
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
سلام و خسته نباشید خدمت دوستان عزیز
این تاپیک تقریبا چند منظوره شده ولی بی دلیل هم نیست چون هم در مورد زبان برنامه هستش و هم در مورد سرعت اجرای برنامه ...
چند دقیقه قبل در تاپیک زیر پست دادم
https://barnamenevis.org/showthread.php?292571
من هم همین صحبت عوض شدن زبان ها رو در ویندوز 7 و دلفی 2010 بیان کردم که رفتاری نا معلوم داره اما مشخصه که فعلا این رو متوجه شدیم که این رفتار
با کامپوننت DBGrid درگیره...
ممنون میشم که اگه کسی میتونه پایداری زبان رو از ابتدای اجرای برنامه تا خاتمه برنامه تضمین کنه به ما هم یاد بدن...
موفق باشید.
-
1 ضمیمه
نقل قول: کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7
ظاهرا توی پست دادن و بیان ایرادم عجله کردم ...
با توجه به چند پست بالاتر و با توجه به حرفهایی که توی دو تا Page زیر دیدم متوجه شدم که برای DBGrid باید یک کامپوننت ساخت و Procedure با عنوان Windows Message برای اون در قسمت Protection درج کرد که در موقع خروج یا OnExit در DBGrid برنامه ما دچار تغییر زبان نشود. کد اون Package رو براتون قرار دادم که خدا کنه مشکلتون با این رفع بشه چون مال من در ظاهر رفع شده...
تا ببینیم این نرم افزار های 2003 به بعد چه خواب دیگری برای ما دیدن ...
لینک اول
لینک دوم
کامپوننت تغییر داده شده :
unit TDBGridNotChangeFarsiOnExit;
interface
uses
SysUtils, Classes, Controls, Grids, DBGrids, Messages, Windows;
type
TDBGridNotChangeLanguage = class(TDBGrid)
private
{ Private declarations }
protected
{ Protected declarations }
procedure WMKillFocus(var Message: TMessage); message WM_KILLFOCUS;
public
{ Public declarations }
published
{ Published declarations }
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Samples', [TDBGridNotChangeLanguage]);
end;
procedure TDBGridNotChangeLanguage.WMKillFocus(var Message: TMessage);
var
layout: THandle ;
begin
layout := GetKeyboardLayout(0);
//inherited;
ActivateKeyboardLayout($429,0);
end;
end.
موفق باشید.