Programm stürzt ab

Gast #417266
Lesenswert?

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.
Gast #417269
Lesenswert?

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.
Gast #417272
Lesenswert?

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?
Gast #417274
Lesenswert?

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.
Gast #417275
Lesenswert?

...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.
Gast #417277
Lesenswert?

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.
Gast #417278
Lesenswert?

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);
Gast #417279
Lesenswert?

..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.
Angehängte Dateien:
Gast #417280
Lesenswert?

...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.
Gast #417281
Lesenswert?

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.
Gast #417282
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren