View Full Version : مشکل با LoadKeyboardLayout
حمیدرضاصادقیان
سه شنبه 23 آذر 1389, 11:08 صبح
سلام دوستان. من با استفاده از این تابع زبان keyBoard رو تغییر میدادم.
از وقتی از دلفی 7 به 2010 کوچ کردم نمیتونم ازش جواب بگیرم. البته این نکته رو هم اشاره کنم مقدار بازگشتی این تابع صفر نیست و مقدار زبان مورد نظر رو برمیگردونه.
من این تابع رو در فرم ابتدایی برنامه صدا میزنم در همون فرم درست کار میکنه که ولی وقتی به فرمهای دیگه برنامه میرم جواب نمیگیرم.قبلا با همین شیوه به درستی کار میکرد و برنامه هایی که با دلفی 7 کامپایل شدند این مشکل رو ندارند ولی برنامه هایی که با 2010 کامپایل شدند به این مشکل برخوردند.
آیا در 2010 باید کار خاصی صورت بگیره؟
ممنون
hossein_h62
سه شنبه 23 آذر 1389, 12:24 عصر
سلام جناب صادقیان
در دلفی 2010 و ویندوز xp مشکلی نداره.
ویندوز 7 استفاده میکنید ؟
حمیدرضاصادقیان
سه شنبه 23 آذر 1389, 12:55 عصر
سلام. بله دلفی روی ویندوز 7 نصبه. ولی همین Exe رو روی سیستمهای دیگه هم اجرا میکنم که XP هستند بازم مشکل پابرجاست
yalameh
سه شنبه 23 آذر 1389, 13:00 عصر
من از دستورات زير در سورس پروژه استفاده مي كنم . تا حالا توي XP مشكلي نداشتم . منوي project - گزينه view source
Application.Initialize;
...
Application.BiDiKeyboard := '00000429';
Application.NonBiDiKeyboard := '00000409';
...
Application.Run;
حمیدرضاصادقیان
سه شنبه 23 آذر 1389, 13:49 عصر
حل شد. ولی برام جالبه چرا با این کد مشکل داره. میخوام ببینم مهاجرت از 7 به 2010 باعث این اشکال شده؟
vcldeveloper
سه شنبه 23 آذر 1389, 13:58 عصر
مشکلی در ویندوز 7 با یک فرم یا چند فرم نداره. LoadKeyboardLayout شیوه دریافت ورودی در کل Process را تغییر میده، نه صرفا یک فرم خاص.
procedure SetPersianKeyboardLayout;
const
Persian_KB_Layout = '00000429';
begin
if LoadKeyboardLayout(Persian_KB_Layout,KLF_ACTIVATE) = 0 then
RaiseLastOSError;
end;
حمیدرضاصادقیان
سه شنبه 23 آذر 1389, 15:12 عصر
مشکلی در ویندوز 7 با یک فرم یا چند فرم نداره. LoadKeyboardLayout شیوه دریافت ورودی در کل Process را تغییر میده، نه صرفا یک فرم خاص.
ممنون. این مورد رو بهش واقفم. من فقط شرایط ایراد رو مطرح کردم که بدون تغییر خاصی در کد و با مهاجرت از دلفی 7 به 2010 این اتفاق افتاد. بعد در فرم ورودی که همون موقع ما این تغییر رو انجام میدیم Keyboard فارسی میشه و هیچ مشکلی هم نیست. ولی وقتی وارد نرم افزار می شویم دیگه به انگلیسی برمیگرده. الان با تغییر روش و استفاده از روش پست 4 مشکل حل شد ولی همچنان سوال من بدون جواب باقی ماند چرا این اتفاق افتاده.؟
چون کد شما هم خطایی برنگردوند. من یک بار فقط این تابع رو در زمان ورود به سیستم برای تغییر زبان Keyboard صدا میزنم و همونجا هم مقدارش غیر صفر هست. ولی وقتی وارد برنامه میشوم ظاهرا باز به حالت قبل برمیگرده.به چه علتی نمیدونم؟؟
ولی وقتی از کد شماره 4 استفاده کردم دیگه مشکلی وجود نداره.
ممنون.
vcldeveloper
سه شنبه 23 آذر 1389, 16:36 عصر
این مورد رو بهش واقفم. من فقط شرایط ایراد رو مطرح کردم که بدون تغییر خاصی در کد و با مهاجرت از دلفی 7 به 2010 این اتفاق افتاد. بعد در فرم ورودی که همون موقع ما این تغییر رو انجام میدیم Keyboard فارسی میشه و هیچ مشکلی هم نیست. ولی وقتی وارد نرم افزار می شویم دیگه به انگلیسی برمیگرده. الان با تغییر روش و استفاده از روش پست 4 مشکل حل شد ولی همچنان سوال من بدون جواب باقی ماند چرا این اتفاق افتاده.؟
مشکل از LoadKeyboardLayout نیست، چون وفتی با استفاده از این تابع Layout فعال را تغییر میدید، در کل برنامه ثابت باقی می مانه، حتی در فرم های مختلف. محض اطمینان، حالتی مشابه فرم لاگین و سپس نمایش فرم اصلی را هم امتحان کردم، و به درستی کار کرد، پس احتمالا چیزی در کدهای شما ست که موجب تغییر رفتار میشه، نه LoadKeyboardLayout.
حمیدرضاصادقیان
دوشنبه 29 آذر 1389, 09:22 صبح
مشکل از LoadKeyboardLayout نیست، چون وفتی با استفاده از این تابع Layout فعال را تغییر میدید، در کل برنامه ثابت باقی می مانه، حتی در فرم های مختلف. محض اطمینان، حالتی مشابه فرم لاگین و سپس نمایش فرم اصلی را هم امتحان کردم، و به درستی کار کرد، پس احتمالا چیزی در کدهای شما ست که موجب تغییر رفتار میشه، نه LoadKeyboardLayout.
متاسفانه ایراد عجیبی است . همچنان مشکل پابرجاست. جالب اینجاست که در بعضی از فرمهای خاص این اتفاق میافته.جالبتر هم این هست وقتی فرم مذکور باز میشه اگر یک حرفی رو بزنید اول انگلیسی هست و اگر روی یک edit کلیک کنید و دوباره اون حرف رو بزنید فارسی نمایش میده.آیا در فرمها تنظیمات خاصی باید صورت بگیره؟ آیا وقتی فرم نمایش داده میشه و روی هیچ Edit ما Focus نکردیم نباید زبان کیبورد فارسی باشه؟ چون وقتی کاربر داره روی Dbgrid یک حرف رو میزنه میخواد جستجو کنه ولی انگلیسی هست و حتما باید در Edit موجود در صفحه کلیک کنه تا زبان فارسی بشه.
آیا وقتی از تابع LoadKeyboardLayout استفاده میکنیم حتما باید در زمان اجرای برنامه باشه یا میشه در وسط برنامه تغییر داد؟
کدی هم که من نوشتم این هست:
var kbCOde : LongWord;
kbString : Array[0..9] of char;
begin
kbCode := (SUBLANG_DEFAULT shl 10) or LANG_FARSI;
StrPCopy(kbString, IntToHex(kbCode, 8));
LoadKeyboardLayout(@kbString, KLF_ACTIVATE);
ممنون
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.