View Full Version : سوال: در مورد یک تابع CString در MFC
bizmit
چهارشنبه 16 بهمن 1387, 16:51 عصر
سلام
من توی mfc ، یه دیالوگ درست کردم که یه کنترل کادر ویرایش داره و کاربر باید یه رشته 8 کاراکتری رو توش وارد کنه!
من یه متغیر به نام m_pin و از نوع CString به این کنترل اختصاص دادم، حالا توی تابع مربوطه، می خوام این رشته به کد اسکی تبدیل بشه تا اون کد اسکی رو بریزم تو یه آرایه ی بایتی.
می خواستم ببینم تابعی که این رشته ی کاراکتری از نوع CString رو به فرمت اسکی تبدیل کنه چیه؟
مثلا در کد:
CString m_pin;
m_pin.function();
به جای تابع function ، چی باید قرار بدم و نحوه عملکردش و ورودی و خروجی اش چه طوریه؟
البته توی msdn ، یه تابع به نام Format رو دیدم ، ولی طرز استفاده اش و اینکه آیا رشته رو به اسکی تبدیل میکنه یا نه رو متوجه نشدم!
لطفا تا حد ممکن سریع، راهنماییم کنید
ممنون
Nima_NF
چهارشنبه 16 بهمن 1387, 18:38 عصر
منظورتان را از اینکه به اسکی تبدیل کنم متوجه نشدم، در هر حال هر دو حالت را توضیح می دهم.
اگر منظورتان به char هست ( ANSI character type )، در صورتی که پروژه به صورت یونیکد کامپایل می شود و شما اسکی می خواهید از CStringA به جای CString استفاده کنید.
سپس هر جایی که خواستید مثل آرایه ای از char برگرداند به راحتی از GetBuffer استفاده کنید:
// ANSI
CStringA cStr("text");
char *sBuffer= cStr.GetBuffer( 8 );
// For both unicode or ANSI
CStringA cStr("text");
LPTSTR sBuffer= s.GetBuffer( 8 );
در پایان می توانید بافر را رها کنید:
cStr.ReleaseBuffer( );
ضمنا لزومی نیست که مقدار را در اشاره گری بریزید می توانید مستقیم در هرجایی که خواستید استفاده کنید. اگر در بخش جستجو کنید مثال ها و راه های بیشتری وجود دارد (البته اگر جستجو ایندکس سایت فعال شده باشد)
bizmit
چهارشنبه 16 بهمن 1387, 22:00 عصر
سلام
ممنون، راهنماییتون خیلی مفید بود!
من منظورم این بود که مثلا یک رشته به صورت زیر داریم:
CString str="12345678";
از طرفی می دونیم که کد اسکی کاراکترهای 1 تا 8 ، به ترتیب 31-32 ...38 هست.
حالا اگه ما بخوایم این کاراکترها به بایتهای 31 تا 38 تبدیل بشه و این مقادیر 31 تا 38 که کدهای اسکی 1 تا 8 هست، رو در یک آرایه ی بایتی بریزیم، چه کار باید بکنیم؟
آیا این دستوراتی که شما گذاشتید، همین کار رو می کنه؟
یه سوال دیگه!
من که یه پروژه MFC از نوع dialog-based درست کردم، آیا برای استفاده از کلاس CStringA ، لازم نیست هدر فایلی رو در کدها، include کنم؟
یعنی آیا خود MFC ، نوع CStringA رو به طور پیش فرض می شناسه؟
ممنون
Nima_NF
چهارشنبه 16 بهمن 1387, 22:58 عصر
سوالی که الآن پرسیدید کاملا متفاوت از اولی بود!
کارکتر 1 دارای کد معادل اسکی 31 هست، پس نیاز نیست تبدیلی صورت بگیره، محتویات هر کارکتری را در داخل یک خانه از آرایه از نوع بایت بریزید، این طوری معادل اسکی آن یعنی همان 31 ذخیره می شود.
پس یعنی وقتی می نویسید (یا تبدیل می کنید به char):
char bytes[6] = "12345";
در خانه های آرایه همان 31، 32 ، ... ذخیره می شود. char یعنی 1 بایت.
در مورد سوال دوم هم، بله پیش فرض می شناسد.
برای فهمیدن این کار فقط کافی هست آن را در جایی از کدهایتان بنویسید و با موس روی آن بایستید تا به صورت tool tip ببینید که به چه شکل تعریف شده است:
typedef ATL::CStringT< wchar_t, StrTraitMFC_DLL< wchar_t > > CStringW;
typedef ATL::CStringT< char, StrTraitMFC_DLL< char > > CStringA;
typedef ATL::CStringT< TCHAR, StrTraitMFC_DLL< TCHAR > > CString;
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.