Ich habe mir in Visual Studio 2003 C# eine Applikation geschrieben. In diesem Projekt gibt es insgesamt zwei Fenster. In dem einen Fenster greife ich auf eine *.cs Datei zu. Nach dem schließen des fensters soll im Hauptfenster die Daten übernommen werden. Und genau da meckert Visual Studio. Hauptfenster: Form1 zweites Fenster: Transmit CS Datei heisst Can.cs Im zweiten Fenster habe ich das hinzugefügt: Can Can1; public int value_id=0; ... Can1.tr.id = 0x55; value_id = Can1.tr.id Im Hauptfenster habe ich das hinzugefügt: Can Can2; ... wenn ich auf value_id zugreifen will dann erscheint eine Fehlermeldung.
Generell ist es sehr schwierig aus irgendwelchen Code-Fetzen irgendwelche Aussagen zu treffen, was den falsch sein könnte. Zumindest ist die Fehlermeldung mal interessant, da sie oft den entscheidenden Hinweis enthält, was den nun falsch ist. Also: Wie lautet der Fehler?
Meine Vermutung: Beim Schliessen des Fensters #2 wird dessen Instanz und damit auch die Variablen Can1 und value_id ungültig, aber du versucht aus Fenster #1 noch darauf zurückzugreifen. Du könntest in #2 die Close-Message abfangen, Can1 bzw. value_id an #1 kopieren (senden) und dann erst das Fenster #2 endgültig schliessen.
Danke für die Hilfe! Wie kann ich eine Close-Message abfangen? Und was meinst du mit senden? Wie kopieren? ....???
Hallo Stefan, kannst du mir vielleicht sagen wie ich dies als Beispiel in C# umsetzen könnte?
Sorry, mit C# kenne ich mich nicht aus. In solchen Fällen schaue ich gerne auf www.codeproject.com nach, ob es nutzbare Beispiele/Anleitungen gibt. Unter http://www.codeproject.com/csharp/singleinstanceapplication.asp im Abschnitt Minimizing the Window to the Notification Area findet man was (allerdings macht das Beispiel dort wesentlich mehr): Ich schätze, du kannst die OnClosing Methode des Fensters Transmit überschreiben. In der eigenen Routine übergibst du zuerst die Daten an Fenster Form1 (z.B. eine selbstgeschriebene Methode von Form1 aufrufen) und beendest dann erst das Fenster Transmit durch Aufruf der orginalen OnClosing Methode. Weitere Artikel findest du durch eine Suche nach OnClosing unter den C# Artitkeln. Ganz anschaulich für die Arbeitsweise finde ich das Ausblenddemo http://www.codeproject.com/csharp/fadingform.asp Und die Fensterposition-sichern-Beispiele http://www.codeproject.com/csharp/persistentform_class.asp (sichert in eine Konfigdatei) http://www.codeproject.com/csharp/formcontrolpositionsize.asp (sichert in die Registry) Vielleicht kannst auch du so bestimmte Einstelldaten dauerhaft speichern?
Hi Stefan, danke für die Unterstützung. Hab es noch nicht hinbekommen. Gibt es in diesem Forum Fachleute die sich mit solch einem Problem auskennen?
Ich würde das auch so machen wie der Stefan sagt. Also im Hauptfenster (Form1) public variabeln definieren. Dann kannst Du beim "FormClosing" Event von der Transmit Form diese Variabeln mit den gewünschten Werten füllen. Das "FormClosing" findest Du, wenn Du im Visual Studio auf die Transmit Form klickst. Dann rechts im Fenster bei den Properties zu dieser Form auf den Blitz (also die Ereignisse / Events zu dieser Form). Dann eifach auf "FormClosing" doppelklicken und das Visual Studio erstellt Dir eine leere Methode, in welcher Du Deinen Code reinprogrammieren kannst.
...ich habs mal bei mir mit Closing probiert. Hauptfenster Form1: private void timer1_Tick(object sender, System.EventArgs e) { textBox1.Text = System.Convert.ToString(transmit_flag,10); } Transmit Fenster: private void Transmit_Closing(object sender, System.ComponentModel.CancelEventArgs e) { transmit_flag=1; } Da tut sich überhaupt nichts. Das mit der Fehlermeldung hab ich beriets behoben. Wenn ich das Transmit Fenster schließe, dann erscheint in der TextBox vom Hauptfenster immer 0.
ja wie könnte ich in dem Transmitfenster auf die Variablen und Funktionen vom Hauptfenster zugreifen. Ich denke desshalb erscheint auch die Fehlermeldung. Ich habe keinen Plan wie ich das lösen könnte.
Eine Möglichkeit wäre, die Variablen per Referenz an das Transmitfenster zu übergeben (als Parameter des Transmitfenster-Konstruktors). Transmit t = new Transmit(ref can, ref value_id) Zweite Möglichkeit: Form1 registriert beim Erzeugen des Fensters einen eigenen FormClosing-Handler und liest dann die entsprechenden Werte aus der Transmitform aus. Transmit t = new Transmit(); t.Closing += new CancelEventHandler(closingHandler) oder die Transmit-Form stellt einen eigenen Event (z.B. onDataChanged) bereit und übergibt beim Auslösen dann die Werte: public delegate void DataChangedHandler(Can can, int value_id) class Transmit { public event DataChangedHandler OnDataChanged; ... // in Form1 Transmit t = new Transmit(); t.OnDataChanged += new DataChangedHandler(eigenerHandler);
..ich habe diesen Code mal so bei mir ausprobiert: C#-Code: private void button2_Click(object sender, System.EventArgs e) { Form2 frm = new Form2(); frm.frm1 = this; frm.ShowDialog(); } Und in Form2: C#-Code: private Form1 _frm1; public Form1 frm1 { set { this._frm1 = value; } } private void button1_Click(object sender, System.EventArgs e) { MessageBox.Show( this._frm1.vorname ); } Das Funktioniert nur zum Teil. Wenn ich das zweite Fenster schließe dann erscheint so eine Fehlermeldung.
...puhhh ich weiss nicht was ich genau tun soll. Ich möchte eigentlich nur Daten vom Transmit Fenster dem Hauptfenster Form1 übergeben, ohne das irgend eine Fehlermeldung erscheint. Danke arc für die Hilfe, aber beim Umsetzen deiner Ansätze habe ich sehr große Probleme. Es funzt gar nix.
Sorry, ich muss aussteigen. Erstens habe ich wie berichtet zu wenig C# Kenntnisse, um dir ein komplettes Gerüst vorzugeben. Ich könnte höchstens den Tip geben, ein Beispiel zu suchen und das abzuwandeln. Und zweitens kann ich mit deinen spartanischen Codeschnippseln zu wenig anfangen. Mir erschliesst sich daraus nicht, welche Fenster wie/wo angelegt werden und welche Funktionen/Variablen welchen Fenstern zugeordnet sind.
Also das würde so funktionieren: class Transmit { private Form1 form1 = null; public Transmit(Form1 f1) { form1 = f1; } private void machwas() { form1. ... = ...; } } Im Konstruktor des Forms "Transmit" erwartest Du die "Referenz" zu Form 1. In Form1 musst Du also dessen "Referenz" übergeben, wenn Du das Transmit Form erzeugst. Also in Form1 müsste so was ähnliches drin stehen: Form2 Transmit = new Form2(this); Transmit.Show(); Danach kannst Du in der Form Transmit auf die public resourcen von Form1 zugreifen (siehe Funktion "machwas" im obigen Beispiel). Hoffe das hilft Dir ein wenig. Anfangs scheint es ein wenig kompliziert, aber ist eigentlich ganz einfach.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.