-
نقل قول: کندی 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.
موفق باشید.