PDA

View Full Version : کار کردن با UpdateData



alimooghashang
پنج شنبه 26 اردیبهشت 1387, 20:38 عصر
با سلام
میخواستم بدونم چطور میشه که تو برنامه دست کاری کرد و بگیم که فقط یک یا چند متغیر خاص برای ما UpdateData بشن؟
قبلا شنیده بودم که با DoDataExchange میشه
حالا نمیدونم که درست شنیدم یا نه
حالا درست هم باشه
نمیدونم که چطور باش باید کار کرد :لبخند:
ممنون میشم کمک کنید

Nima_NF
پنج شنبه 26 اردیبهشت 1387, 23:35 عصر
برای گرفتن داده ها و یا نوشتن آن ها به داخل کنترل ها باید از متدهای مربوط به آن استفاده کنید.

مثلا برای دریافت از EditBox خاصی با استفاده از ID آن به این شکل با SetDlgItemText :



// Cstring cstr; <-- defined in class

SetDlgItemText(IDC_EDIT2, cstr );

// or
SetDlgItemText(IDC_EDIT2, "This is a test" );

برای دریافت هم به همین شکل با GetDlgItemText ، و به این شکل دیگر نیازی به استفاده از UpdateData نیست.

موفق باشید

alimooghashang
جمعه 27 اردیبهشت 1387, 19:19 عصر
سلام
مرسی که جواب دادین
فقط یه سوال
این روش برای همه Object ها عمل میکنه دیگه؟
من منظورم این بود که با متغیر ها چطور کار کنیم و نزاریم اونا update بشن

مثلا اگر 70 تا متغیر بود و 20 تا باید update بشه
باید به این روش 20 تا بنویسیم؟

A_Salimi
جمعه 27 اردیبهشت 1387, 19:43 عصر
با اجازه ازنیما :

مگه کاربرد تابع UpdateData() کارش چیه ؟

این تابع برای تبادل اطلاعات بین کنترل ها و متغیرهای عضو کنترلها به کار می روند که اگه پارامتر FALSE باشه داده از متغیر به کنترل ولی اگر TRUE باشد داده ها از کنترل به متغیر اعمال میشوند .

اگه میخواهید یک سری خاص Update شوند آنها را بین UpdateData با پارامتر TRUE و درنهایت UpdateData با پارامتر FALSE قرار دهید .

alimooghashang
جمعه 27 اردیبهشت 1387, 20:03 عصر
داداش مرسی که جواب دادی

فقط میشه یه مثال هم بزنی؟

ببین من اگر Updatedata را call کنم که همه متغیر ها Update میشه

پس چطور باید کاری کنم که همه تغیر نکنه!!

درست میگم دیگه؟ وقتی updatedata فراخوانی میشه همه متغیر ها update میشن

غیر از اینه؟

A_Salimi
جمعه 27 اردیبهشت 1387, 20:19 عصر
فقط میشه یه مثال هم بزنی؟

ببین من فکر میکنم شما اگه مشکل خودت رو بنویسی بهتر باشه

ولی به عنوان یک مثال کوچک :
فرض کن میخوای در یک پروژه مبتنی بر کادر تبادلی کپشن دیالوگ رو عوض کنی :

پس به این صورت مینویسیم :



UpdateData();
SetWindowText("mycaption");
UpdateData(FALSE);

نکته : UpdateData()یعنی همان UpdateData(TRUE)


ببین من اگر Updatedata را call کنم که همه متغیر ها Update میشه پس چطور باید کاری کنم که همه تغیر نکنه!!

از جایی که میخوای تغییر نکنه بنویس UpdateData(FALSE);

alimooghashang
جمعه 27 اردیبهشت 1387, 20:55 عصر
اینطور که شما نوشتی درسته
اما من اگه خواستم با متغیر ها کار کنم چی؟
اگه همیشه اینطور برنامه نوشت که خوبه
ولی پس برا چی تو VC متغیر ها را به کار میبریم؟


مثلا من سه تا edit دارم
m_edit1
m_edit2
m_edit3
اینا متغیر هایی هست که براشون اختصاص دادم

میخوام edit1 و edit3 را update کنم اما نه با استفاده از setwindowtest
بلکه به این روش که این متغیر ها را مقدار دهی کردم ، حالا به هر طریقی تو برنامه تغیر پیدا کردن

من میخوام که تغیراتی که رو edit2 اتفاق میافته را نشون نده

تا اونجایی که من میدونم اگر updatedata بنویسیم همش اعمال میشه!!

درسته؟

یا نه

A_Salimi
شنبه 28 اردیبهشت 1387, 00:15 صبح
ا
ما من اگه خواستم با متغیر ها کار کنم چی؟

فرقی نداره که . . . خوب باز هم همونطوری مینویسی یعنی بعد از UpdateData(); به مقادیری که میخوای مقدار میدی دیگه . . . چیز زیاد سختی نیست احتمالا شما جایی رو خوب متوجه نشدید .


مثلا من سه تا edit دارم
m_edit1
m_edit2
m_edit3
اینا متغیر هایی هست که براشون اختصاص دادم

میخوام edit1 و edit3 را update کنم اما نه با استفاده از setwindowtest
بلکه به این روش که این متغیر ها را مقدار دهی کردم ، حالا به هر طریقی تو برنامه تغیر پیدا کردن
من میخوام که تغیراتی که رو edit2 اتفاق میافته را نشون نده

مفهوم UpdateData() رو در بالا اشاره کردم چیزی که هست اینه که این تابع رو دقیقتر بشناسید درحقیقت زمانی که شما میخواین چیزی در کادر نمایش داده نشه ، فقط باید اون مقدار رو بهش نسبت ندین نه این که update نکنیدش

اگه مشکل برطرف نشد سورس کدتون رو بذارین تا دقیقا بررسی کنیم که مشکل چیه .
موفق باشید

alimooghashang
شنبه 28 اردیبهشت 1387, 09:11 صبح
ا

مفهوم UpdateData() رو در بالا اشاره کردم چیزی که هست اینه که این تابع رو دقیقتر بشناسید درحقیقت زمانی که شما میخواین چیزی در کادر نمایش داده نشه ، فقط باید اون مقدار رو بهش نسبت ندین نه این که update نکنیدش



مقدار ندین که نمیشه

اومدی و تو برنامه خودش مقدار میگیره که 99% اینطوره

پس نتیجه میگیریم که این کار رو نمیشه کرد

حالا نمیدونم

شاید من اشتباه فهمیم updatedata چی کار میکنه

این سوال رو فقط حجواب بده



updatedata(true);
m_edit1;
updatedata(false);


این دستورات m_edit1 را update مییکنه یا همه متغیر ها را ؟

A_Salimi
شنبه 28 اردیبهشت 1387, 10:34 صبح
ببین کاری که شما کردی الان داره چیکار میکنه اونوقت . . .؟

m_edit1 داره آپدیت میشه اما متغیری رو دریافت نمیکنه تا اون رو نمایش بده . . . همین

Nima_NF
شنبه 28 اردیبهشت 1387, 15:20 عصر
موضوع را خیلی پیچیده کردید...

نگاه کنید UpdateData یک قابلیت در MFC هست که به شما اجازه می دهد با فراخوانی آن در رویداد هایی مثل OnOK و OnInitDialog کارها را ساده تر کنید و به جای اینکه مثلا برای 10 تا کنترل، 10 مرتبه از GetWindowText استفاده کنید فقط با یک فراخوانی UpdateData با مقدار TRUE همه مقادیر وارد شده در کنترل های داخل دیالوگ را که در DoDataExchange تعریف شده اند و به آن ها متغیر اختصاص داده اید در متغیر هایشان کپی کنید (و در همین حین نیز خودش اتومات عدد را به رشته و رشته را به عدد تبدیل می کند ) و این یعنی به جای 30 خط کد، با یک تابع این کار انجام شود.
و با فراخوانی False نیز، همه مقادیر موجود در دیالوگ (به شکل قبل) به کنترل های مرتبط خودشان کپی می شود (و این عمل یعنی بیش از 30 خط کد دیگر که شامل SetWindowText و تبدیلات داده ای می باشد، اما از دید شما پنهان است.)

نکته ای که باید توجه کنید این است که استفاده از UpdateData کلا از طرف برنامه نویسان مطرح توصیه نمی شود مگر در مواردی که کنترل های شما زیادند و می خواهید همه کنترل ها Update شوند، بدانید که در کتاب های مرجع MFC نیز بسیار کم استفاده می شود.
اما در هر حال در استفاده از آن باید دقت بسیار زیادی انجام شود، پس اگر می خواهید به شکل درستی برنامه بنویسید باید از متدهای مربوط به کار با کنترل ها استفاده کنید یعنی از همان SetWindowText و امثال آن.

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

برای درک بهتر حتما کل مقاله زیر را مطالعه کنید که روش های جایگزین UpdateData را به همین شکل توضیح می دهد:
http://www.flounder.com/getdlgitem.htm

برای مشاهده یک نمونه ساده نیز در انتهای مقاله زیر، نحوه پیاده سازی متد OnChangeFirstName را مشاهده کنید:
http://www.functionx.com/visualc/controls/editbox.htm

ضمنا جناب alimooghashang ، می توانم بپرسم از چه مرجعی برای یادگیری MFC استفاده کرده اید؟

موفق باشید

alimooghashang
شنبه 28 اردیبهشت 1387, 16:19 عصر
ببین کاری که شما کردی الان داره چیکار میکنه اونوقت . . .؟

m_edit1 داره آپدیت میشه اما متغیری رو دریافت نمیکنه تا اون رو نمایش بده . . . همین

شرمنده



m_edit="This is a test!";


1- پس با این کار فقط این متغیر update میشه؟
2- یا updatedata کلا تمام متغیر ها را update میکنه؟
فقط میخوام مطمئن بشم! جواب سوال رو با بله و خیر بدین

مرسی

alimooghashang
شنبه 28 اردیبهشت 1387, 16:25 عصر
ضمنا جناب alimooghashang ، می توانم بپرسم از چه مرجعی برای یادگیری MFC استفاده کرده اید؟


اقا از جواب بسیار مفید و کاملت ممنونم

من قبلا از روی جعفر نژاد (کتاب سبز) خوندم خیلی بدم اومد و کلا زده شدم ازش

ولی الان دارم از روی visual c++.net در 21 روز از دیویس چاپمن را میخونم و تقریبا خیلی بهتر از همه توضیح داده

تا اونجا که من کتاب دیدم
بازم ممنونم که جواب منو دوستان میدن:تشویق::قلب: