ورود

View Full Version : سوال: مشکل در کار با رجیستری



sajioo
سه شنبه 28 خرداد 1392, 10:47 صبح
دوستان عزیزم سلام
من یک سری اطلاعات از وب بروزر روی فرم برنامه دریافت می کنم.
دقت کردم و متوجه شدم در ویندوز 7 اگه حالت پیشفرض فرمت ویندوز بر روی انگلیسی باشه ( یعنی عکس شماره 1 ) اطلاعات بصورت نادرست و غلط ( به قول معروف خرچنگ قورباغه ) نمایش داده میشه :لبخند:
105757
اما اگه حالت پیشفرض پرشین باشه ( یعنی عکس شماره 2 ) آنگاه اطلاعات درست نمایش میشه.
105756
پس از جستجو با کد زیر تونستم از طریق رجیستری این مورد رو تغییر بدم و به پرشین تبدیل کنم.

RegSetString(HKEY_CURRENT_USER,'Control panel\International','localename','Fa-IR');

function RegSetString(key:Hkey; subkey,name,value:string):boolean;
var
regkey:hkey;
begin
result := false;
RegCreateKey(key,PChar(subkey),regkey);
if RegSetValueEx(regkey,Pchar(name),0,2,pchar(value), length(value)) = 0 then
result := true;
RegCloseKey(regkey);
end;

حالا سوال اصلی من اینکه
در این حالت با اینکه حالت پیشفرض به پرشین تغییر داده میشه اما باز هم اطلاعات درست نمایش داده نمیشه. اما اگه دوباره از کنترل پنل به صورت دستی تغییرش بدیم به پرشین درست میشه.
فکر می کنم بجزlocalename چیز دیگه ی هم باید تغییر کنه که با توجه به رجیستری و یندوز ( عکس شماره 3 ) من تغییرات زیر را هم اعمال کردم که جواب نداد .

RegSetString(HKEY_CURRENT_USER,'Control panel\International','localename','Fa-IR');
RegSetString(HKEY_CURRENT_USER,'Control panel\International','scountry','Iran');
RegSetString(HKEY_CURRENT_USER,'Control panel\International','slanguage','FAR');
RegSetString(HKEY_CURRENT_USER,'Control panel\International','Locale','00000429');
RegSetString(HKEY_CURRENT_USER,'Control panel\International','iCountry','981');
105755
دوستان در ضمن من از کامپپوننت های tnt هم استفاده کردم که بی نتیجه بود باز .
اگه کسی هست در این مورد یا شاید راه دیگری داره حتما بهم پیشنهاد بده.تشکر:قلب:

BORHAN TEC
سه شنبه 28 خرداد 1392, 14:04 عصر
سلام
مهمترین دلیلش اینه که شما از یکی از نسخه های فسیل شده دلفی استفاده می کنید و دلیل بعدش هم اینه که شما بعد از اعمال تغییرات در رجستری باید یک بار دیگر رجیستری را لود کنید. برای لود کردن دوباره رجیستری بهتره که از روش زیر استفاده کنید:
Uses ShlObj

SHChangeNotify(SHCNE_ASSOCCHANGED, 0, nil, nil);

منبع:
http://forum.tuts4you.com/topic/25553-delphi-reload-registry-settings/

موفق باشید...

sajioo
چهارشنبه 29 خرداد 1392, 08:02 صبح
مهمترین دلیلش اینه که شما از یکی از نسخه های فسیل شده دلفی استفاده می کنید
نسخه ی فسیل و رو به انقراض و دوست داشتنی 7 :لبخند:

عد از اعمال تغییرات در رجستری باید یک بار دیگر رجیستری را لود کنید
باز نشد :افسرده:

یوسف زالی
چهارشنبه 29 خرداد 1392, 08:57 صبح
سلام.
روش استانداردی نیست آخه.


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

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

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

sajioo
چهارشنبه 29 خرداد 1392, 12:15 عصر
اما اگر اصرار به این کار دارید یک بار Explorer رو از حافظه خارج کرده دوباره ران کنید.
اینو دقیقا نفهمیدم چکار کنم؟ یوسف جان فکر کنم ایراد اصلی به همین وب بروزر برگرده! چطور explorer رو خارج کنم؟

ما که مجبوریم رو همین ورژن باشیم. پس هنوز منقرض نشده
پس فقط من نیستم :قهقهه:

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

sajioo
چهارشنبه 29 خرداد 1392, 12:33 عصر
شما بعد از اعمال تغییرات در رجستری باید یک بار دیگر رجیستری را لود کنید. برای لود کردن دوباره رجیستری بهتره که از روش زیر استفاده کنید
آقای عشایری عزیز
با این کدی که شما گفتی دقیقا رجیستری لود میشه اما من فکر کنم ایراد کار از وب بروزر روی فرم باشه . چون وقتی من اطلاعات روی وب بروزر رو چک می کنم دقیقا مثلا در ادیت باکس مربوطه نوشه شده " سایت برنامه نویس (http://www.barnamenevis.org) " اما در label یا tntlabel روی فرم این نمایش به این صورت ؟؟؟؟؟؟ میشه . حالا اگه دستی فرمت رو بکنم پرشین درست میشه .
خیلی عجیبه برام. کدهای که اطلاعت رو از وب بروزر میگیره براتون میزام

function TwebBrowser3.WebFormGet(const formNumber: Integer;
const document: IHTMLDocument2): IHTMLFormElement;
var
forms: IHTMLElementCollection;
begin
forms := document.forms as IHTMLElementCollection;
Result := forms.item(formNumber, '') as IHTMLFormElement;
end;

procedure TwebBrowser3.getformvalue(const document: IHTMLDocument2;
const formNumber: integer; const fieldName, newValue: string;l:string);
var
form : IHTMLFormElement;
field: IHTMLElement;
textField: IHTMLTextAreaElement;
x:string;
begin
form := WebFormGet(formNumber, document) ;
field := form.Item(fieldName,'') as IHTMLElement;


if field = nil then Exit;
if field.tagName = 'INPUT' then
begin
x:= (field as IHTMLInputElement).value;
tntlabel1.caption:=x;

end
else if field.tagName = 'TEXTAREA' then
begin
textField := field as IHTMLTextAreaElement;
x := textField.value;
tntlabel1.caption:=x;
end;
end;

شاید هم باید تو رجیستری یک تغییری توی اکسپلورر ویندوز بدم که وب بروزر هم درست جواب ده.شاید
به هر حال من فکر کنم ایراد به وب بروزر و نحوه ی دریافت اطلاعات از اون برمیگرده:متفکر:

یوسف زالی
چهارشنبه 29 خرداد 1392, 12:58 عصر
منظور من Explorer هست نه اینترنت اکسپلورر.
خود Explorer مثل MyComputer.
این کار باعث رفرش شدن رجیستری می شه.
راهنمایی:
TaskKill /IM Explorer.exe /f

sajioo
چهارشنبه 29 خرداد 1392, 13:40 عصر
منظور من Explorer هست نه اینترنت اکسپلورر.
خود Explorer مثل MyComputer.
این کار باعث رفرش شدن رجیستری می شه.
یوسف جان این کار به نظرم جالب نیست. پست قبلیمو یک نگاه بنداز بی زحمت ببین راهی به ذهنت می رسه؟