grey1987 Geschrieben 30. Juli 2008 Geschrieben 30. Juli 2008 Hello, also ich hab drei Klassen: Klasse1, Klasse2, Klasse3! ich habe jetzt in Klasse2 ein Objekt von Klasse1 erstellt Klasse1 meinObjekt = new Klasse1 (); jetzt hab ich einige berechnungen durchgeführt und will nun mit der Klasse3 auf das Ergebnis (erstellte Objekt) von Klasse2 zugreifen. Zitieren
TDM Geschrieben 30. Juli 2008 Geschrieben 30. Juli 2008 Schonmal was von Kapslung gehört? Standardmäßig sind Member nicht nach außen hin sichtbar. Am Besten schreibst du eine Property oder eine Funktion (public machen), die das Objekt nach außen gibt. Zitieren
grey1987 Geschrieben 30. Juli 2008 Autor Geschrieben 30. Juli 2008 habs jetzt gelöst: ich ab einfach ein varialble string ergebnis erstellt dieser dann das Ergebnis zugewiesen und dann aus der klasse drauf zugegriffen. falls jemanden der code interessiert: Form1.csusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Uebergabe { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void newFormToolStripMenuItem_Click(object sender, EventArgs e) { Form2 form2 = new Form2(); form2.ShowDialog(); label1.Text = form2.nText; } } } Form2.csusing System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace Uebergabe { public partial class Form2 : Form { Speicher save = new Speicher(); public string nText; public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { save.Text = textBox1.Text; label1.Text = save.Text; nText = save.Text; } } } Speicher.csusing System; using System.Collections.Generic; using System.Text; namespace Uebergabe { class Speicher { private string text; public Speicher() { //if (text == "") text = "Konstruktor"; } public string Text { get { return text; } set { text = value; } } } } Zitieren
LadyPreis Geschrieben 30. Juli 2008 Geschrieben 30. Juli 2008 eine Variable public oO Funktionieren tut das auf jeden Fall, ist jedoch kein guter Programmierstil und würde ich mir wieder abgewöhnen. Befolge einfach TDMs rat und lies dir mal die Hilfe zu den propertys durch. Gruß Die Lady Zitieren
grey1987 Geschrieben 30. Juli 2008 Autor Geschrieben 30. Juli 2008 hättet ihr ein link für mich? weis net wo ich das suchen/finden kann. Zitieren
LadyPreis Geschrieben 30. Juli 2008 Geschrieben 30. Juli 2008 tipp in deinem Qt das Wort "property" ein, markier es danach und drück dann F1 Funktioniert natürlich nur, wenn du die Hilfe-Dateien (MSDN) installiert hast. Gruß Die Lady Zitieren
grey1987 Geschrieben 30. Juli 2008 Autor Geschrieben 30. Juli 2008 danke. und wie wärs wenn ich es so mache: Form2.cs private string nText; public string Get_nText() { return nText; } Form1.cs label1.Text = form2.Get_nText(); zeigt das trotzdem einen schlechten Programmierstiel? Zitieren
LadyPreis Geschrieben 31. Juli 2008 Geschrieben 31. Juli 2008 genau nach diesem System läuft eine Property Zitieren
grey1987 Geschrieben 31. Juli 2008 Autor Geschrieben 31. Juli 2008 na wenn ich kein genie bin danke nochmals. Zitieren
Conex Geschrieben 7. Oktober 2008 Geschrieben 7. Oktober 2008 Hallo Leute, habe genau das gleiche Problem, nur komme ich leider nicht ganz mit dem Lösungsansatz klar. Ich habe zwei Klassen: Main, Rechnen In der Klasse Main befindet sich eine richTextBox, die Ergebnisse von der Klasse Rechnen ausgeben soll. Main.cs Rechnen FormRechnen = new Rechnen(); TextBox_Rechenverlauf.AppendText(FormRechnen.ausgabe + "\r\n"); Rechnen.cs private string ausgabe; private void Aktion() { //... erg = x + y; ausgabe = Convert.ToString(erg); } Leider passiert hier überhaupt nichts. Ich habe schon zahlreiche Versuche unternommen und mitbekommen, dass der neue String "ausgabe" aus der Methode "Aktion()" nicht übernommen wird. Vielen Danke im voraus! Zitieren
Klotzkopp Geschrieben 7. Oktober 2008 Geschrieben 7. Oktober 2008 Naja, du solltest diese Methode auch irgendwo aufrufen. Zitieren
Conex Geschrieben 7. Oktober 2008 Geschrieben 7. Oktober 2008 Die Methode "Aktion()" wird aufgerufen (nur im Code nicht sichtbar). Daher wäre es mir lieber, wenn ich aus der Klasse "Rechnen" von der Methode "Aktion" heraus die richTextBox in der Klasse "Main" füllen kann. Geht das nicht? Zitieren
Klotzkopp Geschrieben 7. Oktober 2008 Geschrieben 7. Oktober 2008 Die Methode "Aktion()" wird aufgerufen (nur im Code nicht sichtbar). Mag sein, dass sie aufgerufen wird, aber offensichtlich nicht mit der Instanz der Klasse Rechnen, die du in Main neu erzeugst. Jedes Rechnen-Objekt hat seinen eigene ausgabe-Variable. Wenn du bei einem solchen Objekt die Methode Aktion aufrufst, kannst du nicht erwarten, dass das auf die Ausgabe eines ganz anderen Objekts irgendeinen Einfluss hast. "Was du in einen Schrank hineinlegst, kannst du nicht aus einem anderen herausholen." Ist dir der Unterschied zwischen Klasse und Instanz klar? Zitieren
Conex Geschrieben 7. Oktober 2008 Geschrieben 7. Oktober 2008 Ist dir der Unterschied zwischen Klasse und Instanz klar? Na ja... eigentlich nicht Zitieren
Klotzkopp Geschrieben 7. Oktober 2008 Geschrieben 7. Oktober 2008 Stell dir mal vor, du hast einen neuen Schrank. Neue Schränke sind weiß. Du malst deinen Schrank rot an. Dann kaufst du dir noch einen Schrank, genau den gleichen. Welche Farbe hat der? "Schrank" ist deine Klasse Rechnen. "Schrank rot Anmalen" ist das Aufrufen der Methode Aktion. Und die Farbe des Schranks ist der Wert, den du in ausgabe speicherst. Und wenn du "new Rechnen" sagst, kaufst du einen neuen Schrank. Der ist weiß, egal wie viele andere Schränke du vorher angemalt hast. Jetzt klarer? Zitieren
Conex Geschrieben 7. Oktober 2008 Geschrieben 7. Oktober 2008 Sehr schöne Erklärung... danke!!! Nun habe ich noch ein wenig versucht, komme aber immer noch nicht auf einen grünen Zweig Kannst mir mir einen Code-Ansatz geben, mit dem ich weiter arbeiten kann? Zitieren
Conex Geschrieben 7. Oktober 2008 Geschrieben 7. Oktober 2008 Ich denke, ich habe es nun doch von allein geschafft! Main.cs private void button1_Click(object sender, EventArgs e) { Rechnen FormRechnen = new Rechnen(); string test = FormRechnen.Get_ausgabe(); richTextBox1.AppendText(test); } Rechnen.cs private string ausgabe; private void Aktion() { //... erg = x + y; ausgabe = Convert.ToString(erg); } public string Get_ausgabe() { Aktion(); return ausgabe; } Zitieren
Conex Geschrieben 7. Oktober 2008 Geschrieben 7. Oktober 2008 Hm... in diesem einfachen Beispiel kein Problem. Allerdings bringt es mir in meinem komplexen Programm nichts die Methode Aktion() in der Methode Get_ausgabe() aufzurufen. Die Methode Aktion() wird schon eher (also unabhängig) von der Methode Get_ausgabe() ausgeführt. Wie gehe ich nun vor? Zitieren
Klotzkopp Geschrieben 7. Oktober 2008 Geschrieben 7. Oktober 2008 Wie gehe ich nun vor?Du brauchst den richtigen Schrank, um beim Beispiel zu bleiben. Du rufst Aktion mit einer ganz bestimmten Instanz der Klasse Rechnen auf. An der Stelle, an der du die Ausgabe brauchst, brauchst du also eine Referenz auf genau diese Instanz. Du musst dir merken, welchen Schrank du angemalt hast. Zeig doch mal, wie und wo du Aktion aufrufst. Woher kommt das Rechnen-Objekt, mit dem du das tust? Zitieren
Conex Geschrieben 7. Oktober 2008 Geschrieben 7. Oktober 2008 Woher kommt das Rechnen-Objekt, mit dem du das tust? Ich denke mal, du meinst diese Zeile: Rechnen FormRechnen = new Rechnen(); Damit will ich eigentlich nur bezwecken, dass ich in der Klasse "Main" auf die Klasse "Rechnen" zugreifen kann. Wie und wo ich genau die Methode Aktion() aufrufe gebe ich dir morgen durch! Zitieren
Conex Geschrieben 8. Oktober 2008 Geschrieben 8. Oktober 2008 Sooo... hier nun das komplexe Gebilde. In meine Programm gibt es mehrere Klassen. Wir reden jetzt aber nur von der Klasse "Main" und der Klasse "Grundrechenarten". Grundrechenarten.cs public int aktion = 0; // Rechenart auswählen private void button_Auswahl_Click(object sender, EventArgs e) { if (treeView_Grundrechenarten.SelectedNode == treeView_Grundrechenarten.Nodes[0]) { aktion = 1; panel_Grundrechenarten.Visible = true; } } // Button "Berechnen" private void button_Berechnen_Click(object sender, EventArgs e) { switch (aktion) { case 1: Aktion(1); break; } } private string ausgabe; // Methode Aktion() private void Aktion(int aktion) { double x = Convert.ToDouble(textBox1.Text); double y = Convert.ToDouble(textBox2.Text); double erg; switch (aktion) { case 1: erg = x + y; ausgabe = Convert.ToString(x) + " + " + Convert.ToString(y) + " = " + Convert.ToString(erg); break; } } public string Get_ausgabe() { return ausgabe; } Da nun die Methode "Aktion()" schon abgehandelt wurde weiß ich nun nicht weiter, wie ich den String "ausgabe" in die Klasse "Main" bekomme. Zitieren
TDM Geschrieben 8. Oktober 2008 Geschrieben 8. Oktober 2008 Instanz.Get_ausgabe() :beagolisc Main ist ne andere Klasse? Zitieren
Conex Geschrieben 8. Oktober 2008 Geschrieben 8. Oktober 2008 Main ist ne andere Klasse? Genau... "Main" ist eine eigene Klasse (neues Form) wo eine richTextBox existiert die den Wert des Strings "ausgabe" annehmen soll. Zitieren
Klotzkopp Geschrieben 8. Oktober 2008 Geschrieben 8. Oktober 2008 Da nun die Methode "Aktion()" schon abgehandelt wurde weiß ich nun nicht weiter, wie ich den String "ausgabe" in die Klasse "Main" bekomme.Das hat mit dem Inhalt der Klasse Grundrechenarten praktisch nichts zu tun. Entscheidend ist, wie und wo du die Instanz dieser Klasse anlegst. Ich dachte, das wäre inzwischen klar geworden. Wenn du nicht weißt, wie du deinen rot angemalten Schrank wiederfinden sollst, helfen dir selbst die besten Schrankbaupläne nicht weiter. Zitieren
Conex Geschrieben 8. Oktober 2008 Geschrieben 8. Oktober 2008 Ich kann mir das alls logisch vorstellen, nur scheitert es an der praktischen Umsetzung Soben habe ich ein bisschen was über Instanzen gelesen und komme aber auch nicht so richig zurecht, wo ich was ändern muss. Kannst du mir nicht ein wenig vom Bauplanplan gben? Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.