View Full Version : تعویض اتوماتیک زبان در هنگام ورود به یک Editbox - و تعیین رنگ دلخواه کاربر برای فرم ها
amir_ir
جمعه 03 مهر 1388, 20:36 عصر
سلام به همه دوستان
2 تا سوال دارم .
1) به چه شکل میشه کدی نوشت که وقتی focus به یک editbox خاص که رسید اتوماتیک زبان ویندوز به فارسی تبدیل بشه ؟ و بر عکس؟ (حتی اگر این امکان وجود داشته باشه که چک شود فارسی روی ویندوز اون سیستم نصب هست یا نه که محشره)
کد زیر رو برای تغییر زبان به فارسی پیدا کردم. اعداد توی پرانتز چی هستن و از کجا آورده شدن؟
LoadKeyboardLayout('00000429',1);
2) میخوام به کاربر این اختیار رو بدم که بتونه رنگ دلخواه خودش رو برای فرم ها تعیین کنه؟مثل دقیقا زمانی که برنامه نویس روی خصوصیت Color یک فرم دابل کلیک کنه، پنلی نمایش داده میشه که قسمت Custom داره و برنامه نویس در هنگام طراحی فرم میتونه رنگ دلخوه تولید کنه. آیا میشه این پنل رو به کاربر نمایش داد و خودش رنگ دلخواهش رو بسازه ؟
ممنون از همه دوستان
merced
جمعه 03 مهر 1388, 21:10 عصر
به چه شکل میشه کدی نوشت که وقتی focus به یک editbox خاص که رسید اتوماتیک زبان ویندوز به فارسی تبدیل بشه ؟
از رويدادهاي OnEnter و OnExit مربوط به Edit استفاده كنيد
اعداد توی پرانتز چین و از کجا آورده شدن؟ آیا این تنها راهه؟
LoadKeyboardLayout('00000429',1);فكر مي كني ميشه از يك خط هم كمتر كد نوشت 429 شناسه محلي (locale identifier) هست كه در ويندوز براي فارسي در نظر گرفته شده
میخوام به کاربر این اختیار رو بدم که بتونه رنگ دلخواه خودش رو برای فرم ها تعیین کنه؟ مثل دقیقا پنلی که برنامه نویس میتونه در هنگام طراحی فرم هاش رنگ دلخواه تولید کنه و قسمت Custom داره. یعنی در واقع میخوام این پنل رو برای کاربر به نمایش بگذارم .
از تب Dialogs كامپوننت ColorDialog
ColorDialog1.Options := [cdFullOpen] ;
if ColorDialog1.Execute then
Color := ColorDialog1.Color ;
amir_ir
جمعه 03 مهر 1388, 23:18 عصر
فكر مي كني ميشه از يك خط هم كمتر كد نوشت 429 شناسه محلي (locale identifier) هست كه در ويندوز براي فارسي در نظر گرفته شده
ممنون از راهنماییت.
1) عدد 1 به چهمنظوری به کار میره؟
2)منظورم از اینکه راه دیگه هم وجود داره این بود که آیا راهی وجود داره که در صورت عدم وجود و نصب اسکریپ های فارسی متوجه شد و پیغام مناسبی داد؟
این شناسه محلی واسه انگلیسی چی هست ؟
3)میشه در مورد [cdFullOpen] در کد زیر بیشتر توضیح بدی؟
ColorDialog1.Options := [cdFullOpen] ;
if ColorDialog1.Execute then
Color := ColorDialog1.Color ;
پیشاپیش ممنون از لطفت
merced
شنبه 04 مهر 1388, 05:16 صبح
درباره LoadKeyboardLayout اين تاپيك رو بخون
http://msdn.microsoft.com/en-us/library/ms646305(VS.85).aspx
براي نصب فارسي هم قبلاً زياد بحث شده اينجا رو بخون
http://www.barnamenevis.org/forum/showthread.php?t=71149
و اما در مورد ColorDialog
گفتيد كه مي خواي Custom Panel رو ببينه . اون پراپرتي رو (cdFullOpen) بايد توي پراپرتي Option برابر True قرار بدي.
ولي براي ذخيره رنگهايي كه كاربر در CustomPanel قرار ميده كه دفعات بعد ببينتشون بايد اون رنگ ها ذخيره بشند . مثلاً
ColorDialog1.CustomColors. LoadFromFile('asas');
ColorDialog1.Execute ;
ColorDialog1.CustomColors.SaveToFile('asas');
amir_ir
شنبه 04 مهر 1388, 17:39 عصر
و اما در مورد ColorDialog
گفتيد كه مي خواي Custom Panel رو ببينه . اون پراپرتي رو (cdFullOpen) بايد توي پراپرتي Option برابر True قرار بدي.
ولي براي ذخيره رنگهايي كه كاربر در CustomPanel قرار ميده كه دفعات بعد ببينتشون بايد اون رنگ ها ذخيره بشند . مثلاً
وقتی کاربر رنگ مورد نظرشو انتخاب کرد آیا راهی وجود داره که به صورت یکجا ، همه فرم ها رو به این رنگ تغییر داد یا باید تک به تک واسه تغییر رنگ هر فرم کد نوشت ؟
ممنون از پیگیری ها و راهنمایی های همه دوستان
ghasemshami
شنبه 04 مهر 1388, 18:00 عصر
از خاصیت OnEnter هر edit برای تغییر زبان استفاده کن
LoadKeyboardLayout('00000429',1);
عدد اول که شماره شناسایی زبان فارسی داخل ویندوز هستش و عدد دوم برای تثبیت زبان
و برای سوال دوم از شی ColorDialog از سربرگ Dialog استفاده کن و هنگام بسته شدن این شی دستور بده که رنگ فرم با رنک دیالوگ یکی بشه
merced
شنبه 04 مهر 1388, 18:02 عصر
var i : Integer ;
begin
for i := 0 to Application.ComponentCount -1 do
if Application.Components[i] is TForm then
TForm(Application.Components[i]).Color := clRed ;
amir_ir
شنبه 04 مهر 1388, 21:47 عصر
ممنونم از همکاری و راهنماییهات
ColorDialog1.CustomColors. LoadFromFile('asas');
ColorDialog1.Execute ;
ColorDialog1.CustomColors.SaveToFile('asas');
Merced عزیز ، فایل asas چیه؟ از چه جنسی هست؟ کجا و به چه شکل ایجادش کنم ؟ حالت های رو که حدس می زدم رو امتحات کردم نشد .
روی یک فرم یک button گذاشتم و کد زیررو نوشتم :
ColorDialog1.Options := [cdFullOpen ] ;
If ColorDialog1.Execute then
begin
ColorDialog1.CustomColors.SaveToFile('asas.txt');
For i:= 0 to Application.ComponentCount -1 do
begin
If Application.Components[i] is TForm then
TForm( Application.Components[i]).Color:=ColorDialog1.Color;
end;
end;
تا اینجا برنامه خوب کار میکنه و با کد زیر
ColorDialog1.CustomColors.SaveToFile('asas.txt'); سعی می کنم رنگ مورد نظر رو در فایل asas ذخیره کنم .
----------------------
سپس در onshow فرم کد زیر رومی نویسم :
ColorDialog1.CustomColors. LoadFromFile ( 'asas.txt' ) ;
ولی بعد از بستن برنامه و اجرای دوباره ، رنگ پیش فرض خود دلفی نمایش داده میشه.
میشه قسمت save رنگ رو بیشتر توضیح بدید؟ چی بنویسم و کجا؟
از لطفت ممنون
merced
شنبه 04 مهر 1388, 23:21 عصر
خيلي ساده است.
شما Custom Colors رو پر كردي .
http://www.gigaimage.com/images/nm94alywwa9ofa77zp.jpg
حالا مي خواي ذخيره اش كني :
يه خورده برنامه رو اصلاح مي كنم. اول از همه موقعي كه دكمه تغيير رنگ رو توي برنامه مي زنه
اول Custom Colors پربشه از رنگايي كه قبلاً پر كرده
رنگ پيش فرض ديالوگ هم بشه رنگ فرم جاري مثلاً
بعد از انتخاب رنگ مورد نظر علاوه بر اعمال اون اون رنگ رو ذخيره مي كنيم. من توي يك ini ذخيره مي كنم.
var myini : TIniFile ;
begin
if FileExists('c:\a.txt') then
ColorDialog1.CustomColors.LoadFromFile('c:\a.txt') ;
ColorDialog1.Color := Color ;
if ColorDialog1.Execute then begin
ColorDialog1.CustomColors.SaveToFile('c:\a.txt');
Color := ColorDialog1.Color ;
myini:=TIniFile.Create(ChangeFileExt( Application.ExeName, '.ini' ));
myini.WriteInteger('main','color',ColorDialog1.Col or);
myini.Free ;
end ;
حالا رويداد Create فرم .
var myini : TIniFile ;
begin
myini:=TIniFile.Create(ChangeFileExt( Application.ExeName, '.ini' ));
Color := myini.ReadInteger('main','color', clBtnFace);
myini.Free ;
توجه كن كه ذخيره كردن custom colors يه چيز ديگه بود
و توجه بعدي اين كه inifiles رو به uses ها اضافه كني
amir_ir
یک شنبه 05 مهر 1388, 13:48 عصر
واقعا به من لطف کردی و با حوصله جواب دادی. ممنون
فایل های ini چی هستن و چه قابلیتی دارن ؟
در قسمت تعریف متغیر ها نوشتم ;myini : TiniFile . ولی میگه باید declare بشه .
تعریف myini و TIniFile رو بلد نیستم. کاملا متوجه نشدم . احساس می کنم باید برنامشو واسه بار اول ببینم تا متوجه بشم و بتونم ازش استفاده کنم. در هر حال خیلی ممنونم.
اگر واست زمانی مقدور بود که فایل دلفی و سورسشو اینجا share کنی که بتونم اجراش کنم و متوجه بشم ممنون میشم .
ممنووووووووووووون
merced
یک شنبه 05 مهر 1388, 15:17 عصر
گفته بودم براي استفاده از ini بايد اون عبارت inifiles رو توي uses اضافه كني
ini ها فايل هايي براي ذخيره اطلاعات بصورت دسته بندي شده هستند و بيشتر براي دخيره تنظيمات استفاده مي شه
توي همين سايت مي توني نمونه هايي پيدا كني
amir_ir
دوشنبه 06 مهر 1388, 13:25 عصر
سلام .ممنون . مشکل حل شد.
سعی کردم چیزهایی غیر از فرم ها رو هم بتونم با این کد رنگشونو توی همه فرم ها تغییر بدم مثلا Dbgrid کلیه فرم ها . ولی فقط رنگ dbgrid همون فرم تعویض میشه . بجای
Application.Components[i] چی میشه نوشت که مثلا به Dbgrid ها دسترسی داشت ؟
باز هم ممنون :چشمک:
merced
دوشنبه 06 مهر 1388, 18:16 عصر
var i, j : Integer ;
begin
for i := 0 to Application.ComponentCount - 1 do
if Application.Components[i] is TForm then
for j := 0 to Application.Components[i].ComponentCount - 1 do
if Application.Components[i].Components[j] is TDBGrid then
TDBGrid(Application.Components[i].Components[j]).Color := clRed ;
amir_ir
جمعه 10 مهر 1388, 18:43 عصر
سلام
با استفاده از کد زیر رنگ همه formها و panel ها را به رنگ دلخواه تغییر میدم و رنگ فرم ها هم ذخیره میکنم که وقتی برنامه بسته شد و دوباره اجرا شد ، فرم ها به همون رنگ دلخواه قبلی نمایش داده بشن ولی رنگ panelها ذخیره نمیشن و بعد از اجرای مجدد برنامه به همون رنگ پیش فرض دلفی(clBtnFace) نمایش داده میشن.
حالا برای ذخیره کردن رنگ panel ها باید چیکار کنم .
ممنون
if FileExists('c:\a.txt') then
ColorDialog1.CustomColors.LoadFromFile('c:\a.txt') ;
ColorDialog1.Color := Color ;
ColorDialog1.Options := [cdFullOpen ] ;
If ColorDialog1.Execute then
begin
ColorDialog1.CustomColors.SaveToFile('c:\\a.txt');
For icolor:= 0 to Application.ComponentCount -1 do
begin
If Application.Components[icolor] is TForm then
TForm( Application.Components[icolor]).Color:=ColorDialog1.Color;
for jcolor := 0 to Application.Components[icolor].ComponentCount - 1 do
if Application.Components[icolor].Components[jcolor] is Tpanel then
TDBGrid(Application.Components[icolor].Components[jcolor]).Color := ColorDialog1.Color ;
end;
myini:=TIniFile.Create(ChangeFileExt( Application.ExeName, '.ini' ));
myini.WriteInteger('main','color',ColorDialog1.Col or);
myini.Free;
end;
اگر دوستان لطف کنن 3 خط آخر رو که روی فایل ini کار کرده رو توضیح بدن که دقیقا چه کاری انجام میده ممنون میشم.
main که در خط دوم به کار رفته به چی اشاره داره؟
merced
جمعه 10 مهر 1388, 20:32 عصر
يه شبه كد برات مي نويسم راه بيفتي (اين براي لود اطلاعات از ini هست و براي ذخيره كردن هم دقيقاً برعكس عمل مي شه به حاري ReadInteger از WriteInteger استفاده ميشه
var
_FormColor , _GridColor , _PanelColor : TColor ;
_Ini : TIniFile ;
begin
_Ini :=TIniFile.Create(ChangeFileExt( Application.ExeName, '.ini' ));
_FormColor := _Ini.ReadInteger('ColorSection','Forms', clBtnFace) ;
_GridColor := _Ini.ReadInteger('ColorSection','Grids', clWindow) ;
_PanelColor := _Ini.ReadInteger('ColorSection','Panels', clBtnFace) ;
// با اين قسمت فوق اطلاعات رو مي خونيم
For i:= 0 to Application.ComponentCount -1 do
begin
If Application.Components[i] is TForm then
TForm( Application.Components[icolor]).Color:=_FormColor;
for j := 0 to Application.Components[i].ComponentCount - 1 do
if Application.Components[i].Components[j] is TPanel then
TPanel(Application.Components[i].Components[j]).Color := _PanelColor
else if Application.Components[i].Components[j] is TDBGrid then
TDBGrid(Application.Components[i].Components[j]).Color := _GridColor ;
end;
اين كه خود كد شد :قهقهه:
ساختار فايلهاي ini اينطوريه كه مي تونه شامل چند قسمت باشه و هر قسمت چند متعير مي تونه داشته باشه
به سادگي مي تونيد توي Help دلفي دربارش مطلب پيدا كنيد //
ghasemshami
جمعه 10 مهر 1388, 21:49 عصر
خب کار ساده تری کن و بانک براش درست کن
Mahmood_M
جمعه 10 مهر 1388, 23:00 عصر
شاید این مقاله هم مفید باشه :
مقاله : استفاده از فایلهای INI (http://barnamenevis.org/forum/showthread.php?t=79040)
موفق باشید ...
merced
شنبه 11 مهر 1388, 00:29 صبح
خب کار ساده تری کن و بانک براش درست کن
اينم يك راهشه :ناراحت:
البته استفاده از فايلهاي ini و استفاده از رجيستري خيلي بهتره . به دلايل متعدد كه اينجا جاش نيست و سواد من هم اونقدر نيست
amir_ir
شنبه 11 مهر 1388, 10:02 صبح
سلام
ممنون از راهنمایی همه دوستان
حالا که متغیر هایی از جنس Tcolor تعریف کردیم ، آیا لازم هست چیزی رو هم Use کنیم ؟ مثل Tinifile ها که inifiles رو Use میکنیم .
از این خط برنامه
_FormColor := myIni.writeInteger('ColorSection','Forms', clBtnFace) ;
خطای زیر رو میگیره :
IncompatibleTypes : 'Tcolor ' and 'Procedure', Untyped pointer or untyped parameter
ممنون میشم راهنماییم کنید
Mahmood_M
شنبه 11 مهر 1388, 14:27 عصر
از این خط برنامه
کد:
_
FormColor := myIni.writeInteger('ColorSection','Forms', clBtnFace) ;
خطای زیر رو میگیره :
کد:
IncompatibleTypes : 'Tcolor ' and 'Procedure', Untyped pointer or untyped parameter
ممنون میشم راهنماییم کنید
WriteInteger مقدار برگشتی نداره که در FormColor قرار بگیره ، و نکته ی دیگه اینکه WriteInteger یک مقدار رو در فایل INI ثبت میکنه ...
برای خوندن از فایل INI باید از ReadInteger استفاده کنید :
FormColor := myIni.readInteger('ColorSection','Forms', clBtnFace);
اگر در استفاده از این توابع مشکل دارید ، توصیه می کنم مقاله ای که معرفی کردم رو بخونید ...
موفق باشید ...
amir_ir
شنبه 11 مهر 1388, 19:16 عصر
سلام به همه دوستان
فکر نمی کنید کد زیرمشکلی داشته باشه؟
if FileExists('c:\a.txt') then
ColorDialog1.CustomColors.LoadFromFile('c:\a.txt') ;
ColorDialog1.Color := Color ;
ColorDialog1.Options := [cdFullOpen ] ;
If ColorDialog1.Execute then
begin
ColorDialog1.CustomColors.SaveToFile('c:\a.txt');
For icolor:= 0 to Application.ComponentCount -1 do
begin
If Application.Components[icolor] is TForm then
TForm( Application.Components[icolor]).Color:=ColorDialog1.Color;
for jcolor := 0 to Application.Components[icolor].ComponentCount - 1 do
if Application.Components[icolor].Components[jcolor] is Tpanel then
TDBGrid(Application.Components[icolor].Components[jcolor]).Color := ColorDialog1.Color ;
end;
myini:=TIniFile.Create(ChangeFileExt( Application.ExeName, '.ini' ));
myIni.writeInteger('main','color', ColorDialog1.Color) ;
myIni.writeInteger('colorsection','grids', ColorDialog1.Color) ;
myIni.writeInteger('colorsection','panels', ColorDialog1.Color) ;
myini.Free;
end;
//================================================== ==================
و برای خوندنش می نویسیم :
myIni :=TIniFile.Create(ChangeFileExt( Application.ExeName, '.ini' ));
_FormColor := myIni.readInteger('colorsecton','forms', clBtnFace) ;
_GridColor := myIni.readInteger('ColorSection','Grids', clWindow) ;
_PanelColor := myIni.readInteger('ColorSection','Panels', clBtnFace) ;
myini.Free;
کد بالا رنگها رو ذخیره نمیکنه یا اگر ذخیره میکنه نمیتونه در هنگام اجرای دوباره ازش بخونه و پس از اجرای دوباره رنگ های پیش فرض دلفی نمایش داده میشن
ولی کد زیر کاملا کار میکنه. تفاوت و علت رو پیدا نمی کنم
if FileExists('c:\a.txt') then
ColorDialog1.CustomColors.LoadFromFile('c:\a.txt') ;
ColorDialog1.Color := Color ;
ColorDialog1.Options := [cdFullOpen ] ;
If ColorDialog1.Execute then
begin
ColorDialog1.CustomColors.SaveToFile('c:\a.txt');
For i:= 0 to Application.ComponentCount -1 do
begin
If Application.Components[i] is TForm then
TForm( Application.Components[i]).Color:=ColorDialog1.Color;
end;
end;
myini:=TIniFile.Create(ChangeFileExt( Application.ExeName, '.ini' ));
myini.WriteInteger('main','color',ColorDialog1.Col or);
myini.Free;
//================================================== ==============
و برای خوندنش می نویسیم :
myini:=TIniFile.Create(ChangeFileExt( Application.ExeName, '.ini' ));
Color := myini.ReadInteger('main','color', clBtnFace);
myini.Free ;
merced
یک شنبه 12 مهر 1388, 19:10 عصر
شما بعد از خوندن باید متغیرهای _FormColor و ... رو به کامپوننت ها تخصیث بدین
دقیقاً اون حلقه های تودرتو که موقع انتخاب اجرا شد اینجا هم باید با مقادیر جدید که از ini خونده میشه تکرار بشه
ZonLine
سه شنبه 21 مهر 1388, 15:14 عصر
سلام دوست عزیز
sara_xz
شما باید در قسمت کد نویسی در دلفی به این صورت عمل کنید
در اولین خط کلمه unit رو دارید که اسم فایل دلفی شما رو بعدش نوشته بعد از اون interface رو داریدو بعد از اون uses رو دارید که در این قسمت می بایست IniFiles رو هم اضافه کنید تا اون مشکل خطا declare حل بشه
یعنی همون طور که دوستمون گفته یک متغیر به صورت ;myini : TiniFile در قسمت var تعریف کنید در هنگامی که این فرم نمایش داده میشه یعنی onShow فرم کد ساختن این متغیر myini و ارتباط اون با فایل ini و خواندن مقادیر از داخلش رو بنویسید به شکل زیر
بعد از این ماجرا می توانید از همه امکانات فایل های ini که دوست خوبمون توضیح دادن استفاده کنید
procedure TForm1.FormShow(Sender: TObject);
var myini : TIniFile ;
begin
myini:=TIniFile.Create(ChangeFileExt( Application.ExeName, '.ini' ));
Color := myini.ReadInteger('main','color', clBtnFace);
myini.Free ;
end;
ایشاالله که مشکلتون حل شه.
Ebrahim Asadi
چهارشنبه 22 مهر 1388, 15:05 عصر
سلام
كامپوننت زير را نصب كن و روي فرم برنامه ات قرار بده. با استفاده از آن مي تواني به راحتي زبان
صفحه كليد را از فارسي به انگليسي و بالعكس، تغيير دهي.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.