C# OOP Classlarla İlgili Çok Basit Bir Soru
-
GodKlaus bunu yazdı
hala sorunu çözemedim. Bir allahın kulu yok mu şu kodu yazıpta halledeceksin diyen :D
edit : bu kodu yazdım düzeldi
Form1 mainForm = (Form1)Application.OpenForms[0];
türeme kullanmiyorsun dostum bu aslinda senin sorunun.
Kodu kopyala da koy resmini koymak yerine de düzeltip gosterelim. yoksa kodu tekrar yazmak ile kimse uğraşmak istemez.
-
Ne yapmak istediğini tam anlamadım. Senin olayın şuna benzer:
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var rectangle = new Rectangle(this); rectangle.Run("test mesajı"); } } public class Rectangle { private Form frm_; public Rectangle(Form frm) { frm_ = frm; } public void Run(string txt) { frm_.Text = txt; } }
-
GodKlaus bunu yazdı
Edit :
Form1'deki herhangi bir listbox label textbox button cart curt bir nesneye FARKLI BİR CLASS'TAN nasıl erişicem ?
Olay tamamen bu :D
Dostum problemde buradan kaynaklanıyor zaten.
Form1'deki herhangi bir attribute'a ap ayrı bir sınıftan erişmemen gerekiyor. OOP'nin mantığında yok böyle bir şey.
Senin sınıflar arasında zayıf bağ kurman gerekiyor ( loose coupling ) . Yazdığın kodda bunları nasıl sıkı sıkıya bağlarım diye uğraşmışsın. ( tight coupling )
Unutma Form1'de bir sınıftır.
Kabaca şöyle yazayım.
Rectangle diye bir sınıfın olur. Bu sınıfın property'leri olur.
AskForProperties diye bir method yazarsın. Bu method sınıfın property'lerini doldurup geriye Rectangle sınıfının instance'sını döndürür.
Artık bundan sonra elinde Rectangle sınıfının örneği olduğu için istediğin yerde Form1'in attribute'lerini değiştirirsin.
Anlaşılmadıysa kod örneği gönderirim.
-
Diathorus bunu yazdıGodKlaus bunu yazdı
Edit :
Form1'deki herhangi bir listbox label textbox button cart curt bir nesneye FARKLI BİR CLASS'TAN nasıl erişicem ?
Olay tamamen bu :D
Dostum problemde buradan kaynaklanıyor zaten.
Form1'deki herhangi bir attribute'a ap ayrı bir sınıftan erişmemen gerekiyor. OOP'nin mantığında yok böyle bir şey.
Senin sınıflar arasında zayıf bağ kurman gerekiyor ( loose coupling ) . Yazdığın kodda bunları nasıl sıkı sıkıya bağlarım diye uğraşmışsın. ( tight coupling )
Unutma Form1'de bir sınıftır.
Kabaca şöyle yazayım.
Rectangle diye bir sınıfın olur. Bu sınıfın property'leri olur.
AskForProperties diye bir method yazarsın. Bu method sınıfın property'lerini doldurup geriye Rectangle sınıfının instance'sını döndürür.
Artık bundan sonra elinde Rectangle sınıfının örneği olduğu için istediğin yerde Form1'in attribute'lerini değiştirirsin.
Anlaşılmadıysa kod örneği gönderirim.
Hocam diyorsun ki Form1 bir class'tır ve Form1'deki herhangi bir attribute'e ayrı bir classtan erişmemeliyim. OOP'de olay bir classtan obje oluşturup o obje ile farklı classlara erişmek değil mi ?
C++'ta int main'in içine classAdi objeAdi; yazıp üstte tanımladığım classın içerisindeki fonksiyonlara , değişkenlere erişiyorum.
C#'ta Form1'in içine alttaki class tipinde bir obje oluşturup bu obje sayesinde class'a erişebiliyorum AMA alttaki classtan Form1'e erişemiyorum. Benim sorunum bu. Bunun içinde Form1 tipinde obje oluşturup ama olmuyor.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { bool round = false; Rectangle rec = new Rectangle(); public Form1() { InitializeComponent(); label2.BackColor = Color.YellowGreen; label2.ForeColor = Color.Maroon; label3.Text = "Waiting For Width / Length Values"; textBox1.Text = "Width"; textBox2.Text = "Length"; textBox1.Enabled = false; textBox2.Enabled = false; button2.Visible = false; } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { if (round==false) { textBox1.Enabled = true; textBox1.Text = ""; textBox2.Enabled = true; textBox2.Text = ""; button1.Text = "SEND"; round = true; } else { button2.Visible = true; rec.askForVariables(Convert.ToDouble(textBox1.Text),Convert.ToDouble(textBox2.Text)); } } private void button2_Click(object sender, EventArgs e) { MessageBox.Show("Width Is " + rec.returnWidth() + " cm\nLength Is " + rec.returnLength() + " cm\nArea Is " + rec.returnArea() + " cm'2\nPerimeter Is " + rec.returnPerimeter() + " cm'2"); } } public class Rectangle { static Form1 frm = Application.OpenForms.OfType<Form1>().FirstOrDefault(); //Form1 frm = (Form1)Application.OpenForms["Form1"]; private double en , boy , area , perimeter; public void askForVariables(double x, double y) { setWidth(x); setLength(y); calculateArea(this.en,this.boy); calculatePerimeter(this.en,this.boy); } private void calculateArea(double en,double boy) { area = en * boy; } private void calculatePerimeter(double en, double boy) { perimeter = 2 * (en + boy); } public void setWidth(double p) { en = p; } public void setLength(double o) { boy = o; } public double returnWidth() { return en; } public double returnLength() { return boy; } public double returnArea() { return area; } public double returnPerimeter() { return perimeter; } } }
-
-
siyahbereli bunu yazdı
evet öyle de sorum farklı benim Karıştırma oraları Interface filan değil demek istediğim :D
Başka bir classtan form1'deki label1'e nasıl erişicem ? Bunu 2 gündür çözemedim :D
-
daha neyi zorluyorsun hoca ?
@YeniHarman çözümü sunmuş işte.
Rectangle classındaki constructor da form parametresini isteyeceksin.
classı create ederken de Rectangle _rec = new Rectangle(this); diye create edeceksin oldu bitti.
2 gündür neyini uğraşıyorsun allasen ?
edit..
bilale anlatır gibi anlattım buyur.