PDA

View Full Version : سوال: دسترسی به کنترلهای یک فرم توسط کلاس



30yamand
پنج شنبه 25 آذر 1395, 12:47 عصر
با سلام و خسته نباشید خدمت اساتید

میخواستم بدونم چه جوری میشه خاصیت های یک کنترل مثلا label به وسیله یک کلاس تغییر داد (مثلا رنگش رو تغییر بدیم)
هر کاری کردم نتونستم بهش دسترسی پیدا کنم ممنون میشم کمکم کنید

hamid_hr
پنج شنبه 25 آذر 1395, 12:54 عصر
public class cl1
{
pulic void changecolor(lable l){
l.backcolor = color.red;
{
{


بعد این تابع رو صدا میزنی و لیبل رو براش میفرستی بعد رنگ پس زمینه میشه قرمز

30yamand
پنج شنبه 25 آذر 1395, 16:55 عصر
دوست عزیز این کارو کردم اما نشد

ببین من یک فرم دارم یک قسمتش مثل چراغ راهنما کار میکنه، 5 تا کلاس هم دارم که هر کدومش یه فایل جدا داره
حالا من میخوام تو یکی از این کلاسا اگه کاری که میخوام انجام بدم انجام بشه بتونم به label مورد نظر دسترسی پیدا کنم و رنگش رو عوض کنم
مشکلم اینه که نمی تونم به label دسترسی داشته بام

30yamand
جمعه 26 آذر 1395, 17:10 عصر
دوستان کسی نبود کمک کنه!!!
من متدی که تو کلاس فرمم نوشتم رو تو یک کلاس دیگه فراخوانی میکنم اما تغیراتی که میخوام رو انجام نمیده( رنگ label رو برام عوض نمیکنه) دلیلش چیه، اگه کسی میتونه لطفا راهنمایی کنید
کد کلاس فرم:

public void Changer()
{
if (lbl1.BackColor != Color.Red &&2.BackColor != Color.Green)
{
lbl1.BackColor = Color.Red;
lbl2.BackColor = Color.Green;
}
else
{
lbl1.BackColor = Color.Green;
lbl2.BackColor = Color.Red;
}
}

کد کلاس دوم برای اجرای متد Changer

public void Move()
{
Form1.Changer();
}

m2011kh
جمعه 26 آذر 1395, 19:34 عصر
مطمئن شو که در فایل Form1.Design.cs کنترل مورد نظر به صورت Public تعریف شده باشه. اگه میخوای خواص کنترل رو از یک شیء دیگه تغییر بدی. و اگه نخ شئ دوم با نخ اصلی برنامه فرق میکنه (اگه به صورت چند نخی داری مینویسی) میتونی از تابع Label.BeginInvoke استفاده کنی.

و البته این که در تابعی که در شیء دیگری هست کنترل رو به صورت پارامتر ارسال کن.


موفق و سربلند باشيد.
M.M.D

30yamand
شنبه 27 آذر 1395, 12:21 عصر
ممنون
m2011kh (http://barnamenevis.org/member.php?187796-m2011kh)
عزیز

این کارا رو انجام دادم جواب نگرفتم
کار با
BeginInvoke رو بلد نیستم ، اگه لطف کنی بگی چطور کار میکنه ممنون میشم( به صورت چند نخی ننوشتم)

m2011kh
یک شنبه 28 آذر 1395, 02:04 صبح
بهتره که از تابع BeginInvoke استفاده نکنی اگه به صورت چند نخی نمینویسی. اصلا کار درستی نیست. سورس پروژه ات رو بزار اون قسمتی که مشکل داره رو برات اصلاح میکنم، بعدا خودت ببین چطوری شده.

سورست رو ضمیمه کن.

موفق و سربلند باشید.
M.M.D

hamid_hr
یک شنبه 28 آذر 1395, 09:41 صبح
دوستان کسی نبود کمک کنه!!!
من متدی که تو کلاس فرمم نوشتم رو تو یک کلاس دیگه فراخوانی میکنم اما تغیراتی که میخوام رو انجام نمیده( رنگ label رو برام عوض نمیکنه) دلیلش چیه، اگه کسی میتونه لطفا راهنمایی کنید
کد کلاس فرم:

public void Changer()
{
if (lbl1.BackColor != Color.Red &&2.BackColor != Color.Green)
{
lbl1.BackColor = Color.Red;
lbl2.BackColor = Color.Green;
}
else
{
lbl1.BackColor = Color.Green;
lbl2.BackColor = Color.Red;
}
}

کد کلاس دوم برای اجرای متد Changer

public void Move()
{
Form1.Changer();
}



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

codedeveloper
یک شنبه 28 آذر 1395, 16:04 عصر
public class cl1

{

pulic void changecolor(ByRef lable l){

l.backcolor = color.red;

{

{

این کد رو استفاده کن...

30yamand
یک شنبه 05 دی 1395, 22:52 عصر
دوستان ممنون ار راهنمایتون
اما من هر کاری کردم نشد.
اگه زحمتی نیست یه مثال ساده بنویسید بزارید
شاید من هنگ کردم نمیتونم ج بگیرم

hamid_hr
دوشنبه 06 دی 1395, 09:43 صبح
این نمونه
بیا این کلاس رو یه جا تو برنامه بزار



class Class1
{

public void ChangeBackColor(System.Windows.Forms.Label lb)
{
lb.BackColor = System.Drawing.Color.Red;
}
}



بعد تو برنامه اینطوری ازش استفاده کن



Class1 cl1 = new Class1();
cl1.ChangeBackColor(ref lable1)

30yamand
دوشنبه 06 دی 1395, 12:07 عصر
دوست عزیز نشد
جواب نمیده
هرکاری میکنم وقتی فرم لود شد دیگه رنگ لبیل یا دکمه هایی که میخوام تغییر نمیکنه

hamid_hr
دوشنبه 06 دی 1395, 17:06 عصر
این یک نمونه اجرا شده کامل
WindowsFormsApplication1.zip (http://barnamenevis.org/attachment.php?attachmentid=143899&stc=1&d=1482761149)

30yamand
پنج شنبه 09 دی 1395, 13:59 عصر
hamid_hr (http://barnamenevis.org/member.php?25531-hamid_hr) جان
دوست عزیز کدی که شما زحمتش رو کشیدید، فقط یک بار اونم زمانی که فرم لود میشه اجرا میشه( عمل میکنه) ، من چیزی که میخوام برنامه به صورت مکرر تحت شرطی که تو کلاس دوم میزارم در زمان که فرم اجرا شده اجرا بشه




class Class1
{
Form1 frm= new Form1();
public void ChangeBackColor(ref Label lb)


{
if (shartEjra())
{
lb.BackColor = Color.Red;


}
else
{
lb.BackColor = Color.Green;
}




}


public bool shartEjra()
{
if (frm.label1.BackColor== Color.Transparent)
{
return true;
}
else
{
return false;
}
}
}

30yamand
پنج شنبه 09 دی 1395, 14:01 عصر
کدی که نوشتم هم ج نمیده

hamid_hr
پنج شنبه 09 دی 1395, 15:44 عصر
اینو چرا داخل کلاس تعریف کردین؟
Form1 frm= new Form1();
شما ابتدا یکم در مورد کلاس و مباحث اولیه مربوط به oop مطالعه بفرمایید بعد خودتون متوجه میشین چطور انجامش بدین
اون که من نوشتم فقط یک نمونه بود که طریق کار رو متوجه بشین
برا اینکه بتونین هر جایی ازش استفاده کنین باید دو خط کد موجود در form_load رو کپی کنین و اونجا استفاده کنین
مثلا یه دونه باتن بزارین و اون دو خط کد رو در رویداد کلیک باتن استفاده کنین