PDA

View Full Version : کندی Application کامپایل شده با دلفی 2010 روی ویندوز 7



حمیدرضاصادقیان
چهارشنبه 31 فروردین 1390, 10:21 صبح
سلام.
یک Application که با 2010 هست رو من روی ویندوزهای مختلف تست کردم.سرعتش خوبه. ولی روی 7 به شدت کند کار میکنه. Config سیستمها هم از لحاظ سخت افزاری خوب هستند.آیا میتونه به تنظیمات Compiler ارتباطی داشته باشه؟ یا راه حل دیگری برای اون وجود داره.
من روی ویندوزهای xp,Vista تست کردم و سرعتش خیلی عالیه ولی همون برنامه روی ویندوز 7 خیلی کند کار میکنه.تمامی منوها با تاخیر باز می شوند.
ممنون

vcldeveloper
چهارشنبه 31 فروردین 1390, 12:59 عصر
یک نمونه سورس کد بذارید که مشکل شما رو reproduce کنه.

nilidelphi
چهارشنبه 31 فروردین 1390, 13:40 عصر
دوست گرامی منم دقیقا مشکل شمارو داشتم وبه این نتیجه رسیدم که پروژه های دلفی ای که در ویندوزی غیر از ویندوز 7 ایجاد شده و کامپایل شدن سرعت انجام عملیاتشون در برخی از کامپوننت ها مثل : چک باکس،رادیوباتن و تب کنترل خیلی کمه.
اگه حرفمو قبول نداری همون برنامرو با دلفی 2009 یا بیشتر تو خود ویندوز 7 ایجاد کن و از اول بنویس به حرفی که گفتم میرسی.

موفق باشید.

حمیدرضاصادقیان
چهارشنبه 31 فروردین 1390, 14:23 عصر
ممنون.
این نرم افزار سیستم مالی هست که با دلفی 7 توسعه داده شده و در ویندوز XP روی آن کار شده است.
که من اونو به نسخه 2010 آوردم. و از زمانی که روی ویندوز 7 دارم کار میکنم به این مشکل برخورده.جالبه که EXE برنامه فقط روی ویندوز 7 کند کار میکنه و روی ویندوزهای دیگه اصلا مشکلی نداره.

Felony
چهارشنبه 31 فروردین 1390, 14:25 عصر
اگه حرفمو قبول نداری همون برنامرو با دلفی 2009 یا بیشتر تو خود ویندوز 7 ایجاد کن و از اول بنویس به حرفی که گفتم میرسی.
از اول بنویسه یا از اول کامپایل کنه ؟ اگر بگی کامپایل میشه قبول کرد ولی در مورد نوشتن برنامه از اول مگر سورس ذخیره شده در دو ویندوز متفاوت با هم فرق میکنه ؟!

ژوپیتر
چهارشنبه 31 فروردین 1390, 14:37 عصر
به نظر من ابتدا یک VMware نصب کنید و همه ویندوزها رو با مشخصات سیستم یکسان در اون نصب کنید و بعد تست کنید. من تابه حال برنامه های زیادی نوشتم که توی همه ویندوزها و سیستم های مختلف کار کرده و به مشکلاتی هم بر خوردم که شبیه همین مورد بوده، بعضی از سیستم ها با little endian و big endian مشکل دارند و بار اضافی بهشون اعمال میشه در زمان اجرا و یا با 32 بیت و 64 بیت شدن،باید این مورد و مواردی مثل این رو در نظر داشت. من کدی رو توی Delphi 7 اجرا میکردم، روی PC خونه شمارنده از 0 تا 99 میشمرد ولی روی لپتاپ از 99 تا 0 میشمرد که بعدها متوجه شدم که از معماری CPU شرکت اینتل بوده. تغییر در معماری کامپیوتر از اصلی ترین موارده که حتی سیستمهای multi-thread رو هم در بر میگیره.
مطمئن بشید که از دو سیستم یکسان با XP و 7 استفاده میکنید.

موفق باشید.

nilidelphi
چهارشنبه 31 فروردین 1390, 21:32 عصر
نه دوست عزیز من امتحان کردم باید از اول نوشت. تنها با کامپایل کردن درست نمیشه.

من فکر می کنم چون نحوهی ساخت ابزار ویژوال تو ویندوز7 با ویندوزهای قبلی فرق می کنه واسه همین خاطره وگرنه هیچ مشکل دیگه ای نمیتونه داشته باشه.

Felony
چهارشنبه 31 فروردین 1390, 21:55 عصر
نه دوست عزیز من امتحان کردم باید از اول نوشت. تنها با کامپایل کردن درست نمیشه.

من فکر می کنم چون نحوهی ساخت ابزار ویژوال تو ویندوز7 با ویندوزهای قبلی فرق می کنه واسه همین خاطره وگرنه هیچ مشکل دیگه ای نمیتونه داشته باشه.
اشتباه فکر میکنی !
یعنی چی که نحوه ساخت ابزار ویژوال فرق میکنه ، در هر صورت شما با نوشتن برنامه هیچ کاری به جز ذخیره چند تا فایل متنی نمیکنی ! اون وقت چیه این فایل میتونه روی 2 سیستم عامل مختلف تغییر کنه ؟ برنامه وقتی برنامه میشه که کامپایل بشه ؛ تنها به 2 چیز میشه شک کرد یکی تنضیمات ذخیره شده در پروژه و دیگری فایل ریسورس هست ، قبل از کامپایل تنضیمات رو بررسی کنید و فایل های dcu کامپایل شده و فایل ریسورس رو حذف و برنامه رو سیستم عامل مورد نظر کامپایل کنید .

tdkhakpur
چهارشنبه 31 فروردین 1390, 23:08 عصر
اشتباه فکر میکنی !


خیلی هم درست فکر کرده!
ابزارهای gdi و یا به قولی ابزارای طراحی ویژال در ویندوز 7 میتونه متفاوت باشه و سرعت paintو repaint متفاوتی با سایر ویندوزها داشته باشه که در این برنامه خودش رو نشون داده .
اما در حالت کلی این میتونه ارتباطی با تنظیمات کارت گرافیکی هم داشته باشه و ارتباطی با کامپایل مجدد و کارهای از این دست ندارد.

Felony
چهارشنبه 31 فروردین 1390, 23:21 عصر
خیلی هم درست فکر کرده!
ابزارهای gdi و یا به قولی ابزارای طراحی ویژال در ویندوز 7 میتونه متفاوت باشه و سرعت paintو repaint متفاوتی با سایر ویندوزها داشته باشه که در این برنامه خودش رو نشون داده .
اما در حالت کلی این میتونه ارتباطی با تنظیمات کارت گرافیکی هم داشته باشه و ارتباطی با کامپایل مجدد و کارهای از این دست ندارد.
:قهقهه: اصلا میدونی چی میگی ؟!
الان یه سورس دلفی باز کن ، این ابزارهای gdi کجای سورس آورده شده که شما وقتی از اول برنامه رو مینویسی تغییر میکنه ؟! ایشون میگه برنامه رو از اول بنویس ، یعنی یه چیزهایی داخل فایل های سورس ( pas , dpr , dfm ) ذخیره میشه دیگه ، حالا شما بگو این ابزارهای gdi کجای این فایل ها ذخیره میشن ما هم بدونیم !

BORHAN TEC
چهارشنبه 31 فروردین 1390, 23:27 عصر
این مشکل فقط مربوط به دلفی نیست. من حتی در مورد برنامه هایی که با دات نت هم ایجاد شده اند این مشکل را دیده ام. راستی یک سوال، ویندوز 7 شما چند بیتی است؟؟؟

a_mosavian
چهارشنبه 31 فروردین 1390, 23:49 عصر
:قهقهه: اصلا میدونی چی میگی ؟!
الان یه سورس دلفی باز کن ، این ابزارهای gdi کجای سورس آورده شده که شما وقتی از اول برنامه رو مینویسی تغییر میکنه ؟! ایشون میگه برنامه رو از اول بنویس ، یعنی یه چیزهایی داخل فایل های سورس ( pas , dpr , dfm ) ذخیره میشه دیگه ، حالا شما بگو این ابزارهای gdi کجای این فایل ها ذخیره میشن ما هم بدونیم !
اصلا به سابقه تون نمی خوره که هیچی درباره معماری ویندوز و GDI ندونید!

BORHAN TEC
پنج شنبه 01 اردیبهشت 1390, 00:42 صبح
اصلا به سابقه تون نمی خوره که هیچی درباره معماری ویندوز و GDI ندونید!
لطفاً به این کل کل ها خاتمه دهید، چون این بحث ها بی ربط با موضوع تاپیک است. مسائلی در مورد GDI و معماری ویندوز در فایلهای پروژه مانند فایلهای pas، dpr، dfm ذخیره نمی شوند.

vcldeveloper
پنج شنبه 01 اردیبهشت 1390, 01:17 صبح
لطفا بحث های زاید نکنید، و راه حل شانسی هم ارائه نکنید!

برای اینکه بشه یک مشکل رو با کمک دیگران ارزیابی کرد، باید مشکل شما توسط سایرین قابل بازتولید (reproducible) باشه، برای اینکه بتونید اون رو برای دیگران قابل بازتولید کنید، باید بتونید محدوده مشکل رو کوچیک کنید. یک برنامه مالی ممکنه توش از کامپوننت های مختلف طرف ثالث، یا کدهای مختلف نوشته شده توسط شما، استفاده شده باشه، که هر کدومشون به نوعی با برخی سرویس های ویندوز درگیر هستند، و نسخه ویندوز میتونه روی اونها تاثیر منفی یا مثبت بذاره.

اگر نتونستید، یا نخواستید، مشکل رو در یک پروژه ساده باز تولید کنید، باید خودتون وقت بذارید و با ابزارهای Profiling و مانیتورینگ مختلف، رفتار برنامه در دو سیستم رو بررسی و با هم مقایسه کنید، تا ببینید چه تفاوت هایی در رفتارشون هست، و کدومیک از این تفاوت ها زمان بیشتری رو به خودش اختصاص میده.

tdkhakpur
پنج شنبه 01 اردیبهشت 1390, 01:39 صبح
:قهقهه: اصلا میدونی چی میگی ؟!

مشکلت اینه که تازه کار تشریف دارید.


الان یه سورس دلفی باز کن ، این ابزارهای gdi کجای سورس آورده شده که شما وقتی از اول برنامه رو مینویسی تغییر میکنه ؟! ایشون میگه برنامه رو از اول بنویس ، یعنی یه چیزهایی داخل فایل های سورس ( pas , dpr , dfm ) ذخیره میشه دیگه ، حالا شما بگو این ابزارهای gdi کجای این فایل ها ذخیره میشن ما هم بدونیم

:لبخندساده:
ببین قرار نیست همه چی رو بصورت سورس ببینید یا خودتان uses کرده باشید خیلی از توابع و متدهای هستند که از خود سیستم عامل استفاده میکنند مثل gdi32.dll که ابزارهای لازم رو برای کارت گرافیکی فراهم میاره و لزما همه چی یک کتابخونه نیست که به exe بچسبه
و یا یکسری از کنترلهای دیگه که میتونه ارتباط سخت افزار مثلا ا ram رو فراهم کنه و خیلی چیرهای دیگه.
خواهشا وقتی چیزی در موردی مطلبی نمیدونید یا بپرسید ویا اینکه یک پیش زمینه ای داشته باشید تا بیخودی مطالب ارسالی دیگران رو مورد مضحکه ندانسته های خودتان قرار ندید.

Felony
پنج شنبه 01 اردیبهشت 1390, 02:37 صبح
اصلا به سابقه تون نمی خوره که هیچی درباره معماری ویندوز و GDI ندونید!
خوب به سابقم نگاه نکنید ، توضیح بدید که وقتی کد رو از اول مینویسید چی میشه که این مشکل درست میشه تا افرادی مثل من هم یاد بگیرند .

یک بار دیگه پست ها رو بخون ، سورس کد چیزی نیست به جز یکسری متن که در فایلهایی متنی در غالب pas و dpr و ... ذخیره میشه ، نه بیشتر نه کمتر ، نوشتن دوباره برنامه هیچ تفاوتی در روند اجرای اون نداره .


مشکلت اینه که تازه کار تشریف دارید.

:لبخندساده:
ببین قرار نیست همه چی رو بصورت سورس ببینید یا خودتان uses کرده باشید خیلی از توابع و متدهای هستند که از خود سیستم عامل استفاده میکنند مثل gdi32.dll که ابزارهای لازم رو برای کارت گرافیکی فراهم میاره و لزما همه چی یک کتابخونه نیست که به exe بچسبه
و یا یکسری از کنترلهای دیگه که میتونه ارتباط سخت افزار مثلا ا ram رو فراهم کنه و خیلی چیرهای دیگه.
خواهشا وقتی چیزی در موردی مطلبی نمیدونید یا بپرسید ویا اینکه یک پیش زمینه ای داشته باشید تا بیخودی مطالب ارسالی دیگران رو مورد مضحکه ندانسته های خودتان قرار ندید.

خوشم میاد از انکار به جواب میرسی ؛ بابا IQU ، الان به من و شما چه که GDI چی کار میکنه ؟ تو الان تو XP مثلا مینویسی Canvas.Rectangle خوب الان وقتی میای این رو تو 7 مینویسی چه فرقی میکنه ؟ پیاده سازی اون تو بر سورس برنامه تغییر میکنه ؟ 1000 ی هم پیاده سازی GDI تو دو ویندوز با هم تفاوت داشته باشه موقع کامپایل کتابخانه ها الحاق میشن و فایل باینری خروجی این تغییرات رو به ارث میبره نه سورس ؛ به قول خودت توابع gdi32 ؛ به من و شما چه که چه طور پیاده سازی شدن ؟ شما به عنوان یک تابع داری ازش استفاده میکنی و ویندوز اون رو در پشت صحنه پیاده کرده ؛ این رو بفهم اون کتابخانه ها قبلا نوشته شدن و به سورس تو ربطی ندارن !

nilidelphi
پنج شنبه 01 اردیبهشت 1390, 12:21 عصر
دوستان شما چرا دارید مسئله رو به حاشیه می کشید.

دوست عزیز آقای تاجیک من نگفتم سورس رو دویاره بنویسن؟؟؟ من گفتم یه پروژه ی دیگه باز کنند تا از اول برنامه رو بنویسن.

درضمن اگه کامپایلر خودش رو الحاق می کنه با تغییرات جدید پس چرا یه برنامه که از رشته های غیر یونیکد استفاده کرده وقتی می آید تو مثلا دلفی 2009 برای این دسته از متغییر ها ایراد میگیره؟

این مشکل در تمامیه زبان های نیتیو وجود داره حتی C++ پس متوجه میشیم که مشکل در زبان ها نیست بلکه در سیستم عامل و طریقه ی تولید ابزار گرافیگی است.
در ضمن در جواب دوستمان آقای عشایری بگم که این مشکل نمیتونه تو دات نت وجود داشته باشه چون دات نت خود یه پلت فرمه.
در ضمن به 64 بیت بوده یا 32 بیت بودن هم ربطی نداره.

راستی من یه جایی خوندم که ویندوز 7 یک سری از ابزار هارو به جای CPU تو GPU پردازش می کنه شاید ایراد از این باشه که اگه برنامه قبلا تو XP کامپایل شده چون پردازش ابزار گرافیکی رو به CPU میفرسته پس سرعتش در 7 فرق میکنه.

در ضمن خطاب به دوست عزیز آقای تاجیک اگه گفته ی شما در مورد فایل های ریسورس پروژه درسته پس چرا بعضی از ابزار های ویژوال کند هستند و بعضی کار عادی انجام میدن؟ مثلا ابزار های مربوط به منوها و توول بار ها در سرعتشان هیچ فرقی نمی کنند؟؟؟؟

Felony
پنج شنبه 01 اردیبهشت 1390, 13:31 عصر
دوستان شما چرا دارید مسئله رو به حاشیه می کشید.
بحث حاشیه ای نیست ، داریم بحث میکنیم ببینیم راه حل ارائه شده درست هست یا نه .


دوست عزیز آقای تاجیک من نگفتم سورس رو دویاره بنویسن؟؟؟ من گفتم یه پروژه ی دیگه باز کنند تا از اول برنامه رو بنویسن.
اولا الان بحث سر صحبت 2 تا از دوستان هست که نظرشون این هست که کد باید از اول نشوته بشه ؛ دوما یک پروژه دیگه باز کنید یعنی چی ؟ یعنی این اطلاعات در جایی ذخیره شده دیگه ، اونجا کجاست ؟


درضمن اگه کامپایلر خودش رو الحاق می کنه با تغییرات جدید پس چرا یه برنامه که از رشته های غیر یونیکد استفاده کرده وقتی می آید تو مثلا دلفی 2009 برای این دسته از متغییر ها ایراد میگیره؟
با اصل تابع نوشتن و کلاس نوشتن آشنایی دارید ؟ شما برای چی یک تابع مینویسید و ازش استفاده میکنید ؟ غیر از این هست که از تکرار کد جلوگیری بشه و اگر خواستید برنامه رو تغییر بدید لازم به کار اضافی نباشه و فقط تابع رو تغییر بدید ؟ خوب توابع ویندوز از این قاعده مستثنی هستند ؟

درسته که پیاده سازی GDI در دو ویندوز XP و 7 با هم متفاوت هست ولی تو طراحی GUI معمولی به شما مربوط نمیشه ، اگر اشکال رفع نمیشد میشد گفت Embarcadero این توابع رو درست پیاده سازی نکرده یا ... ، ولی شما میگی مشکل رفع میشه پس مشکل از دلفی هم نیست ، اون توابع هم که جز کتابخانه های خود دلفی هستند و شما تو هر سیستم عاملی برنامه رو کامپایل کنید بر اساس اون سیستم عامل از توابع gdi32.dll استفاده میشه !

فرض کنید تابع زیر در کتابخانه gdi32.dll در ویندوز XP قرار داره :
Procedure Test(S: String);
begin
ShowMessage(S);
end;
با صدا زدن تابع متنی که به عنوان پارامتر به تابع ارجاع داده شده نمایش داده میشه ، درسته ؟ حالا فرض کنید این تابع در ویندوز 7 به شکل زیر تغییر پیدا کرده :
Procedure Test(S: String);
begin
ShowMessage(S +'test');
end;
حالا با صدا زدن این تابع رشته test به پارامتر ورودی الحاق میشه و بعد نمایش داده میشه ، حالا این پیاده سازی که تو Dll هست به برنامه شما چه ربطی داره ؟ شما داری فقط ازش استفاده میکنی .

دیگه موندم چه طور بگم ...


راستی من یه جایی خوندم که ویندوز 7 یک سری از ابزار هارو به جای CPU تو GPU پردازش می کنه شاید ایراد از این باشه که اگه برنامه قبلا تو XP کامپایل شده چون پردازش ابزار گرافیکی رو به CPU میفرسته پس سرعتش در 7 فرق میکنه.
شما که میگی از کامپایل نیست و باید یک پروژه دیگه ایجاد بشه !


در ضمن خطاب به دوست عزیز آقای تاجیک اگه گفته ی شما در مورد فایل های ریسورس پروژه درسته پس چرا بعضی از ابزار های ویژوال کند هستند و بعضی کار عادی انجام میدن؟ مثلا ابزار های مربوط به منوها و توول بار ها در سرعتشان هیچ فرقی نمی کنند؟؟؟؟
کدوم گفته ؟ من گفتم اگر قرار باشه ایراد از پروژه باشه ممکنه تنضیماتی تو فایل های کامپایل شده ( dcu و ... ) یا ریسورس پروژه باشه که موجب بروز این مشکل میشه ؛ قبل از دادن پست متن رو دقیقا بخونید و سریع موضع نگیرید .

BORHAN TEC
پنج شنبه 01 اردیبهشت 1390, 13:39 عصر
در ضمن در جواب دوستمان آقای عشایری بگم که این مشکل نمیتونه تو دات نت وجود داشته باشه چون دات نت خود یه پلت فرمه.

من گفتم که نمونه این مشکل رو در دات نت هم دیده ام. در ضمن توجه داشته باشید که این موضوع چندان هم بی ارتباط با موضوع نیست، چون همانطور که می دانید پلت فرم .net هم برای این که کارش را به درستی انجام دهد به یک سیستم عامل نیاز دارد و در اینجا هم منظور من ویندوز است. به هر حال به نظر من شاید این موضوع هم در این مورد دخیل باشد! :متفکر:

در ضمن به 64 بیت بوده یا 32 بیت بودن هم ربطی نداره.

چرا ربطی نداره؟ آیا شما در مورد این ادعای خود دلایل محکمه پسندی دارید که ما از آن بی اطلاع هستیم؟؟؟ :متفکر: اگر به این راحتی و بدون دلایل محکم می گویید که فلان چیز دلیلش چیست، پس لطفاً بگویید که چگونه باید این مشکل را برطرف کرد؟؟؟

tdkhakpur
پنج شنبه 01 اردیبهشت 1390, 13:51 عصر
شما به عنوان یک تابع داری ازش استفاده میکنی و ویندوز اون رو در پشت صحنه پیاده کرده ؛ این رو بفهم اون کتابخانه ها قبلا نوشته شدن و به سورس تو ربطی ندارن !

خب ما هم میخواهیم این رو بهت حالی کنیم چرا حرف خودمان رو بهمون برمیگردونی.ماهم گفتیم این مشکل میتونه از این ابزارهایی باشه که پشت صحنه قرار دارن.


حالا با صدا زدن این تابع رشته test به پارامتر ورودی الحاق میشه و بعد نمایش داده میشه ، حالا این پیاده سازی که تو Dll هست به برنامه شما چه ربطی داره ؟ شما داری فقط ازش استفاده میکنی .

خب مشکلت همینه .
ما که نگفتیم کارش رو درست انجام نمیده منظور اینه که این dll موجود در 7 با اون dll ای که داخل ورژنهای دیگه از xp استفاده میشه شاید تفاوت تحلیل و کدینگ داره که باعث کندی میشه.


من گفتم اگر قرار باشه ایراد از پروژه باشه ممکنه تنضیماتی تو فایل های کامپایل شده ( dcu و ... ) یا ریسورس پروژه باشه که موجب بروز این مشکل میشه

چه ربطی به dcu داره یعنی میگید ویندوز یه سری آپد کد با سرعت جایگزین میکنه که میگید مجدد کامپایل بشه؟

Felony
پنج شنبه 01 اردیبهشت 1390, 14:09 عصر
ما که نگفتیم کارش رو درست انجام نمیده منظور اینه که این dll موجود در 7 با اون dll ای که داخل ورژنهای دیگه از xp استفاده میشه شاید تفاوت تحلیل و کدینگ داره که باعث کندی میشه.
خوب عزیز من وقتی اون بحث تابع رو قبول داری پس با این اوصاف مشکل نباید رفع بشه ؛ خوب اگر تفاوت تحلیل و ... داشته باشه پس نباید مشکل رفع بشه چون شما به سورس DLL دسترسی ندارید ؛ پس برای چی میگی وقتی از اول پروژه رو بنویسی درست میشه ؟! :گیج:


چه ربطی به dcu داره یعنی میگید ویندوز یه سری آپد کد با سرعت جایگزین میکنه که میگید مجدد کامپایل بشه؟
خیر ؛ مثل اینکه تاپیک رو کامل مطالعه نکردی ، ایشون گفتن پروژه رو از اول ایجا کنید ، من گفتم ربطی نداره و اگر تنضیماتی قرار باشه ذخیره شده باشه در فایل کامپایل شده هست و گفتم ممکنه فایل های dcu کامپایل شده تنضیمات خاصی دارن که با کامپایل مجدد درست میشن .

tdkhakpur
پنج شنبه 01 اردیبهشت 1390, 14:17 عصر
پس برای چی میگی وقتی از اول پروژه رو بنویسی درست میشه ؟! :گیج:


مثل اینکه قاطی کردی! کدوم پست این مطلب رو ارسال نموده ایم فدایت بشوم؟

Felony
پنج شنبه 01 اردیبهشت 1390, 14:28 عصر
مثل اینکه قاطی کردی! کدوم پست این مطلب رو ارسال نموده ایم فدایت بشوم؟
پس شما کلا منظور رو اشتباه متوجه شدی ؛ پست شماره 7 و 8 رو بخون ، من در جواب پست شماره 7 اون پست رو دادم و شما اشتباه فکر کردی که من میگم تفاوتی در پیاده سازی نیست در صورتی که من گفتم تفاوت در این شرایط ربطی به برنامه نویس نداره .

mohsen24000
پنج شنبه 01 اردیبهشت 1390, 14:54 عصر
دوست عزیزی که تاپیک رو ایجاد کردید آیا مشکلتون با این همه بحثی که اینجا شد حل شده یا خیر!؟
خواستم بپرسم برنامه شما از زبان فارسی استفاده میشه و اینکه برای تغییر زبان اقدامی (کد) هم انجام دادید!؟
برای من همین مشکل پیش اومد و اون هم مربوط بود به کدی که تغییر زبان میدادم به زبان فارسی!
اون کد رو حذف کردم و مشکلم حل شد و جالب اینجاست که وقتی وارد برنامه میشم بدون کد تغییر زبان ، موقع فوکوس روی کنترل تایپ، خودش فارسی میشه!!!
ولی وقتی یک پروژه جدید خواستم تعریف کنم برای برنامه دیگه این اتفاق نیوفتاد!:متفکر:

nilidelphi
پنج شنبه 01 اردیبهشت 1390, 23:51 عصر
با اصل تابع نوشتن و کلاس نوشتن آشنایی دارید ؟ شما برای چی یک تابع مینویسید و ازش استفاده میکنید ؟ غیر از این هست که از تکرار کد جلوگیری بشه و اگر خواستید برنامه رو تغییر بدید لازم به کار اضافی نباشه و فقط تابع رو تغییر بدید ؟ خوب توابع ویندوز از این قاعده مستثنی هستند ؟چرا آشنایی ندارم؟؟؟؟؟؟
اولا که هر کلاسی ممکن از چندین کلاس پشت سر هم مشتق شده باشه.
دوما شاید در ورژن جدید کلاس کد های نسخه قبلی رو مد نظر گرفته باشند.


درسته که پیاده سازی GDI در دو ویندوز XP و 7 با هم متفاوت هست ولی تو طراحی GUI معمولی به شما مربوط نمیشه ، اگر اشکال رفع نمیشد میشد گفت Embarcadero این توابع رو درست پیاده سازی نکرده یا ... ، ولی شما میگی مشکل رفع میشه پس مشکل از دلفی هم نیست ، اون توابع هم که جز کتابخانه های خود دلفی هستند و شما تو هر سیستم عاملی برنامه رو کامپایل کنید بر اساس اون سیستم عامل از توابع gdi32.dll استفاده میشه !اما امکان این هم هست که زبان برنامه نویسی با توجه به ورژن پروژه به جای اینکه بخواد از GDI سیستم عامل جدید استفاده کنه دیگه تغییر نده که همیشه نسخه های بالای ویندوز کلاس های ورژن های پایین تر رو ساپرت می کنند.


شما که میگی از کامپایل نیست و باید یک پروژه دیگه ایجاد بشه !خوب جوابی که شما دادین چه ربطی به نوشته ی من داشت؟ من نمیدونم؟؟؟؟ متن رو دوباره بخونید لطفا.


کدوم گفته ؟ من گفتم اگر قرار باشه ایراد از پروژه باشه ممکنه تنضیماتی تو فایل های کامپایل شده ( dcu و ... ) یا ریسورس پروژه باشه که موجب بروز این مشکل میشه ؛ قبل از دادن پست متن رو دقیقا بخونید و سریع موضع نگیرید . مثل اینکه شما خودتون متن رو نخوندین!!؟؟؟؟ من کی گفتم مشکل از پروژه است که شما بررسی فایل های DCU رو پیشنهاد می کنید؟ من گفتم احتمالا(متن دقیقش این بود: :من فکر می کنم") سیستم عامل جور دیگه ابزار هارو پیاده سازی و پراسس میکنه.آیا من حرفی از کد برنامه و متد و یا فایل های پروژه کردم؟؟؟؟ من گفتم اجزاءها که انگلیسیش میشه : "Component" تازه اونم ویژاوالش .


من گفتم که نمونه این مشکل رو در دات نت هم دیده ام. در ضمن توجه داشته باشید که این موضوع چندان هم بی ارتباط با موضوع نیست، چون همانطور که می دانید پلت فرم .net هم برای این که کارش را به درستی انجام دهد به یک سیستم عامل نیاز دارد و در اینجا هم منظور من ویندوز است. به هر حال به نظر من شاید این موضوع هم در این مورد دخیل باشد! :متفکر:بله شما درس می فرمایید خود دات نت یک پلت فرمی هست که برای تکمیل شدنش به یک سیستم عامل ربط داره. البته این رو هم در نظر بگیرین که دات نت اجزاء ساخت رو خودش در اختیار زبان برنامه نویسی قرار میده که این زیادی تو تغییراتی که ما بحث می کنیم نمیتونه دخیل باشه. اگه توجه داشته باشید وقتی یک برنامه رو دات نت 2 می نویسید و وقتی اون رو به دات نت مثلا 3.5 منتقل می کنید مشکلی برا سورس پیش نمیاد حتی اگه سیستم عامل به هنگام کامپایل فرق کرده باشه.


چرا ربطی نداره؟ آیا شما در مورد این ادعای خود دلایل محکمه پسندی دارید که ما از آن بی اطلاع هستیم؟؟؟ :متفکر: اگر به این راحتی و بدون دلایل محکم می گویید که فلان چیز دلیلش چیست، پس لطفاً بگویید که چگونه باید این مشکل را برطرف کرد؟؟؟ بله دارم.
چون در سیستم عامل های 64 بیتی کلاس های کاری 32 بیتی برای توسعه دهندگان نرم افزار تعبیه شده. با یک مثال میگم :شما اگر رو ویندوز XP 64 بیت دلفی 32 بیت نصب کنید بی هیچ مشکلی میتونید برنامه بنویسید.
البته اینم بگم که اگه زبان برنامه نویسی شما محضا 64 بیت باشه دیگه این قاعده بی فایده است.


راستی خطاب به آقای تاجیک : اگه گفته ی شما درست باشه و داخل متد ها اگر فرق کنه برنامه در هنگام کامپایل خودش الحاق میکنه پس چرا اگه یک چنین برنامه هایی رو که فقط فایل EXE باشن رو هم باز هم تو ویندوز 7 کند اجرا میکنه؟؟؟؟
ایندفعه که دیگه سورسی در کار نیستتتتتتتتتتتتتتتتتت؟؟؟؟
و این مربوط به دلفی هم نمیشه من گفتم زبان های Native همش این مشکل رو دارند.

loo30fer
جمعه 02 اردیبهشت 1390, 00:24 صبح
لازم شد منم یک چیز رو بگم کلا مشکل از ویندوز 7 هست نه کمپایل و سورس کار ما برای مثال شما الان زبان سیستمون رو EN هست حالا با تابع LoadKeyboardLayout تعریف کنید که زبان فعلی سیستم که مثلا EN هست رو به زبان دیگری مانند FA تغییر بده ایندفعه وقتی روی دکمه کلیک میکنید تا زبان فعلی سیستم رو از EN به FA تغییر بده برای یک ثانیه برنامه فریز میشه و مکث کوچیک میکنه تا زبان ویندوز رو تغییر بده در صورتی که این مشکل تو ویندوز XP مشاهده نمیشه

Felony
جمعه 02 اردیبهشت 1390, 05:51 صبح
اولا که هر کلاسی ممکن از چندین کلاس پشت سر هم مشتق شده باشه.
دوما شاید در ورژن جدید کلاس کد های نسخه قبلی رو مد نظر گرفته باشند.
در ورژن جدید چی کدهای قبلی رو مد نظر گرفته باشند ؟


اما امکان این هم هست که زبان برنامه نویسی با توجه به ورژن پروژه به جای اینکه بخواد از GDI سیستم عامل جدید استفاده کنه دیگه تغییر نده که همیشه نسخه های بالای ویندوز کلاس های ورژن های پایین تر رو ساپرت می کنند.
آقا خوب ما هم میگیم این ورژن کجا ذخیره میشه ، به ما هم بگید .


خوب جوابی که شما دادین چه ربطی به نوشته ی من داشت؟ من نمیدونم؟؟؟؟ متن رو دوباره بخونید لطفا.
ربط داشت ، جناب عالی گفتی شاید به خاطر این هست که برنامه قبلا در XP کامپایل شده ، در صورتی که من قبلا همین رو گفتم و گفتید که باید پروژه از اول ایجاد بشه !


مثل اینکه شما خودتون متن رو نخوندین!!؟؟؟؟ من کی گفتم مشکل از پروژه است که شما بررسی فایل های DCU رو پیشنهاد می کنید؟ من گفتم احتمالا(متن دقیقش این بود: :من فکر می کنم") سیستم عامل جور دیگه ابزار هارو پیاده سازی و پراسس میکنه.آیا من حرفی از کد برنامه و متد و یا فایل های پروژه کردم؟؟؟؟ من گفتم اجزاءها که انگلیسیش میشه : "Component" تازه اونم ویژاوالش .
مثل اینکه اصلا تو باغ نیستی ، دقیقا پست ها رو بخون ببین چی گفتی چی نگفتی .

حرف من این هست که نوشتن برنامه یا ایجاد پروژه در یک ویندوز با ویندوز دیگه فرق نمیکنه چون سورس کد صرفا چندتا فایل متنی هستند و این کامپایل شدن سوسرس هست که تو 2 تا ویندوز مختلف متفاوت هست .


راستی خطاب به آقای تاجیک : اگه گفته ی شما درست باشه و داخل متد ها اگر فرق کنه برنامه در هنگام کامپایل خودش الحاق میکنه پس چرا اگه یک چنین برنامه هایی رو که فقط فایل EXE باشن رو هم باز هم تو ویندوز 7 کند اجرا میکنه؟؟؟؟
ایندفعه که دیگه سورسی در کار نیستتتتتتتتتتتتتتتتتت؟؟؟؟
پسر خوب ، مشکلت همین جاست که پست ها رو درست نمیخونی و میای موضع میگیری ؛ اولا شما میگی تو ویندوز XP درست کار میکنه و تو 7 به این مشکل بر میخوره در این صورت استفاده از کلمه باز هم چیه ؟!

دوما شما گفتی پروژه از نو اجرا بشه من گفتم ربطی نداره چون در داخل سورس چیز خاصی ذخیره نمیشه و گفتم اگر با ایجاد پروژه جدید مشکل برطرف میشه امکان داره در زمان کامپایل اطلاعاتی به فایلهای کامپایل شده ( dcu و ... ) الحاق میشه که اون مشکل رو پیش میاره ، دیگه نمیدونم به چه زبونی بگم !

سوما ، وقتی میگی " اگه گفته ی شما درست باشه و داخل متد ها اگر فرق کنه برنامه در هنگام کامپایل خودش الحاق میکنه پس چرا " پس یعنی این موضوع رو قبول نداری ، پیشنهاد میکنم اول نحوه کار یک کامپایلر رو مطالعه کنید بعد ببینید مشکل از کجا میتونه باشه .

یکسری راه حل پیشنهاد دادید و با دلایل ردش کردم ، اگر برای راه حلتون دلیل علمی و فنی دارید بیان کنید در غیر اینصورت وقتم بیشتر از این ها ارزش داره که بیشتر از این تو این تاپیک هدر بدم .

nilidelphi
جمعه 02 اردیبهشت 1390, 11:02 صبح
nدوست عزیز انگار شما به حد کافی مغرور هستین که حرف 4 نفر رو که در فروم دارن میزنند رو قبول نمی کنید.

حالا من می خوام یه کاری کنم که خیاله همرو راحت کنم : من یه برنامه کوچک دارم که با دلفی 2009 نوشته شده و تو ویندوز XP هم کامپایل شده و در XP و Vista و ورژن های پایین درست کار میکنه ولی در ویندوز 7 سرعت نمایش بعضی کامپننت هاش خیلی پایین.

من امروز این پروژه رو تو سیستم خودم که ویندوز 7 داره دوباره کامپایل و اجرا کردم و دیدم که بازم کند کار میکنه.
بعد تصمیم گرفتم نظر شما در مورد فایل های DCU رو روش اعمال کنم و همه ی تنظیمات رو چک کردم و همه ی فایل های DCU پروژه رو پاک کردم و دوباره کامپایل کردم ولی باز هم کند کار کرد.

حالا این سورس میزارم تا دانلود کرده و این مشکل با توجه به گفته های خودتون حل کنید. فقط یه شرط داره اون این که قووول بدی برنامه رو از اول ننویسی.

اگه بتونی ثابت کنی که برنامه رو با توجه به حرف هایی که زدی درست کردی من تو همین تاپیک ازت معذرت می خوام.

حالا این پروژه را دانلود کن و بعد از این که درست کردی بذار تا ما هم دانلود کنیم ببنیم تو کجا ایراد داریم یا شاید ما اصلا برنامه نویس نیستیم که شما اینقدر به ما توهین می کنید.....

اینم لینک :
http://up.iranblog.com/images/12k0m3w15f3vhbk1hpl.rar

منتظریم...................

Felony
جمعه 02 اردیبهشت 1390, 11:57 صبح
دوست عزیز انگار شما به حد کافی مغرور هستین که حرف 4 نفر رو که در فروم دارن میزنند رو قبول نمی کنید.
کدوم 4 نفر ؟
آقای خاکپور یک حرفی زد و معلوم شد اشتباه برداشت کرده ( پست شماره 22 این رو ثابت میکنه ) ؛ کاربر a_mosavian هم یک حرفی زد و رفت ، اگر براش دلیل داره من هنوز حاظرم جواب بدم ، الان فقط جناب عالی روی این گفته اصرار داری که جوابت در زیر اومده :



حالا این سورس میزارم تا دانلود کرده و این مشکل با توجه به گفته های خودتون حل کنید. فقط یه شرط داره اون این که قووول بدی برنامه رو از اول ننویسی.
برای اینکه مطمئن بشی از اول ننوشتم فایل dpr پروژت رو باز کن و خط Application.BiDiKeyboard:='00000429' رو Comment کن یعنی کد فایل پروژت میشه :

program Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Asli},
Unit2 in 'Unit2.pas' {AddCantact},
Data1 in 'Data1.pas' {dm1: TDataModule},
Unit3 in 'Unit3.pas' {search},
About in 'About.pas' {Aboutfrm};

{$R *.res}

begin
Application.Initialize;
//Application.BiDiKeyboard:='00000429';
Application.NonBiDiKeyboard:='00000409';
Application.MainFormOnTaskbar := True;
Application.Title := 'ntjv]i jgtk lahyg';
Application.CreateForm(TAsli, Asli);
Application.CreateForm(TAddCantact, AddCantact);
Application.CreateForm(Tdm1, dm1);
Application.CreateForm(Tsearch, search);
Application.CreateForm(TAboutfrm, Aboutfrm);
Application.Run;
end.

حالا برنامه رو اجرا کن ، نتیجه چی شد ؟

اینکه چرا با استفاده از این کد این مشکل پیش میاد بحثش جداست و باید بررسی کرد و راه حلی براش پیدا کرد ولی چیزی که واضح هست این هست که هیچ ربطی به نوشتن برنامه در سیستم عامل n نداره !


حالا این پروژه را دانلود کن و بعد از این که درست کردی بذار تا ما هم دانلود کنیم ببنیم تو کجا ایراد داریم یا شاید ما اصلا برنامه نویس نیستیم که شما اینقدر به ما توهین می کنید.....
تو پست هام نمیبینم که به کسی توهین کرده باشم ؛ به خودم هم مغرور نیستم ولی از چیزی که ازش اطمینان دارم دفاع میکنم ، این حرف که ایجاد پروژه تو این ویندوز با اون ویندوز متفاوت هست اصلا معنایی نداره ، به جز اون دلایلی که آوردم اگر حرفتون درست بود به 2 روز نکشیده 100 نفر اینجا من رو به صلیب میکشیدن که داری اشتباه میکنی .

mohsen24000
جمعه 02 اردیبهشت 1390, 12:01 عصر
میشه بفرمایید دقیقا کدوم کامپوننتهاش کنده!؟
بنده که کندی در اون مشاهده نکردم!

Felony
جمعه 02 اردیبهشت 1390, 12:09 عصر
میشه بفرمایید دقیقا کدوم کامپوننتهاش کنده!؟
بنده که کندی در اون مشاهده نکردم!
کلا سرعت برنامه پائین هست ( ویندوز 7 ) ، مثلا از منوی " جست و جوی مخاطب " گزینه " با نام موئسسه " رو انتخاب کنید .

- با بررسی هایی که انجام دادم این مشکل زمانی پیش میاد که اولین بار هر فرم رو باز کنید ، دارم روش کار میکنم .

nilidelphi
جمعه 02 اردیبهشت 1390, 12:33 عصر
خوب عزیز ما هم مشکلمون اینه که چرا کلا سرعت برنامه در ویندوز 7 پایین؟

مخصوصا اگه همون کد پروژه را مینویسیم؟

ابته من ازتون معذرت هم میخوام که مسئله را کش دادم.ولی چرا پروژه را وقتی از اول می نویسیم درست میشه؟

tdkhakpur
جمعه 02 اردیبهشت 1390, 20:35 عصر
کدوم 4 نفر ؟
آقای خاکپور یک حرفی زد و معلوم شد اشتباه برداشت کرده ( پست شماره 22 این رو ثابت میکنه )
نخیر اصلا اشتباه برداشت نکردم!
حالا شما یه چیزی ارسال میکنی میاییم بهت میگیم چرا این حرف رو زدی باز حرف ما رو دور میزنی متن


حرف من این هست که نوشتن برنامه یا ایجاد پروژه در یک ویندوز با ویندوز دیگه فرق نمیکنه چون سورس کد صرفا چندتا فایل متنی هستند و این کامپایل شدن سوسرس هست که تو 2 تا ویندوز مختلف متفاوت هست

رو داخل تاپیک بالا ارسال کردی. کدوم استادی بهت این رو گفته که کامپایل دو سورس مشابه به سیستم عامل بستگی داره؟این هم تازه مد شده.

Felony
جمعه 02 اردیبهشت 1390, 21:12 عصر
نخیر اصلا اشتباه برداشت نکردم!
حالا شما یه چیزی ارسال میکنی میاییم بهت میگیم چرا این حرف رو زدی باز حرف ما رو دور میزنی متن

رو داخل تاپیک بالا ارسال کردی. کدوم استادی بهت این رو گفته که کامپایل دو سورس مشابه به سیستم عامل بستگی داره؟این هم تازه مد شده.
خوبی ؟
جدیدا واژه " فرق نمیکنه " یعنی بستگی داره ؟
این پست جناب عالی در جواب من هست :

مثل اینکه قاطی کردی! کدوم پست این مطلب رو ارسال نموده ایم فدایت بشوم؟
اگر کسی این پست رو خوند و برداشت دیگه ای کرد به من خبر بده !



رو داخل تاپیک بالا ارسال کردی. کدوم استادی بهت این رو گفته که کامپایل دو سورس مشابه به سیستم عامل بستگی داره؟این هم تازه مد شده.
من نگفتم صرفابه سیستم عامل بستگی داره و اصلا حرفی از وابستگی نزدم ولی برای اینکه جناب عالی روشن شی کامپایل 2 سورس مشابه به سیستم عامل و کامپایلر بستگی داره ، من گفتم نوشتن 2 سورس مشابه در دوسیتم عامل متفاوت تقاوتی با هم نداره چون سورس ها صرفا فایل های متنی هستند .

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

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

آن کس که نداند و نداند که نداند در جهل مرکب ابدالدهر بماند

tdkhakpur
جمعه 02 اردیبهشت 1390, 21:20 عصر
من نگفتم به سیستم عامل بستگی داره ، کامپایل 2 سورس مشابه به سیستم عامل و کامپایلر بستگی داره ، گفتم نوشتن 2 سورس مشابه در دوسیتم عامل متفاوت تقاوتی با هم نداره چون سورس ها صرفا فایل های متنی هستند .

بالاخره چی شد این یا اون؟
از دوستان میشه منظور ایشون رو یکی توضیح بده شاید ما انشای ایشون رو متوجه نمیشیم.؟
پست شماره 27 و این هم نظر ارسالی ایشون



حرف من این هست که نوشتن برنامه یا ایجاد پروژه در یک ویندوز با ویندوز دیگه فرق نمیکنه چون سورس کد صرفا چندتا فایل متنی هستند و این کامپایل شدن سوسرس هست که تو 2 تا ویندوز مختلف متفاوت هست

vcldeveloper
جمعه 02 اردیبهشت 1390, 23:05 عصر
خب، الحمدلله یکی پیدا شد که یه نمونه کد برای reproduce کردن مشکل اعلام شده، بذاره، تا بشه مشکل رو بررسی کرد.

علت بروز اون مشکل، مقداردهی به دو خصوصیت Application.BiDiKeyboard و Application.NoBiDiKeyboard هست. اتفاقی که میافته به این صورت هست که در صورت مقدار داشتن هر کدوم از این خصوصیت ها، دلفی در زمان ورود به هر کنترل مشتق شده از TWinControl، یک بار تابع LoadKeyboardLayout رو فراخوانی میکنه. تابع LoadKeyboardLayout هم در نسخه های ویندوز سرور 2008 و ویندوز 7، دچار کاهش سرعت شده، و این مسئله رو افراد مختلف به مایکروسافت اطلاع دادند، ولی اقدامی برای رفع اون صورت نگرفته. این کاهش سرعت خیلی زیاد نیست، ولی وقتی برای هر کنترلی که فوکس میگیره، این تابع مرتبا فراخوانی بشه، تاخیر بوجود اومده محسوس میشه.

علت کند شدن LoadKeyboardLayout در نسخه های جدید ویندوز اعلام نشده، ولی اینطوری که من بررسی کردم، این تابع در نسخه های جدید ویندوز به دفعات مقادیری رو از شاخه HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\TIP رجیستری میخونه، در حالی که در نسخه های قدیمی تر ویندوز این اتفاق نمیافته.


برای رفع مشکل...

دلفی باید به جای لود کردن مکرر Layout کیبورد، بعد از یک بار فراخوانی این تابع، مقدار برگشتی اون رو نگهداری می کرد، تا در دفعات بعدی مجبور نباشه مرتبا این تابع رو فراخوانی کنه. حالا که دلفی این کار رو نکرده، باید از خیر استفاده از Application.BidiKeyboard و Application.NonBidiKeyboard بگذرید، و خودتون یک بار تابع LoadKeyboardLayout رو فراخوانی کنید، و خروجی اون رو در برنامه ذخیره کنید، و هر جا که لازم داشتید، Layout مناسب را با استفاده از تابع ActivateKeyboardLayout فعال کنید.

tdkhakpur
جمعه 02 اردیبهشت 1390, 23:43 عصر
این تابع در نسخه های جدید ویندوز به دفعات مقادیری رو از شاخه HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\TIP رجیستری میخونه، در حالی که در نسخه های قدیمی تر ویندوز این اتفاق نمیافته.

مگه کد LoadKeyboardLayout به همراه ویندوز عرضه میشه؟!

vcldeveloper
شنبه 03 اردیبهشت 1390, 02:31 صبح
مگه کد LoadKeyboardLayout به همراه ویندوز عرضه میشه؟!
خیر، ولی این دلیل نمیشه که نشه رفتار یک نرم افزار یا بخشی از اون نرم افزار را بررسی کرد.

mohsen24000
شنبه 03 اردیبهشت 1390, 07:57 صبح
خودتون یک بار تابع LoadKeyboardLayout رو فراخوانی کنید، و خروجی اون رو در برنامه ذخیره کنید، و هر جا که لازم داشتید، Layout مناسب را با استفاده از تابع ActivateKeyboardLayout فعال کنید.
بنده نیز در پست 24 همین تاپیک این مسئله رو عنوان کردم، حالا بفرمایید چه طوری میشه این کار رو انجام داد!؟
در ضمن چرا وقتی من همه دستورات تغییر زبان رو از پروژه ام حذف کردم باز هم موقع فوکوس روی کنترلهای مثلا TEDIT خود به خود زبان فارسی میشه!!!
با تشکر

حمیدرضاصادقیان
شنبه 03 اردیبهشت 1390, 09:17 صبح
ممنون.
مشکل دقیقا مربوط به BidiKeyboard هست.با غیر فعال کردن اون مشکل حل شد و سرعت خیلی عالی شد.
فقط باید از روش آقای کشاورز برای تغییر زبان استفاده کرد.
ممنون از همه دوستان.

tdkhakpur
شنبه 03 اردیبهشت 1390, 11:26 صبح
حالا بفرمایید چه طوری میشه این کار رو انجام داد!؟
در ضمن چرا وقتی من همه دستورات تغییر زبان رو از پروژه ام حذف کردم باز هم موقع فوکوس روی کنترلهای مثلا TEDIT خود به خود زبان فارسی میشه!!!


خطاب شما بنده نیستم ولی منظور اینه که یک بار لیست زبانهای موجود در سیستم رو در آرایه داشته باشید بعد از طریق اون آرایه زبانی را که مد نظر دارید active کنید.

vcldeveloper
شنبه 03 اردیبهشت 1390, 14:48 عصر
حالا بفرمایید چه طوری میشه این کار رو انجام داد!؟

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


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 خود به خود زبان فارسی میشه!!!
نمیدونم، برای من که اینطوری نمیشه.

M_Maskout
سه شنبه 06 اردیبهشت 1390, 19:26 عصر
سلام
هرچند که در کل، به نظر میاد تاپیک به نتیجه رسیده، اما مشکل بعضی از برنامه‌های کامپایل شده تو XP و اجرای کند اونا تو 7، غیر از تغییر زبان کیبورد، علی القاعده، دلایل دیگه هم داره.
مثلاً برنامه‌ای که از افکت‌های تصویری کامپوننت Billenium Effects استفاده می‌کنه، توی 7، کند اجرا می‌شه. که با کمپایل مجدد اون تو خود 7، اوضاع خیلی بهتر می‌شه.

متأسفانه تاپیک با داشتن بیشتر از 40 پست، آنچنان که باید، روی موضوع اصلی (کندی اجرای برنامه‌ها در 7 نسبت به XP) نپرداخته.
البته تو پست 3 راه حلی بیان شده که اصولاً شاید بهترین راه حل باشه:

...همون برنامرو [برنامه رو] با دلفی 2009 یا بیشتر [بالاتر] تو خود ویندوز 7 ایجاد کن و از اول بنویس...
ولی قسمت قرمز رنگ نقل قول بالا که البته قاعدتاً درست نیست، باعث شد که بحث بی موردی ایجاد بشه و به اصل قضیه پرداخت نشه. هرچند آقای تاجیک تو چندتا پست بیان کردن که نیازی به از اول نوشتن کد برنامه نیست، ولی لحن تند ایشون و نگاه بالا به پایین به سایر اعضا، باعث این بحث‌های بی مورد شده. این قضیه تو همون اولین پست ایشون (پست 4) دیده می‌شه:

از اول بنویسه یا از اول کامپایل کنه ؟ اگر بگی کامپایل[،] میشه قبول کرد ولی در مورد نوشتن برنامه از اول[،] مگر سورس ذخیره شده در دو ویندوز متفاوت[،] با هم فرق میکنه ؟!
و یا تو پست دوم ایشون (پست 7)

اشتباه فکر میکنی !
یعنی چی که نحوه ساخت ابزار ویژوال فرق میکنه ، ...
تنها به 2 چیز میشه شک کرد یکی تنضیمات [تنظیمات] ذخیره شده در پروژه و دیگری فایل ریسورس هست ، قبل از کامپایل تنضیمات [تنظیمات] رو بررسی کنید و فایل های dcu کامپایل شده و فایل ریسورس رو حذف و برنامه رو سیستم عامل مورد نظر کامپایل کنید .
هرچند تو این پست دقیقاً و به طور کامل راهکار (و احتمال قریب به یقین تنها راهکار) قابل اجرا برای رفع مشکل بیان شده، ولی باز هم تأکید می‌کنم که همون طرز نگاه، سبب شده تا دوستان دیگه، مطالبی رو ارائه کنن که خیلی نمی‌تونه درست باشه (و البته روش پافشاری هم بکنن).
تو پست 9 و 10، کار یه جورایی داره بالا می‌گیره و حتی بعد از توصیه‌های آقای عشایری و جناب استاد کشاورز (تو پستای 13 و 14)، باز هم بحث بی مورد تموم نمی‌شه.
من فکر می‌کنم که اولاً دانش هیچ کسی کامل نیست و به قولی "همه چیز را همگان دانند" و در صورتیکه چیزی رو بهتر از بقیه بلد هستیم، لزومی نداره با کسایی که از ما کمتر بلدن، بصورت تحقیر آمیز رفتار کنیم (صحبت کنیم). ثانیاً، کل این سایت برای تبادل اطلاعات علمی درست شده و فکر می‌کنم تمام اعضا، اومدن تا چیزی یاد بگیرن و چیزهایی رو هم که بلدن، در اختیار بقیه بذارن. این موضوع از شماره تعداد تشکر کردنحتی کاربری مثل استاد کشاورز هم مشخصه.
به نظر من، دوستان سایت، اگه علاقه مند هستن که با سواد بودنشون رو به بقیه ثابت کنن، بهتر این هست که توی بحث‌ها شرکت نکنن، چون اینجوری می‌شه فکر کرد که، بحث برای اونا اینقدر پیش و پا افتاده‌س که ارزش وقت گذاشتن رو براشون نداره. ولی در صورتیکه لطف بیشتری دارن، بهتره نظر صحیح (یا لااقل چیزی که فکر می‌کنن درسته) رو وارد کنند و از به رخ کشیدن سواد خودشون و به رو اوردن کم دانشی بقیه خود داری کنن.

موفق باشید.

Felony
سه شنبه 06 اردیبهشت 1390, 20:32 عصر
به نظر من، دوستان سایت، اگه علاقه مند هستن که با سواد بودنشون رو به بقیه ثابت کنن، بهتر این هست که توی بحث‌ها شرکت نکنن، چون اینجوری می‌شه فکر کرد که، بحث برای اونا اینقدر پیش و پا افتاده‌س که ارزش وقت گذاشتن رو براشون نداره. ولی در صورتیکه لطف بیشتری دارن، بهتره نظر صحیح (یا لااقل چیزی که فکر می‌کنن درسته) رو وارد کنند و از به رخ کشیدن سواد خودشون و به رو اوردن کم دانشی بقیه خود داری کنن.
قبل از موضع گیری بحث رو کامل مطالعه کن ؛ من چند بار گفتم نه قصد توهین دارم و نه قصد به رخ کشیدن چیزی رو ، جناب عالی تازه وارد این سایت و این بخش شدی ، انشاالله تا چند ماه دیگه به مباحث فنی! جناب خاکپور عادت میکنی ، اون وقت بیا ببینم نظرت چیه اگر میخوای زودتر با این مباحث آشنا بشی تو همین بخش مباحث فنی دیگه زیادی وجود داره !

loo30fer
چهارشنبه 07 اردیبهشت 1390, 12:35 عصر
من با یکم ابتکار تغییر زبان رو یکجور دیگه درست کردم البته باید حرفه ای درستش میکردم که نکردم میتونستم لیست تمامی زبانها رو بگیرم و بر اساس اون حلقه دور بزنه و عمل تغییر زبان با شبیه سازی 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;

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

حمیدرضاصادقیان
چهارشنبه 07 اردیبهشت 1390, 15:29 عصر
سلام.
ممنون از همه دوستان.
فقط مشکلی که اینجا پیش میاد اینه که برنامه خیلی بزرگه. آیا باید برای هر رویدادی این تابع فراخوانی بشه؟
اینجوری خیلی سخت میشه.

vcldeveloper
چهارشنبه 07 اردیبهشت 1390, 23:37 عصر
من با یکم ابتکار تغییر زبان رو یکجور دیگه درست کردم البته باید حرفه ای درستش میکردم که نکردم میتونستم لیست تمامی زبانها رو بگیرم و بر اساس اون حلقه دور بزنه و عمل تغییر زبان با شبیه سازی ALT + SHIFT انجام بشه که این کد تنها برای ویندوزهایی که دو زبان نصبه کار میکنه و دیگه تو ویندوز 7 مکثی در کار نیست.
نیازی به شبیه سازی کلیدهای صفحه کلید نیست، ActivateKeyboardLayout خودش پارامترهایی برای فعال کردن Layout بعدی و قبلی داره.



فقط مشکلی که اینجا پیش میاد اینه که برنامه خیلی بزرگه. آیا باید برای هر رویدادی این تابع فراخوانی بشه؟
باید ببیند که اولا آیا شما در برنامه نیازی به سوئیچ کردن بین دو زبان دارید یا نه؟ اگر دارید، آیا فقط در چند مورد محدود هست، یا در جاهای مختلفی این نیاز وجود داره؟ اگر بر فرض در نقاط متعددی به همچین چیزی نیاز دارید، می تونید در هر فرم یک کد بنویسید که وضعیت BiDiMode یک کنترل رو بررسی کنه، و بر اساس همون، متد مورد نظر را برای لود کردن Layout مناسب فراخوانی کنه. اون وقت می تونید اون کد را به رویداد OnEnter هر کدوم از کنترل های اون فرم نسبت بدید.

loo30fer
چهارشنبه 07 اردیبهشت 1390, 23:43 عصر
نیازی به شبیه سازی کلیدهای صفحه کلید نیست، ActivateKeyboardLayout خودش پارامترهایی برای فعال کردن Layout بعدی و قبلی داره.
بله کاملا درسته راستش قبلش دنبال همچین تابعی گشتم ولی پیدا نکردم برای همین مجبور شدم با شبیه سازی Alt + Shift اینکار رو بکنم و در کل میخواستم نمونه کار باشه که برسونم راه دیگری وجود داره و با کدنویسی کمتر

حمیدرضاصادقیان
پنج شنبه 08 اردیبهشت 1390, 09:21 صبح
ممنون . من فقط در یکی دومورد نیاز به تغییر زبان دارم.
ولی در ابتدای برنامه زبان رو تغییر میدم. هنگام کار در فرمهای دیگه باز زبان انگلیسی هست باز مجبورم این تابع رو صدا بزنم.؟

vcldeveloper
پنج شنبه 08 اردیبهشت 1390, 17:26 عصر
ولی در ابتدای برنامه زبان رو تغییر میدم. هنگام کار در فرمهای دیگه باز زبان انگلیسی هست باز مجبورم این تابع رو صدا بزنم.؟
LoadKeyboardLayout فقط یک بار برای هر زبان فراخوانی بشه، کافی هست. برای ActivateKeyboardLayout، کدی که من نوشتم، زبان کیبورد کل Process را تغییر میده، ولی بررسی نکردم که آیا در هنگام ایجاد یک فرم، دلفی مجددا خودش زبان فعال فعلی را تغییر میده یا نه؛ اگر میده، مجبورید که در هنگام نمایش هر کدام از فرم ها، یک بار ActivateKeyboardLayout را برای زبان مورد نظرتان فراخوانی کنید.

حمیدرضاصادقیان
شنبه 10 اردیبهشت 1390, 12:07 عصر
ممنون.
الان مشکل اینجاست که وقتی برای اولین بار فرم فراخوانی میشه و من زبان رو فارسی میکنم ، باز روی هر Edit که میاد English هست. یعنی باید در رویداد Onenter یک کامپوننت بنویسم بعد به مابقیشون Bind کنم. که باز مقداری تاخیر در ورود اطلاعات ایجاد میکنه.

حمیدرضاصادقیان
شنبه 10 اردیبهشت 1390, 15:53 عصر
من اومدم یک پروژه جدید با چند تا فرم ایجاد کردم و روی هر کدوم چند تا TEdit قرار دادم. در فرم اصلی وقتی زبان تغییر میکنه در مابقی فرمها مشکلی نیست.
حتی فایل Resource پروژه اصلی خودمو حذف کردم ولی باز هم وقتی زبان تغییر میکنه هر فرمی و هر کامپوننتی باید مجدد زبانش تغییر کنه.
آیا در پروژه باید چیز خاصی رو تنظیم کرد یا...؟

tdkhakpur
شنبه 10 اردیبهشت 1390, 22:34 عصر
کد زیر میتونه برای حل مشکلتان کمک کنه.
بهتره از این روش استفاده کنید و سرعت هم به حداقل میرسه اگه داخل ویندوز 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 در بالا قرار داده شده است.

حمیدرضاصادقیان
یک شنبه 11 اردیبهشت 1390, 08:15 صبح
ممنون.
ولی سوال من هنوز پابرجاست. در دو پروژه چه مواردی میتونند تاثیر گذار باشند.؟
چرا وقتی من یک پروژه جدید ایجاد کردم با چند فرم مختلف ، وقتی در ابتدای برنامه زبان رو تغییر میدم برای کل برنامه تغییر میکنه.
ولی در پروژه دوم وقتی در هر فرم زبان رو تغییر میدم باز روی هر Edit نیز باید اینکار صورت بگیره.

loo30fer
یک شنبه 11 اردیبهشت 1390, 12:03 عصر
من یک نمونه ساختم که براتون هم ضمیمش کردم که با 9 خط کدنویسی این مشکل تغییر زبان ویندوز 7 رو حل کردم که دیگه تو تغییر زبان مکثی بوجود نمیاد و سریع عمل میکنه برای تست میتونید بلافاصله که تو edit کلیک کردین تایپ کنید و ممنون میشم نظرتون رو بگین مخصوصا شما جناب آقای کشاورز و حمیدرضا صادقیان . با تشکر

حمیدرضاصادقیان
یک شنبه 11 اردیبهشت 1390, 12:11 عصر
ممنون.
دوست عزیز این برنامه شما پیش فرض زبانش فارسی هست و اون دکمه کار خاصی نیز انجام نمیده.
میشه کدش رو قرار بدید.

حمیدرضاصادقیان
یک شنبه 11 اردیبهشت 1390, 12:34 عصر
یک نکته جالب دیگه ای که بهش برخوردم این هست که در بعضی از فرمها اصلا نیازی نیست زبان رو به فارسی تغییر بدم و همون یک باری که اول سیستم تغییر زبان دادم اون فرم هم درست کار میکنه.
در بعضی از فرمها باید در رویداد Oncreate فرم دوباره زبان رو فارسی کنم. ولی در بعضی از فرمها مجبورم برای هر Edit یک بار زبان رو تغییر بدم.
بااینکه خصوصیات فرمها رو هم دیدم مثل هم هستند.

loo30fer
یک شنبه 11 اردیبهشت 1390, 13:16 عصر
دوست عزیز این برنامه شما پیش فرض زبانش فارسی هست و اون دکمه کار خاصی نیز انجام نمیده.نخیر دوست عزیز وقتی برنامه من رو اجرا میکنید زبان پیشفرض ویندوز برای برنامه من روی 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 استفاده کنید این مشکل بوجود نمیاد و میشه زبان دیگری رو انتخاب کرد.

حمیدرضاصادقیان
یک شنبه 11 اردیبهشت 1390, 14:18 عصر
ممنون.
تست کردم خیلی عالی جواب داد.
فقط سوال اینه که چرا با LoadkeyboardLayout اینقدر کند عمل میکنه در صورتی که الان با این دستور کوچکترین مکثی وجود نداره؟

vcldeveloper
یک شنبه 11 اردیبهشت 1390, 20:45 عصر
من یک نمونه ساختم که براتون هم ضمیمش کردم که با 9 خط کدنویسی این مشکل تغییر زبان ویندوز 7 رو حل کردم که دیگه تو تغییر زبان مکثی بوجود نمیاد و سریع عمل میکنه برای تست میتونید بلافاصله که تو edit کلیک کردین تایپ کنید و ممنون میشم نظرتون رو بگین مخصوصا شما جناب آقای کشاورز و حمیدرضا صادقیان .
این کدی که نوشتید، چه کاری انجام میده؟ من که سورس رو می بینم، شما لیست Keyboard layout های موجود در سیستم رو میگیرید، بعدش در یک حلقه هر کدوم از اونا رو بررسی می کنید که آیا مربوط به زبان فارسی هست یا نه، اگر Layout مربوط به زبان فارسی توی لیست نبود، Layout قبلی رو در لیست Layout های لود شده توسط یک Process، فعال می کنید.

خب این کار بخصوصی نیست، در واقع کد شما همون یک خط فراخوانی ActivateKeyboardLayout هست، و مابقی کد کار خاصی انجام نمیده. البته پیش فرض شما مبنی بر اینکه حتما Layout قبل از Layout فعلی زبان فارسی هست، هم اشتباه هست. البته شاید متوجه این اشکال نشید، چون بالاخره کد شما داره در یک حلقه پیوسته Layout قبلی رو فعال میکنه، و بالاخره اگر زبان فارسی موجود باشه، یکی از این Layout ها مربوط به فارسی میشه.

در واقع اگر کیبورد فارسی در سیستم موجود باشه، فراخوانی LoadKeyboardLayout الزامی نیست، و همون فراخوانی ActivateKeyboardLayout کفایت میکنه.


فقط سوال اینه که چرا با LoadkeyboardLayout اینقدر کند عمل میکنه در صورتی که الان با این دستور کوچکترین مکثی وجود نداره؟
در پست اولم در همین تاپیک توضیح دادم که پیاده سازی LoadKeyboardLayout در ویندوز سرور 2008 و ویندوز 7 تغییر پیدا کرده. اینکه این تغییر برای چی بوده یا دقیقا چی بوده، رو مایکروسافت اعلام نکرده. اون چیزی که من بهش برخوردم اینه که این تابع در پیاده سازی جدیدش به طور مکرر مقادیری رو از یک کلید رجیستری میخونه که در پیاده سازی های قبلی این کار انجام نمیشد.




یک نکته جالب دیگه ای که بهش برخوردم این هست که در بعضی از فرمها اصلا نیازی نیست زبان رو به فارسی تغییر بدم و همون یک باری که اول سیستم تغییر زبان دادم اون فرم هم درست کار میکنه.
در بعضی از فرمها باید در رویداد Oncreate فرم دوباره زبان رو فارسی کنم. ولی در بعضی از فرمها مجبورم برای هر Edit یک بار زبان رو تغییر بدم.
بااینکه خصوصیات فرمها رو هم دیدم مثل هم هستند.
این یک بحث دیگه است. یک نمونه پروژه بذارید که بتونه مشکل شما رو باز تولید کنه، و بشه اون رو بررسی کرد.

loo30fer
یک شنبه 11 اردیبهشت 1390, 23:07 عصر
این کدی که نوشتید، چه کاری انجام میده؟ من که سورس رو می بینم، شما لیست 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 پیاده کنیم تا کاربر متوجه این موضوع نشه و برای تغییر زبان و جلوگیری از مکث در تغییر زبان از کد من استفاده کنیم.
ضمنا ممنون میشم اگه خودتون تابعی رو که نوشتین تو سورس قرارش بدین و ضمیمش کنید آخه راستش من تابحال با اینجور تابعها کار نکردم (مبتدی ام) و وقتی میارمش تو دلفی به خطا برمیخورم و میخوام تابع شما رو تست کنم. با تشکر

tdkhakpur
یک شنبه 11 اردیبهشت 1390, 23:24 عصر
اگه زبان فارسی نصب بود و فارسی تو قسمت Layoutها نبود اون رو با تابع LoadKeyboardLayout اضافه کنیم و میشه تو اول برنامه چک کرد که اگه فارسی نصب بود و فارسی تو قسمت Layoutهانبود با تابع LoadKeyboardLayout اون رو اضافه کنیم

توضیح پیچیده ای در مورد تغییر زبان ارسال کردید فقط این قسمت آخر گفتید که لایه رو میخواهید به کجا اضافه کنید!؟

loo30fer
یک شنبه 11 اردیبهشت 1390, 23:49 عصر
توضیح پیچیده ای در مورد تغییر زبان ارسال کردید فقط این قسمت آخر گفتید که لایه رو میخواهید به کجا اضافه کنید!؟
خوب بذارین واضحتر بگم وقتی کاربر فارسی رو نصب کرده باشه ولی FA تو لیست Layoutها یا همون لیست Keyboard های نصب شده در کنار ساعت ویندوز نباشه ما مجبوریم اون رو به اون لیست اضافه کنیم که اگه از کد من استفاده بشه اینکار رو نمیکنه جز همون تابع LoadKeyboardLayout پس اگه از این تابع هم استفاده کنیم باز مشکل فریز و مکث تغییر زبان تو ویندوز 7 اتفاق میفته برای همین گفتم میتونیم تو form1.Create کدنویسی کنیم که لیست تمامی Layoutها رو بگیره و بعدش چک کنیم آیا FA جزو این لیست هست یا نه که اگه نبود از تابع LoadKeyboardLayout برای اضافه کردن FA به لیست Layoutها استفاده کنیم که باز برنامه فریز میشه و کاربر متوجه میشه برای همین گفتم این تابع رو تو Thread پیاده کنیم که برنامه فریز نشه و کاربرم متوجه نشه حالا برنامه ما لود شده و FA هم به لیست اضافه شده پس میتونیم با کد من عمل تغییر زبان رو بدون مکث انجام بدیم.

tdkhakpur
دوشنبه 12 اردیبهشت 1390, 00:04 صبح
ما مجبوریم اون رو به اون لیست اضافه کنیم که اگه از کد من استفاده بشه اینکار رو نمیکنه جز همون تابع LoadKeyboardLayout
ولی اگه نباشه فکر نکنم LoadKeyboardLayout قادر باشه این کار رو انجام بده.
نمونه کد برای اضافه کردن به لیست کنار ساعت رو دارید؟

loo30fer
دوشنبه 12 اردیبهشت 1390, 00:14 صبح
ولی اگه نباشه فکر نکنم LoadKeyboardLayout قادر باشه این کار رو انجام بده.
بله کاملا درسته من همینرو در جواب جناب کشاورز گفتم که اگه فارسی نصب نباشه کاری از دست LoadKeyboardLayout هم بر نمیاد پس حتما کاربر وقتی میخواد از برنامه فارسی استفاده کنه باید زبان فارسی رو هم نصب کنه.

نمونه کد برای اضافه کردن به لیست کنار ساعت رو دارید؟
بله برای مثال میتونید با این کد زبان عربی رو به لیستتون اضافه کنید.

LoadKeyboardLayout('00000401',KLF_ACTIVATE);
ولی یک مشکلی که این روش داره اینه که درسته زبان مورد نظر به لیست زبان کنار ساعت اضافه میشه ولی این زبان به لیست Keyboard تو Region and Language اضافه نمیشه که اگه کاربر بخواد اون زبان رو حذف کنه باید تو لیست زبانهای Region and Language اون زبان رو پیدا و Add و بعد اون رو حذف کنه تا از لیست کنار ساعتم حذف بشه که این دردسر برای کاربر موجب ناراحتی کاربر میشه.

tdkhakpur
دوشنبه 12 اردیبهشت 1390, 00:25 صبح
با این کد زبان عربی رو به لیستتون اضافه کنید

ممنون
ولی منظور این بود که تو این لیست باقی بمونه!


ولی یک مشکلی که این روش داره اینه که درسته زبان مورد نظر به لیست زبان کنار ساعت اضافه میشه ولی این زبان به لیست Keyboard تو Region and Language اضافه نمیشه .

این کاری که ما انجام میدیم روش پو.یای استفاده از لایه زبان هست اگه بخواهیم داخل Region and Language هم مشاهده کنیم باید داخل رجیستری پارامترهای زبان ثبت بشه .


که اگه کاربر بخواد اون زبان رو حذف کنه باید تو لیست زبانهای Region and Language اون زبان رو پیدا و Add و بعد اون رو حذف کنه تا از لیست کنار ساعتم حذف بشه که این دردسر برای کاربر موجب ناراحتی کاربر میشه

اون زبان وجود خارجی نداره فقط توسط برنامه جاری لود شده نیازی به حذف نیست یک بار سیستم ری استارت بشه داخل لیست میاد.
منظور اینه که تا ری استارت یا تنظیمات زبان داخل کنترل پانل آپدیت نشه با کیبورد نمیتونید بهش سویچ کنید.

loo30fer
دوشنبه 12 اردیبهشت 1390, 00:50 صبح
ولی منظور این بود که تو این لیست باقی بمونه!
خوب اگه بخواین تو لیست کنار ساعت باقی بمونه با همین تابع LoadKeyboardLayout هم باقی میمونه.

اون زبان وجود خارجی نداره فقط توسط برنامه جاری لود شده و سایر برنامه ها نمیتونن ازش استفاده کنن.و نیازی به حذف نیست
خیر - اگه نگاه کنید میبینید به اون لیست اضافه میشه و ماندگار میمونه و همه برنامه ها میتونن ازش استفاده کنن و همینطور خود کاربر.

vcldeveloper
دوشنبه 12 اردیبهشت 1390, 02:08 صبح
همین کد تونست مشکل تغییر زبان ویندوز 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) بود، الان هم که بحث شده چگونگی اضافه کردن کیبورد فارسی به ویندوز!

loo30fer
دوشنبه 12 اردیبهشت 1390, 02:30 صبح
کد شما مشکلی رو حل نکرد، هر کدی که درش از LoadKeyboardLayout استفاده نشه، اون مشکل ذکر شده رو نداره. همانطور که قبلا هم اشاره کردم، از اون چند خط کد شما، فقط فراخوانی تابع ActivateKeyboardLayout کفایت می کرد، و مابقی اش کد اضافی بود. ActivateKeyboardLayout هم که قبلا صحبتش رو کرده بودیم.
ولی من کلا میخواستم یک راه حل برای تغییر زبان ارائه بدم نه اینکه مشکل LoadKeyboardLayout رو رفع کرده باشم.

من نگفتم اگر فارسی نصب نباشه، بلکه گفتم: "در واقع اگر کیبورد فارسی در سیستم موجود باشه..."، یعنی کیبورد فارسی در تنظیمات کیبورد Keyboards and Languages جزو کیبوردهای موجود در سیستم نباشه.
ببخشید من اشتباه برداشت کردم.

توی Thread؟!! کل معطلی LoadKeyboardLayout (روی سیستم من) در حدود نیم ثانیه هست. برای این نیم ثانیه، که فقط هم یک بار نیاز به اجرا شدن داره، طرف یه Thread بسازه و اجرا کنه؟! در واقع ساخت یک Thread جدید و اجرای اون خودش اونقدر سربار اضافی داره که عملا افزایش سرعت خاصی از اجرای اون تابع در یک Thread مستقل به دست نمیارید. در واقع مکث اون تابع از بسیاری از مکث های حاصل از کوئری ها و کارهای مختلف دیگه در برنامه کمتر هست.
بله کاملا درسته.

مشکل چیز پیچیده ایی نیست، در چند صفحه قبل هم توضیح دادم، هر برنامه ایی که میخواد تغییر زبان کیبورد رو اعمال کنه، باید اولا از Application.BiDiKeyboard و Application.NonBiDiKeyboard پرهیز کنه، ثانیا، فقط یک بار LoadKeyboardLayout رو فراخوانی کنه، و ثالثا، هر جا نیاز به تغییر زبان داشت، از ActivateKeyboardLayout استفاده کنه. یک کد OOP ساده که این مکانیزم رو در یک کلاس استاتیک پیاده کنه هم قرار دادم. نمیدونم حالا این بحث ها چیه؟

چندتا بحث رو در تاپیک با هم مخلوط کردید؛ بحث اولیه تاپیک اینه بود که در بالا توضیح دادم، بعدش یک عده از کاربران درباره اینکه چطور در زمان نمایش فرم های مختلف این کد تغییر زبان اجرا بشه، سوال کردند. از طرف دیگه، آقای صادقیان درباره اینکه چرا در بعضی از فرم های برنامه اش زبان به طور پیش فرض فارسی هست، سوال کرد، بعد از اون، یک عده از کاربران راه حل هایی برای همون مشکل اولیه ارائه کردند که همگی مبتنی بر همون مورد اول (استفاده از ActivateKeyboardLayout) بود، الان هم که بحث شده چگونگی اضافه کردن کیبورد فارسی به ویندوز!
راستش کلا قصد کمک و ارائه راه حل برای تغییر زبان سیستم بوده نه اسپم کردن و بحث الکی که اگه اینطوره بنده از اینجا از شما عذرخواهی میکنم.

vcldeveloper
دوشنبه 12 اردیبهشت 1390, 02:39 صبح
راستش کلا قصد کمک و ارائه راه حل برای تغییر زبان سیستم بوده نه اسپم کردن و بحث الکی که اگه اینطوره بنده از اینجا از شما عذرخواهی میکنم.
من همچین برداشتی نکردم که شما یا دیگران که در این تاپیک بحث می کنند، در حال بحث الکی هستند، بلکه گفتم به طور کلی، چند بحث هم زمان داره در تاپیک مطرح میشه، که این موجب سردرگمی مباحث تاپیک میشه، و بهتره هر کدوم از اونها در تاپیک مستقلی بحث بشند.

موفق باشید

حمیدرضاصادقیان
دوشنبه 12 اردیبهشت 1390, 07:37 صبح
یک کد OOP ساده که این مکانیزم رو در یک کلاس استاتیک پیاده کنه هم قرار دادم

ممنون از پاسخگویی تمام دوستان.
آقای کشاورز عزیز من ابتدا کدی که شما زحمت کشیدید رو تست کردم ولی متاسفانه باز همون مقدار تاخیر وجود داشت. عرض کردم من این مواردی که داره توی این پروژه پیاده میشه رو در یک پروژه جدید با هرروشی تست کردم مشکلی مشاهده نکردم.
ولی در این پروژه هنوز نفهمیدم چرا در بعضی از فرمها باید برای تک تک کامپوننتها زبان رو تغییر بدم در صورتی که در بعضی از فرمها در ابتدای همون فرم کفایت میکنه.
من همین تغییر زبان رو ابتدا با کد شما تست کردم که نتیجه اش رو هم اعلام کردم که باز همون مقدار مکث در تغییر زبان وجود داشت.
ولی وقتی از کد دوم با همون مکانیزم قبلی استفاده کردم اون مکث خیلی کوتاه هم مرتفع شد.

siavash_fe
دوشنبه 12 اردیبهشت 1390, 08:35 صبح
سلا م
منم در پروژه كه داشتم وقتي از دلفي 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;

فايل به پروژه اضافه كنيد ودوباره كامپايل كنيد

حمیدرضاصادقیان
دوشنبه 12 اردیبهشت 1390, 10:16 صبح
ممنونم.ولی در فرمهایی که بهم میریزه من دارم از String Grid استفاده میکنم و با نگاه به کد اون یک همچین موردی رو نیافتم.
یعنی در WmKillFocus در داخل TCustomGrid یک همچین کدی نوشته نشده و کاری با ActivateKeyboardLayout نداره.

Anis131313
شنبه 02 مهر 1390, 23:42 عصر
سلام و خسته نباشید خدمت دوستان عزیز

این تاپیک تقریبا چند منظوره شده ولی بی دلیل هم نیست چون هم در مورد زبان برنامه هستش و هم در مورد سرعت اجرای برنامه ...
چند دقیقه قبل در تاپیک زیر پست دادم
http://barnamenevis.org/showthread.php?292571
من هم همین صحبت عوض شدن زبان ها رو در ویندوز 7 و دلفی 2010 بیان کردم که رفتاری نا معلوم داره اما مشخصه که فعلا این رو متوجه شدیم که این رفتار
با کامپوننت DBGrid درگیره...
ممنون میشم که اگه کسی میتونه پایداری زبان رو از ابتدای اجرای برنامه تا خاتمه برنامه تضمین کنه به ما هم یاد بدن...

موفق باشید.

Anis131313
یک شنبه 03 مهر 1390, 01:08 صبح
ظاهرا توی پست دادن و بیان ایرادم عجله کردم ...

با توجه به چند پست بالاتر و با توجه به حرفهایی که توی دو تا Page زیر دیدم متوجه شدم که برای DBGrid باید یک کامپوننت ساخت و Procedure با عنوان Windows Message برای اون در قسمت Protection درج کرد که در موقع خروج یا OnExit در DBGrid برنامه ما دچار تغییر زبان نشود. کد اون Package رو براتون قرار دادم که خدا کنه مشکلتون با این رفع بشه چون مال من در ظاهر رفع شده...
تا ببینیم این نرم افزار های 2003 به بعد چه خواب دیگری برای ما دیدن ...
لینک اول (https://forums.embarcadero.com/thread.jspa?messageID=180475&tstart=0#180475)
لینک دوم (https://forums.embarcadero.com/thread.jspa?threadID=44261)
کامپوننت تغییر داده شده :



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.


موفق باشید.