Problem mit Variablen in verschiedenen Klassen C#

Kai_Jack

Erfahrenes Mitglied
Hallo Masters of the Compuserve,

bin mal wieder da. Ich habe eine Klasse erstellt, mit der man in C# mit Hilfe von Mapobjects ein Polygon malen kann. Mein Problem ist nun folgendes:

Ich habe Textboxen in der Klasse Form1, der Hauptklasse. Diese werden mit Zahlen gefüllt. Ich kann aber in der Klasse Erstellen_Polygon nicht auf diese Variablen zugreifen. Aber wenn ich eine Methode schreiben will, die das Polygon zeichnet, muss ich das doch können, oder ? hier der Quellcode: Ganz unten im letzten Block ist mein Hinweis, das mit den Variablen geht nicht.

Code:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Windows;
using ESRI.MapObjects2.Core;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.Odbc;
using System.IO;
using System.Reflection;
using ESRI.MapObjects2.Samples.test;



namespace Projection
{
	/// <summary>
	/// 
	/// </summary>
	public class Erstellen_Polygon
	{
		private  double x_1=0;
		private  double y_1=0;


		private  double x_2=0;
		private  double y_2=0;

		private static Erstellen_Polygon instance = null;


		ESRI.MapObjects2.Core.Point point	= new ESRI.MapObjects2.Core.PointClass();
		ESRI.MapObjects2.Core.Points points = new ESRI.MapObjects2.Core.PointsClass();
		ESRI.MapObjects2.Core.Polygon pol	= new ESRI.MapObjects2.Core.PolygonClass();
		
		public Erstellen_Polygon()
		{

		}

		public static void  getInstance()
		{
			if(instance==null)

			{

				instance = new Erstellen_Polygon();
			
			}
		}

		public double Erstelle_X_1
		{
		
			get
			{
			return x_1;
			}
			
			set
			{
			x_1 = value;
				//x=point.X;			
			}
		
		}

		public double Erstelle_X_2
		{
		
			get
			{
				return x_2;
			}
			
			set
			{
				x_2 = value;
				//x=point.X;		
			}
		
		}
		
		public double Erstelle_Y_1
		{
		
			get
			{
			return y_1;
			}
			
			
			set
			{
			y_1 = value;
			//y=point.Y;
			}	
		}

		public double Erstelle_Y_2
		{
		
			get
			{
				return y_2;
			}
			
			
			set
			{
				y_2 = value;
				//y=point.Y;
				
			}	
		}

		public void Zeichne_Polygon()
		{
///////////////////////////////////////////////////////////////
Hier brauche ich die Variablen, kriege Sie aber nicht !!
		Erstelle_X_1 = System.Single.Parse(textBox3.Text);
		Erstelle_Y_1 = System.Single.Parse(textBox5.Text);
		Erstelle_X_2 = System.Single.Parse(textBox6.Text);
		Erstelle_Y_2 = System.Single.Parse(textBox7.Text);
			
///////////////////////////////////////////////////////////////
			point.X = Erstelle_X_1;
			point.Y = Erstelle_Y_1;
			points.Add(point);
			pol.Parts.Add(points);
///////////////////////////////////////////////////////////////
			point.X = Erstelle_X_2;
			point.Y = Erstelle_Y_2;
			points.Add(point);
			pol.Parts.Add(points);
///////////////////////////////////////////////////////////////
		}		
	}
}


Es kann aber auch sein, das ich einen Gedankenfehler habe und das noch nicht ganz kapiert habe mit den get und set usw.

Danke für Eure Hilfe

Gruß an alle Masters of the Compuserve

;-)
 
Vermutlich sind deine Textboxen in einem anderen Formular. Dann benötigst du eine Referenz auf das Formular und must dort die Werte für die Textboxen verfügbar machen.
Allerdings wäre das schlechter Programmierstil. Besser wäre es die Werte auf deine Klasseninstanz von [Erstellen]_Polygon von aussen zusetzen.
 
Ich glaube du machst da nur nen kleinen Fehler.

Wenn du von deiner Klasse, auf Variabeln der Form1 zugreiffen willst, musst du die Variablen in Form1 definieren, und kannst anschliessend durch das Initialiesieren der Form1 in deiner Klasse mit form1.deineVariabel, der Variabel einen Wert geben, welchen du dann in Form1 von deine Klasse erhalten hast, oder eben umgekehrt.
Das Tutorial von Norbert hilft dir bestimmt, falls du es noch nicht angschaut hast.
voilà
Ich hoffe, dir weitergeholfen zu haben, ansonsten nur Fragen :)
mfg
ziop
 
zioProduct hat gesagt.:
Ich glaube du machst da nur nen kleinen Fehler.

Wenn du von deiner Klasse, auf Variabeln der Form1 zugreiffen willst, musst du die Variablen in Form1 definieren, und kannst anschliessend durch das Initialiesieren der Form1 in deiner Klasse mit form1.deineVariabel, der Variabel einen Wert geben, welchen du dann in Form1 von deine Klasse erhalten hast, oder eben umgekehrt.
Das Tutorial von Norbert hilft dir bestimmt, falls du es noch nicht angschaut hast.
voilà
Ich hoffe, dir weitergeholfen zu haben, ansonsten nur Fragen :)
mfg
ziop
@Ziop: Ähm, ich hab davon jetzt gar nichts verstanden.
Wenn du von deiner Klasse, auf Variabeln der Form1 zugreiffen willst, musst du die Variablen in Form1 definieren
Definierst sind sie ja schon,
Du meintest sicher eher das er sie _verfügbar_ machen muss (via Property || Zugriffsmodifizierer). ;)
Das ist aber hier aber nicht sinnig.
Btw. Ein Objekt definieren heißt, dass das Objekt erstellt aber nicht instanziert wird.

Das Tutorial von Norbert hilft dir bestimmt
in diesem Fall unsauberen Code zu schreiben.
Einer Klasse so zu gestalten, dass sie mit der Referenz eine Forms arbeitet,
macht sie für weitere Zwecke unbrauchbar. Es währe nich im Sinne der OOP.
Wenn es aber 2 oder mehere Forms sind, die sowieso nur in dem selben Projekt existieren,
ist das schon, allein des persönlichen OverHeads wegen Interfaces dafür zu implementieren,
eher angebracht.

Er kann entweder seiner Methode Zeichne_Polygon die Parameter ganz einfach übergeben:
Code:
public void Zeichne_Polygon( Typ Objekt1, Typ Objekt2, Typ Objekt3, Typ Objekt4 )
oder, wie mage schon richtig sagte, die Werte "von aussen" setzen
und danach die Methode Zeichne_Polygon aufrufen.
Er müsste dafür aber wieder neue Propertys [EDIT]implementieren.
(jetzt war ich aber auch ein bissel durcheinander :-( :suspekt: :D )[/EDIT]
Ob das jetzt auch wieder Sinn macht, darüber lässt sich streiten. ;-) :D
 
Zuletzt bearbeitet:
Ok, habe das Problem mit den Variablen mit Übergabeparametern in der Methode gelöst. Dies sieht dann so aus:

Code:
public void Zeichne_Polygon(double x_1,double y_1,double x_2,double y_2)
		{
			point.X = x_1;
			point.Y = y_1;

			points.Add(point);
			pol.Parts.Add(points);


			point.X = x_2;
			point.Y = y_2;

			points.Add(point);
			pol.Parts.Add(points);	
		}
Dies klappt auch, zumindest werden die Korrekten Werte übergeben. Das Problem ist, das die Methode Polygon, also die Zeile
Code:
pol.Parts.Add(points)
scheinbar eine Abbruchbedingung haben muß. Wie mache ich das jetzt, denn in Klasse 1 wird die Instanz pol beim initialisieren des Dialogs gesetzt, somit lebt das Objekt bzw. die Methode dauerhaft, was auch so sein muß, denn sonst könnte keine n-eckiges Polygon gezeichnet werden. Aber wie breche ich jetzt die Punkteingabe ab, so das quasi das Polygon auch gezeichnet werden kann ?

Tip: Bisher ging das Zeichnen, solange ich get und set benutzt habe, jetzt mit den Übergabeparametern klappt es nicht. Dafür werden aber dauerhaft punkte angehängt, was richtig ist, jedoch vorher bei get und set eben nicht ging, da wurde dafür automatisch abgebrochen und gezeichnet.

Gruß und danke an alle Masters of the Compuserve

Jack ;-)
 
Kai_Jack hat gesagt.:
Das Problem ist, das die Methode Polygon, also die Zeile
Code:
pol.Parts.Add(points)
scheinbar eine Abbruchbedingung haben muß. Wie mache ich das jetzt, denn in Klasse 1 wird die Instanz pol beim initialisieren des Dialogs gesetzt, somit lebt das Objekt bzw. die Methode dauerhaft, was auch so sein muß, denn sonst könnte keine n-eckiges Polygon gezeichnet werden. Aber wie breche ich jetzt die Punkteingabe ab, so das quasi das Polygon auch gezeichnet werden kann ?
Soweit ich deinen Satz verstanden hab,
könntest Du deiner Methode noch ein Flag (bool) mitgeben und darin darauf regieren.
Kai_Jack hat gesagt.:
Tip: Bisher ging das Zeichnen, solange ich get und set benutzt habe, jetzt mit den Übergabeparametern klappt es nicht. Dafür werden aber dauerhaft punkte angehängt, was richtig ist, jedoch vorher bei get und set eben nicht ging, da wurde dafür automatisch abgebrochen und gezeichnet.
Ich blicke nicht mehr durch, sorry.
 
Nochmal anders formuliert:

Mit get und set Methoden ging das Zeichnen, aber er hat eben immer nur eine Linie gezeichnet, und das war dann das polygon, was falsch war.

Jetzt mit Übergabeparametern hängt er viele Punkte an, also nicht nur den ersten, sondern eben so viele, wie mit dem Knopf erzeugt werden. Er kann aber nicht abbrechen, denn der Benutzer kann ja die Koordinaten immer verändern und immer wieder neue Punkte eingeben. Das muss eben unterbunden werden. Also brauche ich quasi einen Button Beenden, aber weiß nicht was passieren soll, wenn dieser dann gedrückt wird.

Hinweis:
Das Polygon wird auch nur gezeichnet, wenn der Letzte Punkt dem ersten entspricht, also das polygon auch geschlossen wird. Hier ist ein Codeausschnitt, wo die Punkte statisch definiert werden, das klappt wunderbar.

Code:
pt.X = 100
pt.Y = 100
pts.Add pt

pt.X = 400
pt.Y = 100
pts.Add pt

pt.X = 250
pt.Y = 400
pts.Add pt

pt.X = 100
pt.Y = 100
pts.Add pt

poly.Parts.Add pts

Ich hoffe man versteht es jetzt besser.


Gruß Jack
 

Neue Beiträge

Zurück