Laden...
D
dschmoegner myCSharp.de - Member
Angestellter Göttingen Dabei seit 24.02.2005 280 Beiträge
Benutzerbeschreibung

Forenbeiträge von dschmoegner Ingesamt 280 Beiträge

26.04.2005 - 13:50 Uhr

Also von ActiveX weiss ich nur noch, dass man Anwendungen zum Testen in einen TestContainer laden konnte, aber das war noch mit dem VC++ 6 Compiler.

Die Idee mit dem Parentfenster finde ich garnicht mal abwägig. In der Funktionierenden Variante ist es so gelöst: Form.cs SerCom.cs(abgeleitet von CommBase(MSDN)), beim Eingeben des Startzeichens wird der Konstruktor von SerCom aufgerufen und eine Methode die den Send() Aufruf der Comm-DLL beinhaltete. Damit müsste ja die Comm-DLL als Owner die Form.cs haben. Daraus schliesse ich jetzt, dass ich die Comm-DLL nicht in einer weiteren Klassenbibliothek kapseln kann.

Oder?

26.04.2005 - 13:18 Uhr

Hallo Pulpapex,

danke für deine Antwort, habe mir auf deine Anregung hin noch einmal die Doku aus der MSDN angeschaut(Mehr gibt es leider nicht). Ich konnte nichts finden, was deine Vermutung stützen könnte. Ich poste mal den Link SerialComm MSDN
Ich bin mir eigentlich sicher nichts überlesen zu haben. Allerdings ist mein Fachenglisch nicht grad der Brüller.

Was mir noch einfällt. Ganz am Anfang wollte ich die DLL innerhalb einer reinen Konsolenanwendung testen. Da funktionierte auch alles bis darauf, dass das Gerät keine Daten sendete und es stellte sich bei einem Test mit einem Laptop und Hyperterminal heraus, dass nur Zeichensalat übertragen wurde. Dies würde widerum dein Theorie stützen wenn ich das richtig sehe.

So langsam verlier ich ein klein wenig den Überblick.

26.04.2005 - 12:04 Uhr

Hallo,

habe folgendes Problem. Ich benutze für die serielle Kommunikation die DLL aus der MSDN. Von dieser DLL muss man erben um Zugriff auf Methoden wie Open() und Send() zu bekommen. Die Klasse in der Open() und Send() implementiert sind ist abstract. Nun wollte ich mir für die Diplomarbeit eine eigene Komponente erstellen. Habe also dem VS .NET 2003 gesagt ich will ne Klassenbibliothek bauen. Dort habe ich dann wie in einem vorhergehenden Testprojekt für die RS232 die benötigten Methoden implementiert mit Interfaces um z.Bsp. das Startzeichen über eine Workflowkomponente an die Schnittstelle zu senden. Der Code wird auch ausgeführt nur sendet das angeschlossene Gerät nicht wie geplant die Daten auf das Startzeichen hin. Wenn ich meinen eigenen Code nicht in einer Klassenbibliothek entwickle sondern als reine Quelltextdatei, dann funktioniert alles. Wie in dem vorher erstelltem Testprojekt.
Ich denke mal ich mache einen Fehler was die Einbindung der abstrakten Klasse aus der MSDN betrifft.
Habt ihr eine Idee.

Greetz

20.04.2005 - 09:45 Uhr

Danke, das hat mir sehr viel weiter geholfen. Wobei mir die Sache mit Quelle und Ziel auch hätte auffallen müssen.
Die gdi32.dll, stamm die aus der MFC?

20.04.2005 - 09:17 Uhr

Hallo Programmierhans,

erst einmal nen fettes THX für die Mühe die du dir gemacht hast. Leider will es bei mir nicht laufen. Bei dieser Codezeile


//Zielobjekte für den Kopiervorgang erstellen
				_ImageToPrint=new Bitmap(rectSource.Width,rectSource.Height,gSource);

steigt der Debugger mit der Meldung:
_
Eine nicht behandelte Ausnahme des Typs 'System.InvalidOperationException' ist in system.drawing.dll aufgetreten.

Zusätzliche Informationen: Das Objekt wird zur Zeit anderswo verwendet._

aus.

Ich habe deine Klasse direkt eingebunden, will heissen: Beim entsprechenden Klick erzeuge ich eine neue Instanz, übergebe ihr die Form oder das Control mit dem Aufruf PrintFunctions.PrintControl(this);. Ich glaube nicht das es notwendig sein sollte von deiner Klasse zu erben, oder irre ich mich da?

19.04.2005 - 16:53 Uhr

http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/dv_vbcode/html/vbtskCodeExamplePrintingForm.asp
Habe jetzt versucht das Beispiel aus VB nach C# zu übertragen, aber in VB hab ich null Wissen. Kann mir im Beispiel nicht jede Codezeile erklären. Hier mal meine Adaption. Hoffe mir kann man dabei helfen.


private void pd_PrintPage(object sender, PrintPageEventArgs e)
		{
			Graphics grfx = e.Graphics;
			Graphics g = this.CreateGraphics();
			Size s = this.Size;
			bitmap = new Bitmap(s.Width, s.Height, g);
			Graphics mg = Graphics.FromImage(bitmap);
			Graphics pgrfx = grfx;
			e.Graphics.DrawImage(bitmap,0,0);
		}

19.04.2005 - 11:39 Uhr

Die Idee, das Control an den Drucker zu übergeben war wohl ne Schnapsidee. 🙁

Jetzt hatte ich mir überlegt, das Diagramm Control an eine neue Form zu übergeben und diese neue Form zu drucken ohne sie dabei anzuzeigen. Allerdings finde ich da keinen Zugang. In der MSDN wird auch nix über Screenshot oder ählichem geschrieben.

Heisst das der Drucker kann nur Graphics Elemente verarbeiten und es ist absolut unmöglich das Control irgendwie zu drucken? X(

19.04.2005 - 08:44 Uhr

Hallo schnecke,

vielleicht hilft dir dies weiter:

Text des gedrückten Buttons verändern

greetz

15.04.2005 - 13:19 Uhr

Hallo,

besteht die Möglichkeit ein Windows Control zu drucken? Ich arbeite mit ZedGraph von Sourcefourge.net und erzeuge mir damit ein Diagramm. Nun möchte ich gerne dieses Diagramm drucken. Allerdings möchte ich nicht im Quellcode von ZedGraph herumpfuschen. Den Graph selber kann man als Image speichern, was aber nur über Rechte Maustaste->Kontextmenue geht. Kann ich ein Control an den Drucker übergeben?

Schon mal danke.

15.04.2005 - 10:44 Uhr

Hallo Nightfall,

ich habe etwas ähnliches in einem Paintereignis

Panel form = (Panel)sender;

du müsstest mit

Button myButton =(Button)sender;

if(myButton == "Name des gedrückten Buttons")

das gewünschte Ergebnis erzielen können.

K...Quallo war schneller, sollte beides meines Erachtens nach funktionieren

14.04.2005 - 12:21 Uhr

Hallo herbivore,

ok, aus der Sicht hatte ich es noch nicht betrachtet. Dann stellt sich mir die Frage für was Form.Load nun genau da ist, denn an sich macht es nichts anderes als das was der Konstruktor macht. Nämlich eine Initialisierung zum Start der Applikation. Wenn ich mich nicht ganz täusche. Herr Petzold geht in seinem Buch auch nicht auf das Event ein. Daher meine leichten Verständnisprobleme.

14.04.2005 - 11:36 Uhr

Bisher habe ich die Ansage über InitializeComponent() nicht wirklich ernst genommen und habe da Events und Controls eingefügt wie ich es gebraucht habe.
Das ging mir oft genug schneller als über den Designer.
War wohl keine so gute Idee???

14.04.2005 - 11:22 Uhr

Hallo Community,

ich bin heute über das Form.Load Ereignis gestolpert. Hier stellt sich mir die Frage, wann es sinnvoll ist dieses zu verwenden. Alles was in einer Form angezeigt werden kann, könnte ja auch in InitializeComponent() untergebracht werden. Was sind eure Erfahrungen wann ein Form.Load Ereignis sinnvoll, wenn nicht sogar zwingend erforderlich wird.

Schon mal Danke.

Dennie

12.04.2005 - 09:47 Uhr

Danke Pulpapex. Die Antwort kam schneller als ich gucken konnte 😄. Werde mir den Artikel mal zu Gemüte führen.

Danke herbivore. Ihr seid am frühen Morgen zu schnell für mich. Habe die Reihenfolge geändert und tatsächlich stimmt jetzt form.Width des Panels im PaintHandler mit der Grösse des panel3 überein.

Die Logik warum die Panels überlagert in verschiedene Z-Ebenen liegen erschliesst sich mir zwars noch nicht ganz, aber da wird mir vielleicht der Artikel von Pulpaplex weiterhelfen.

Gilt die unterschiedliche Z-Ebenen Lage für alle Steuerelemte? Also auch für Label, Button, TextBox usw.?

12.04.2005 - 09:41 Uhr

@herbivore

Danke

Die Reihenfolge bei Controls.Add ist panel1, panel2, panel3. Allerdings verstehe ich dabei nicht, warum im PaintHandler das panel3(ist das mittlere in dem alle Steuerelemente untergebracht sind, sowie die Zeichnung des Diagrammes stattfindet) immer die Abmasse der Hauptform hat(immo 1024*768) .

12.04.2005 - 09:16 Uhr

Also das sendende Objekt ist vom Typ Panel. Bleibt nur die von dir erwähnte Sache mit DockStyle


			this.panel1.Dock = System.Windows.Forms.DockStyle.Left;

			this.panel2.Dock = System.Windows.Forms.DockStyle.Right;

			this.panel3.Dock = System.Windows.Forms.DockStyle.Fill;


Habe aber bei den Grössen der Panels darauf geachtet, dass sie sich nicht überlappen und Z-Ebene müsste für alle gleich sein.

12.04.2005 - 09:06 Uhr

Moin,

mir ist aufgefallen, dass bei dem folgenden Aufruf immer die Abmasse der Form Gültigkeit haben. Heisst das ein Panel welches einer Form untergeordnet wird kann nicht als sendendes Objekt fungieren?


static void PanelPaintHandler(object sender, PaintEventArgs e)
		{
			//Achtung anscheinend wird hier die Form und nicht das Panel selber übertragen
			Panel form = (Panel)sender;
}

Daraus entsteht mir zwars kein direktes Problem, aber interessieren täte mich dieses schon.
Danke

07.04.2005 - 08:34 Uhr

Ok. Ich hab meinen Fehler gefunden. Hoffe das so ein Fehler nicht mehr vorkommt.
X(

06.04.2005 - 11:50 Uhr

Erst einmal Danke.
Habe es jetzt so gelöst: Ein eigenen Resize EventHandler der beim Resize


panel3.Invalidate();

aufruft. Funktioniert für die X-Achse meines Diagrammes auch gut nur für die Y-Achse nicht. In meinen PaintHandler kann ich es nicht einbauen, da dieser nach Herrn Petzold static deklariert ist. Das wäre das einzigste was mir einfallen würde als Ursache für den Fehler bei der Y-Achse.

/edit Der Fehler mit der Y-Achse bezieht sich darauf, dass wenn man die Höhe der Form ändert sich nicht die Länge der Y-Achse ändert. Diese bleibt erhalten, so dass die X-Achse irgendwann aus dem Bildbereich verschwindet.

06.04.2005 - 09:37 Uhr

Moin,

zur Zeit zeichne ich ein Diagramm mittels eines eigenen PaintHandlers innerhalb einer Form auf ein panel. Die grösse des Diagramms ist an die Auflösung gebunden. Wenn ich jetzt die grösse des Forms ändere bleibt sehr oft das Diagramm in seinem vorhergehenden Zustand, es sei denn ich schicke es auf die Taskleiste und hole es zurück. Gibt es da eine Möglichkeit das Repaint sicher auszulösen, also egal wie klein oder gross sich das Form verändert?

Schon mal danke.

04.04.2005 - 12:46 Uhr

@herbivore, Noodles
Vielen Dank für die umfangreiche Hilfestellung.

04.04.2005 - 11:38 Uhr

Aber sollte nicht durch die Enabled Eigenschaft ein Aktivieren und somit auch ein Anzeigen unterbunden werden?????

04.04.2005 - 09:24 Uhr

Geht es dir jetzt um die gesammte TabControl oder um die einzelnen Kartenreiter?
Die Kartenreiter selber besitzen keine Eigenschaft Enabled. Die ist nur fürs gesammte TabControl verfügbar.


// 
			// tabControl1
			// 
			this.tabControl1.Location = new System.Drawing.Point(384, 24);
			this.tabControl1.Name = "tabControl1";
			this.tabControl1.SelectedIndex = 0;
			this.tabControl1.Size = new System.Drawing.Size(104, 40);
			this.tabControl1.TabIndex = 2;
			this.tabControl1.SelectedIndexChanged += new System.EventHandler(this.tabControl1_SelectedIndexChanged);
			this.tabControl1.Enabled = true;

Code aus dem Windows Form Designer

04.04.2005 - 08:28 Uhr

Moin,

also bei mir existiert die Eigenschaft Enabled. Habe die TabControl im Formdesigner hinzugefügt und kann auch auf die Eigenschaft Enabled zu greifen.
Ich benutze .NET 1.1 mit VS .NET 2003.

31.03.2005 - 16:21 Uhr

👍
Es funktioniert jetzt alles und das auch ohne Zeitverlust. Vielen Dank, Regex hat den Karren echt aus dem Dreck gezogen.


public void CreateTimeValues()
		{
			string TimeString = this.CreateSubstring();
			
			float test = 0;
			float test2 = 0;
			string temp1="";
			TimeString = TimeString.Replace('.', ',');
			TimeString = TimeString.Substring(0, TimeString.IndexOf(")")) + ";";
			Regex splitter = new Regex(@"\s*;\s*", RegexOptions.Compiled);			
                                                string[] values = splitter.Split(TimeString); 
			for(i = 0; i < (values.GetLength(0)-1)/3;i ++)
			{
				//temp1 += values[i];
				//test += Convert.ToSingle(values[3*i]);
				//test2 += Convert.ToSingle(values[3*i+1]);
				art.Add(Convert.ToSingle(values[3*i]));
				ar.Add(Convert.ToSingle(values[3*i+1]));
			}
			
			
		}

30.03.2005 - 16:56 Uhr

Neues Problem. Ich wollte mittels


Regex breaksign = new Regex(@"\s*)\s*", RegexOptions.Compiled);

eine Abbruchbedingung schaffen, damit nicht versucht wird das Endezeichen in einen Floatwert zu convertieren. Allerdings kommt beim debuggen immer folgender Fehler


Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' ist in system.windows.forms.dll aufgetreten.

Zusätzliche Informationen: "\s*)\s*" wird verarbeitet - Zu viele )'s.

kann damit absolut nix anfangen, denn im File kommt ')' nur einmal vor, nämlich dann wenn der Download beendet ist. Dieses Endezeichen wird auch nicht von mir per Code hinzugefügt sondern kommt vom Messgerät.
Könnt ihr mir sagen, was die Fehlermeldung genau meint?

PS: Aus irgendeinen Grund verschwinden die '&#39; im Regex Konstruktor bei meinem Post.

30.03.2005 - 13:38 Uhr

Es funktioniert jetzt. Und zwars war das Problem die Indexvariable. Ich hatte vergessen für das Testen eurer Codebeispiele den 2. Thread auszukommentieren. Habe den Fehler gemacht die Indexvariable als Member zu deklarieren und in beiden Threads verwendet, so dass sich der Wert ausserhalb meiner Testmethode auch verändert hat.
Sorry hierfür und danke für die Hilfe.

@pulpapex
Deine genaue Beschreibung des Regex Konstruktors hat mir sehr viel gebracht. Danke.

30.03.2005 - 12:57 Uhr

kann leider nicht wirklich damit was anfangen. Hatte es bisher mit einem Excellfile versucht, doch wenn ich die Software gestartet hatte kam immer ein Loginfenster für die Datenbank(mein Excelfile). Natürlich kann ich mich nicht auf ein Excelfile verbinden mit Passwort und Benutzername. Zumindestens ist mir dieses noch nie untergekommen.
Die Daten aus der Datei werden auch in einem DataSet angezeigt. Im DataSet selber sind sie als string gespeichert, wenn ich mich nicht irre, falls du das mit identisch meintest?

30.03.2005 - 12:14 Uhr

@herbivore
habe die Schleifenabbruchbedingung geändert, was aber nix am Ergebnis geändert hat.

@pulpaplex
Dein Beispiel funktioniert eigentlich, bis darauf das so um die 7 Zwischenwerte verschwinden. Ich muss dazu sagen, dass ich bisher nicht so ganz hinter die Regex Sache gestiegen bin. Werde da wohl noch mehr Zeit investieren müssen.

30.03.2005 - 11:12 Uhr

Hier mal mein geänderter Code.


public void CreateTimeValues()
		{
			string TimeString = this.CreateSubstring();
			string strdeli = " ;\n\r" ;
			string temp3 = "";
			char[] delimeter = strdeli.ToCharArray();
			string[] temp2 = TimeString.Split(delimeter, temp.Length);
			
			TimeString = TimeString.Replace('.', ',');
			for(i = 0; i < temp.IndexOf(")");i++)
			{
				temp3 += temp2[3*i+2];
				//art.Add(Convert.ToDouble(TimeString.Substring(0,TimeString.IndexOf(";"))));
					TimeString = TimeString.Remove(0,29);	
					if(TimeString.StartsWith(")"))
						break;		
			}
		}

Aber meine Debugvariable temp3 wird nicht gefüllt oder so wie ich es nicht haben will. Irgendwie fand ich Substring da angenehmer.

30.03.2005 - 10:50 Uhr

Angeschaut hab ich mir Split schon und bin auf das Problem gestossen, dass ich die Werte nicht spaltenweise auslesen konnte. Vielleicht habe ich da was übersehen(ich geh mal davon aus, dass ich sicher was übersehe), aber der Konstruktor von Split gibt mir ja nur die Möglichkeit Seperatorzeichen und Count zu benennen.

30.03.2005 - 10:11 Uhr

Hab mir die cs Datei mal angeschaut.....konnte aber auch nix entdecken. Nutzt du als Datenquelle eine DB wie MySQL? Weisst du ob es mit Excell Datein oder txt Dateien auch geht?

30.03.2005 - 10:08 Uhr

Hallo herbivore,


 1008.25;    30.0;     0.1;
 1008.50;    30.0;     0.1;
 1008.75;    30.0;     0.1;
 1009.00;    30.0;     0.1;
 1009.25;    30.0;     0.1;
 1009.50;    30.0;     0.1;
 1009.75;    30.1;     0.1;
 1010.00;    30.0;     0.1;
 1010.25;    30.0;     0.1;

Kleiner Ausschnitt aus der Messwertedatei. das geht bis 1343.75. Also ne ganze Menge. Weiterhin kann es auch mal möglich sein, dass die führenden Leerstellen bei der Übertragung verloren gehen. Ich seh da noch nicht wo Split die bessere Lösung sein soll?

30.03.2005 - 09:41 Uhr

Meinst du den Code des Windows Form-Designers???? Wenn ja, dann bezieht sich der nur auf die Eigenschaften des Viewers innerhalb des Panels und welcher Report eingebunden werden soll. Zumindestens habe ich das bisher so verstanden.

30.03.2005 - 09:05 Uhr

Ne Lösung habe ich nicht, da ich bisher nicht wirklich mit Crystal Report zurecht gekommen bin, aber so wie ich das Ganze verstanden habe muss man doch beim Erstellen des Reports eine oder mehrere feste Datenbankquellen angeben. Das würde doch bedeuten, dass ein Ändern der Datenbankquelle zur Laufzeit, wenn der CrystalViewer die Quelle eingebunden hat nicht mehr möglich ist. Bei mir war es immer so, dass sich der Viewer beim Programmstart zu einer Datenbankquelle verbinden wollte, obwohl ich eine Textdatei mit Werten nutzen wollte.

30.03.2005 - 09:00 Uhr

Hallo,

wieder einmal hänge ich an einem Prob bei meiner Diplomarbeit. Folgendes: Ich möchte die Daten, welche vom Messgerät geliefert werde, per Diagramm in meinem Panel anzeigen lassen. Da ich mit der GDI+ noch nicht so vertraut bin, weiss ich leider nicht ob es Methoden gibt die schneller arbeiten als for-Schleifen.
Da ich nicht jedes Mal einen Messwertedownload durchführen möchte lese ich momentan die Daten aus einer Datei per Streamreader ein. Bei meiner Lösung steigt zwischenzeitlich die Prozessorlast auf über 50% und es entstehen zu lange Wartezeiten bis das Panel neu gezeichnet wird.
Hier der Code:


interface DataVault
	{
		double[] GetTimeValues();
		double[] GetTempValues();
	}

	public class DataClass: DataVault
	{
		int i;
		string temp;
		double[] TempValues;
		double[] TimeValues;
		StreamReader sr;

		public DataClass()
		{
			//
			// TODO: Fügen Sie hier die Konstruktorlogik hinzu
			//
			
		}

		string CreateSubstring()
		{
			sr = new StreamReader("Test.txt",Encoding.ASCII);
			temp = sr.ReadToEnd();
			return temp;
		}

		public double[] GetTimeValues()
		{
			string TimeString = this.CreateSubstring();
			ArrayList art = new ArrayList();
			TimeString = TimeString.Replace('.', ',');
			for(i = 0; i < temp.IndexOf(")");i++)
			{
				art.Add(Convert.ToDouble(TimeString.Substring(0,TimeString.IndexOf(";"))));
				TimeString = TimeString.Remove(0,29);	
				if(TimeString.StartsWith(")"))
					break;
			}
			TimeValues = new double[art.Count];
			art.CopyTo(0, TimeValues, 0, art.Count);
			return this.TimeValues;
		}

		public double[] GetTempValues()
		{
			string TempString = this.CreateSubstring();
			ArrayList ar = new ArrayList();
			TempString = TempString.Replace('.', ',');
			int at = temp.IndexOf(";");
			int bt = temp.IndexOf(";", (at+1));
			for(i = 0; i < temp.IndexOf(")");i++)
			{
				ar.Add(Convert.ToDouble(TempString.Substring(at+1,(bt-(at+1)))));
				TempString = TempString.Remove(0,29);	
				if(TempString.StartsWith(")"))
					break;
			}
			TempValues = new Double[ar.Count];
			ar.CopyTo(0,TempValues,0,ar.Count);
			return this.TempValues;
		}
	}

In der Form selber fülle ich mittels for-Schleife das PointArray


                                                //Initialisiere das PointArray
			//ohne letzte Zeile des Arrays, da diese keinen sinnvollen Daten enthält
			aptf = new PointF[values.Length-1];

			//For-Schleife zum Beschreiben des PointArrays
			for(int i = 0; i<values.Length-1 & i<tempvalues.Length-1; i++)
			{
				aptf[i] = new PointF((float)values[i]-800, (float)tempvalues[i]\*13);
				//Schreibe in die bereitgestellte Datei
				//sw.Write(Convert.ToString(aptf[i]));
			}

Der StreamWriter war nur zum überprüfen der Werte im PointF Array eingebaut.
Gibt es Methoden die diese Arbeiten schneller Erledigen könnten?

24.03.2005 - 11:23 Uhr

Also der geplante Aufbau der Software sieht so aus:

4 Komponente

  1. GUI
    2.Workflow
    3.DataClass oder DataStorage
    4.RS232

Die Logik soll nach Plan komplett in der Workflow Komponente liegen, die RS232 Komponente soll so einfach wie möglich gehalten werden, da es sich sich um ASCII Daten handelt und diese im Max begrenzt sein. Die Sinnfälligkeit der Daten wird auch nur im kleinen Maße überprüft.

Jede Komponente soll veränderbar/austauschbar sein ohne Änderungen an den anderen Komponenten vornehmen zu müssen.
Die Software ist als Laborsoftware vorgesehen und soll die Möglichkeit beinhalten an andere Messgeräte angepasst zu werden.

24.03.2005 - 10:51 Uhr

Hmmm......ok, da hab ich wohl mächtig Mist gebaut. Allerdings wollte ich vermeiden der DataClass eine Instanz der SerialClass zu übergeben, da es sich hierbei um 2 Komponenten handelt die nichts von einander wissen sollen. Da fällt mir ein: Macht es Sinn eine Instanz per Interface zu übergeben oder zerstöre ich dabei auch den Modulcharakter?

PS: Dennoch danke, dass ihr mir bei der Aufholjagd was OOP betrifft helft. Das letzte Mal habe ich ernsthaft im 2.Semester mit OOP gearbeitet. X(
Oh Man, manchmal habe ich besonders Starke Anfälle geistiger Umnachtung. 🤔

24.03.2005 - 10:11 Uhr

Hi,

meine ArrayList wird in einem EventHandler gefüllt und ich möchte später darauf zugreifen. Beim Zugriff muss ich jedoch feststellen, dass die ArrayList jedesmal leer ist. Immo kann ich mir net erklären warum.


public ArrayList arList = new ArrayList();


protected override void OnRxChar(byte ch)
		{
			
			this.arList.Add(ch);
			bufferIndex++;
			Console.WriteLine(this.arList.Count);
                                 }


public static void PrintValues( IEnumerable myList )  
		{
			System.Collections.IEnumerator myEnumerator = myList.GetEnumerator();
			while ( myEnumerator.MoveNext() )
				Console.Write( "\t{0}", myEnumerator.Current );
			Console.WriteLine();
		}

Der Zugriff soll aus einer anderen Klasse erfolgen: Aufgerufen aus der FormsKlasse


public TestPort()
		{
			//
			// TODO: Fügen Sie hier die Konstruktorlogik hinzu
			//
			CharToSend = new TextBox();
			CharToSend.Parent = this;
			CharToSend.KeyPress += new KeyPressEventHandler(CharToSend_KeyPress);

			ArrayWork = new Button();
			ArrayWork.Parent = this;
			ArrayWork.Location = new Point(30,50);
			ArrayWork.Text = "Verarbeiten";
			ArrayWork.Click += new EventHandler(ArrayWork_Click);

			sport = new portconfig.SerialClass();
			sport.Open();
		}


private void ArrayWork_Click(object sender, EventArgs args)
		{
			dc = new DataClass();
			dc.WriteFile();
		}

DataClass.cs:


public void WriteFile()
		{
			SerialClass sc = new SerialClass();
			SerialClass.PrintValues(sc.arList);
			StreamWriter sw = new StreamWriter("Test.txt", true, Encoding.ASCII);
			sw.Close();
		}

In der DataClass.cs sollte eigentlich der Inhalt des ArrayList in eine Datei geschrieben werden. Überseh ich da etwas bei den Instanzen?

22.03.2005 - 11:16 Uhr

Also aus dem heraus was ich bisher mit Hilfe dieses Forums gelernt habe würden mir 2 Dinge einfallen:

  1. Übergib doch das Dataset beim Aufruf der 2.Form an den Konstruktor der 2. Form

  2. Interfaces, also die 1. Form stellt ein Interface(vielleicht reicht hier sogar schon eine Property?) bereit welches die 2. Form implementiert.

Da ich aber noch ein Anfänger in Sachen .NET und C# bin, ist dies bestimmt noch net der Weisheit letzter Schluss 🙂

22.03.2005 - 11:08 Uhr

@Efftee
daran hatte ich auch schon gedacht. Und bei einer parallel Port Geschichte hatte ich da auch schon erste Gehversuche. Allerdings hab ich jetzt die MSDN DLL für .NET jetzt soweit, dass sie Daten überträgt und empfängt. Muss jetzt noch die Datenverarbeitung konzipieren und für vernünftige Formatierung sorgen.

Dazu gleich ne Frage. Momentan läuft der Empfang über Events aus dieser DLL, was ja auch gut funktioniert. Nur stellt sich mir im Moment noch die Frage ob es besser ist die Daten in einem Array zu speichern und dieses Array dann an die Datenhaltungsklasse zu übergeben, welche die Daten dann in einer Datei speichert oder sollte ich die in der Datenhaltungsklasse eingebettete StreamWriter-Methode besser bei jedem Receiveevent aufrufen und die neuen Daten jeweils "hinten" anhängen?
Ich persönlich wäre ja mehr von der Idee des zu übergebenen Arrays angetan.

Was meint ihr?

20.03.2005 - 22:59 Uhr

leider konnte ich dein Beispiel net zum laufen bringen. Die Membervariablen bekamen Compilermeldungen ala '...donnates a namespace where a class was expected'. Die konnte ich soweit eleminieren(ohne garantie, dass es die korrekten korrekturen waren), bin jedoch dann an einer Meldung bei Application.Run() gescheitert. Bei der Meldung verliessen mich dann die Geister. Wenn du irgendwann mal viel Zeit über haben solltest, wäre es sehr nett von dir da mal drüber zu schauen.

Danke schon mal

20.03.2005 - 22:49 Uhr

danke für die vielen Antworten....Momentan arbeite ich mit einer DLL von Codeprojekt.com, in der allerdings die Synchronisation mit Timerevents vorgegeben wird.
Bei der DLL aus der MSDN für .NET 1.1 gab es Probleme was die zu übertragenen Zeichen betrifft. Der Port liess sich öffnen wenn man jedoch ein "?" senden wollte, kam beim Empfänger nur noch Zeichensalat an. Denke in der nächsten Woche wird sich das mein betreuender Prof genauer anschauen.

@seth bei mir ist das ganze nur halb so kompliziert....ist nen "normales" Labormessgerät, Standard Zeichensatz, 1Stopbit, kein Paritätsbit, 8 Datenbits und momentane 9600 Baud....auf "?" wird der Download angestossen und kann auch immo net mehr abgebrochen werden.

16.03.2005 - 10:25 Uhr

So nach dem nun andere Dinge für mein Diplom erledigt sind habe ich die Zeit gefunden um den Ansatz von Herbivore umzusetzen zu versuchen.
Ich poste mal den Quellcode. Falls ich dabei wichtige OOP Ansätze garnicht berücksichtigt hab oder gänzlich am Thema vorbei gerast bin meldet dies bitte. Schon mal danke.


using System;

namespace Events
{
	/// <summary>
	/// Zusammenfassung für Adresse.
	/// </summary>
	public class Adresse
	{
		public Adresse()
		{
			//
			// TODO: Fügen Sie hier die Konstruktorlogik hinzu
			//
		}

		public event EventHandler PLZChanged;

		protected virtual void OnChanged(EventArgs e)
		{
			if(PLZChanged != null)
				PLZChanged(this, e);
		}
		
		public void OnPLZChanged(int plz)
		{
			Console.WriteLine("Ausgelöst wurden ich bin");
			OnAdresse(plz);
			Console.WriteLine(this.PLZ.ToString());
			OnChanged(EventArgs.Empty);
		}

		public int OnAdresse(int plz)
		{
			this.PLZ = plz;
			return this.PLZ;
		}

		private int PLZ;
	}
}


using System;

namespace Events
{
	/// <summary>
	/// Zusammenfassung für Versicherter.
	/// </summary>
	public class Versicherter
	{
		private string name;
		private Adresse _adr;
		public Versicherter()
		{
			//
			// TODO: Fügen Sie hier die Konstruktorlogik hinzu
			//
			Adresse adr = new Adresse();
			_adr = adr;
			
			VersicherterView v = new VersicherterView(_adr);
			new AdresseChanging(_adr);
		}

		public string Name()
		{
			this.name = "Martin";
			return this.name;
		}

		
	}
}


using System;

namespace Events
{
	/// <summary>
	/// Zusammenfassung für VersicherterView.
	/// </summary>
	public class VersicherterView
	{
		private Adresse _adr;
		//private Versicherter _v;

		public VersicherterView(Adresse adr)
		{
			//
			// TODO: Fügen Sie hier die Konstruktorlogik hinzu
			//
			//_v = v;
			_adr = adr;
			//Adresse _adr = new Adresse();
			_adr.PLZChanged += new EventHandler(OnPLZChanged);
			
		}
		static void Main()
		{
			Console.WriteLine((new Versicherter()).Name());
			System.Threading.Thread.Sleep(2000);
		}

		private void OnPLZChanged(object sender, EventArgs e)
		{
			Console.WriteLine("Adresse geändert");
		}
	}
}


using System;

namespace Events
{
	/// <summary>
	/// Zusammenfassung für AdresseChanging.
	/// </summary>
	public class AdresseChanging
	{
		private Adresse _adr;

		public AdresseChanging(Adresse adr)
		{
			//
			// TODO: Fügen Sie hier die Konstruktorlogik hinzu
			//
			_adr = adr;
			_adr.OnPLZChanged(37073);
		
			
		}
		
	}
}

08.03.2005 - 12:07 Uhr

Ok.....soweit hab ich das Ganze verstanden. Werde mal versuchen dein Beispiel umzusetzen.

THX

08.03.2005 - 10:55 Uhr
  1. Habs nicht böse aufgefasst.
  2. Bin ich froh über klare Worte.
  3. War das ne Einschätzung meiner selbst.

Muss das Entfernen eines Delegaten zwangsweise passieren? Oder kann man den Delegaten zugewiesen lassen?

Und noch einmal Danke. Das Forum hier ist mir eine große Hilfe.

08.03.2005 - 10:35 Uhr
  1. Glaub ich mich beim letzten Post total blöd ausgedrückt zu haben
  2. Dachte ich bisher wenigstens halbwegs von Forms ne Ahnung zu haben.
  3. Reift so langsam die Erkenntnis nix gerafft zu haben.

		private void menuItem2_Click(object sender, System.EventArgs e)
		{
			FormObserver Fobs = new FormObserver();
			Fobs.TextChanged += new EventHandler(NewTextBoxText);
			Form2 f2 = new Form2(Fobs);
			//f2.ShowDialog();
			f2.Show();
		}

		private void NewTextBoxText(object sender, EventArgs e)
		{
			if(Fobs.ontext != null)
			{				
				label1.Text = Fobs.ontext;
			}
			else
				throw new NullReferenceException("Kein Wert übergeben");
		}

		public void Detach()
		{
			Fobs.TextChanged -= new EventHandler(NewTextBoxText);
			Fobs = null;
		}

So bekomme ich keinen Zugriff auf die Instanz der Klasse FormObserver da ja die Instanz nicht in der Klasse Form1 existiert. Deswegen habe ich die Erstellung und Initialisierung bei den Membervariablen vorgenommen.

  1. Ich werde versuchen mich in Zukunft an die bessere Namenskonvention zu halten.
08.03.2005 - 10:01 Uhr

@herbivore
Erst einmal Danke für die ausführliche Erklärung. Ich habe versucht das MSDN Lernprogramm auf die Forms zu übertragen, mit heftigen Denkfehlern wie man sieht.

Eines ist mir aber noch aufgefallen wenn ich den FormObserver in menuItem2_Click erstelle und initialisiere dann erhalte ich in in NewTextBoxText keinen Zugriff ohne den FormObserver erneut zu initialieren. Habe deswegen den Formobserver bei den Membervariablen erstellt und initialisiert. Ich hoffe damit nicht gravierend gegen Grundsätze der OOP verstossen zu haben. X(