PDA

View Full Version : مشکل عجیب در ارتباط دلفی 2010 و فایلهای dbf



saeed_82
چهارشنبه 08 اردیبهشت 1389, 19:46 عصر
من برنامه ای دارم که متون استرینگهای تحت ویندوز رو به سیستم داس تبدیل میکنه (برای سازگاری برنامه با سیستمهای قدیمی تامین اجتماعی و تهیه دیسکت حقوق)
برنامه من در دلفی 7 به خوبی کار میکرد و لی وقتی اونرو به دلفی 2010 بردم وقتی بعضی حروف در بانک فاکس قدیمی وارد میشوند کد اونها تغییر پیدا میکنه و اون استرینگ دیگه قالبش رو از دست میده
مثلا وقتی کلمه "سامانی" رو تبدیل میکنم نتیجه حاصله "س؟؟؟نی" میشه که دلیلش اینه که کدهای حرف 1 که 145 در داس است در هنگام ذخیره در بانک dbf به کد 63 تغییر میکنه
نمیدونم دلیلش چیه
این برنامه با همین کد در دلفی 7 درست کار میکنه
کسی هست که چنین مشکلی رو تجربه کرده باشه

Felony
چهارشنبه 08 اردیبهشت 1389, 20:34 عصر
به خاطر این هست که دلفی 7 انسی هست ولی دلفی 2010 یونیکد ، برو تو کار TypeCast کردن ، احتمالا مشکلت رو حل میکنه ، همین TypeCast رو بسرچ !

saeed_82
پنج شنبه 09 اردیبهشت 1389, 18:04 عصر
جالبه که این کدها فقط در هنگام ورود به بانکهای dbf بهم میخورند و با بانکهای دیگه مشکل ندارند

Felony
پنج شنبه 09 اردیبهشت 1389, 18:15 عصر
جالبه که این کدها فقط در هنگام ورود به بانکهای dbf بهم میخورند و با بانکهای دیگه مشکل ندارند

خوب مشکل دقیقا همینه دیگه چونه خود این بانک ها هم Ansi هستن ، البته من تا به حال باهاشون کار نکردم و در حد اطلاعاتی که چند جا خوندم این رو میگم و مطمئن نیستم .

saeed_82
پنج شنبه 09 اردیبهشت 1389, 18:23 عصر
آیا تابعی میشناسید که یونیکد و به انسی تبدیل کنه؟

Felony
پنج شنبه 09 اردیبهشت 1389, 18:46 عصر
میتونید روی متن خودتون با pAnsiChar و pWideChar عملیات TypeCasting رو انجام بدید .

saeed_82
جمعه 10 اردیبهشت 1389, 10:13 صبح
اصلا فکر نمیکنم مشکل Typecast باشه چون تابع من خروجی و با کد انسی میده ولی وقتی میره توی تیبل و برمیگرده دیگه ماهیتش از دست رفته
مثلا وقتی من حرف م رو به تابع میدم خروجی اون برای ایران سیستم کاراکتری با کد 245 هست و درسته ولی وقتی همین کارکتر کد 245 توی جدول dbf میره و برمیگرده میشه کد 63
من که رشته رو با یونیکد نمیفرستم توی جدول که بهم بخوره پس چطور این اتفاق میافته؟

Felony
جمعه 10 اردیبهشت 1389, 11:16 صبح
اگر میتونید کد و بانکتون و ... رو قرار بدبد تا ببینم ، البته من گفتم که مطمئن نیستم .

saeed_82
جمعه 10 اردیبهشت 1389, 15:49 عصر
شما میتونید این کد ساده رو با هر بانک dbf ی امتحان کنید

Table1.Open;
Table1.EmptyTable;
Table1.Append;
Table1DSK_NAME.Value:=chr(245);
Table1.Post;
s2:=Table1DSK_NAME.AsString;
ShowMessage(IntToStr(Ord(s2[1])));

با کمال تعجب خروجی شما دیگه 245 نیست بلکه 63 است.
ولی همین کد توی دلفی 7 درست جواب میده
لطفا اگه کسی راه حلی داره ارائه بده
ممنون

در اینجا s2 یک متغیر استرینگ است.
Table1 هم میتونه یک بانک dbf مثل زیر باشه

saeed_82
جمعه 10 اردیبهشت 1389, 15:51 عصر
جدول نمونه قبلی

vcldeveloper
جمعه 10 اردیبهشت 1389, 19:46 عصر
شما میتونید این کد ساده رو با هر بانک dbf ی امتحان کنید
ببین دوست عزیز، وقتی با داده های ANSI در یک محیط یونیکد کار می کنید، باید خیلی مواظب باشید.
الان این کدی که شما نوشتید، Chr یک رشته Ansi بر میگردونه، ولی Table1DSK_NAME با خصوصیت Value خودش مقدار Variant دریافت میکنه، و با AsString هم یک رشته یونیکد برمیگردونه. IntToStr هم که مقدار یونیکد بر میگردونه.

خب وقتی اینطوری مقادیر ANSI و یونیکد رو در کد با هم قاطی می کنید، نباید انتظار نتایج درست هم داشته باشید.

saeed_82
یک شنبه 12 اردیبهشت 1389, 17:05 عصر
در پاسخ آقای کشاورز ضمن تشکر از توجه ایشون به این مطلب باید عرض کنم که بنده برای امتحان اومدم با این کد:
Table1.Append;
Table1DSK_NAME.Value:=chr(245);
Table1.Post;
کاراکتر معادل کد 245 رو در تیبل ذخیره کردم البته در دلفی 2010
بعد محتوای فیلد مورد نظر رو در دلفی 7 فراخوانی کردم ولی باز تغییر ساختار کد از 245 به 63 مشاهده شد یعنی توی همون خط دوم کد وقتی میخواد کاراکتر وارد فیلد بانک بشه از 245 به 63 تغییر میکنه و به اونجا نمیرسه که بخواد به Asstring یا Inttostr تغییر ایجاد بشه
به نظر شما بخاطر اینکه این اتفاق نیفته من چطور باید این کاراکتر رو به Tableبفرستم؟
درضمن جالبه که توی دلفی 2010 اگه روی خط دوم کد روی عبارت Value با ماوس چند لحظه مکث کنید نشون میده که این مقدار با فرمت AnsiString ذخیره میشه ولی نمیدونم چرا این مشکل پیش میاد؟