Forum: PC-Programmierung Programm stürzt ab


von kevin (Gast)


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.

von Karl heinz B. (kbucheg)


Lesenswert?

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?

von kevin (Gast)


Angehängte Dateien:

Lesenswert?

hier die Fehlermeldung!

von Stefan (Gast)


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.

von kevin (Gast)


Lesenswert?

Danke für die Hilfe!
Wie kann ich eine Close-Message abfangen?
Und was meinst du mit senden? Wie kopieren? ....???

von kevin (Gast)


Lesenswert?

Hallo Stefan,

kannst du  mir vielleicht sagen wie ich dies als Beispiel in C#
umsetzen könnte?

von Stefan (Gast)


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?

von kevin (Gast)


Lesenswert?

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?

von Johnny (Gast)


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.

von kevin (Gast)


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.

von kevin (Gast)


Angehängte Dateien:

Lesenswert?

Fehlermeldung siehe Bild!

von kevin (Gast)


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.

von arc (Gast)


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);

von kevin (Gast)


Angehängte Dateien:

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.

von kevin (Gast)


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.

von Stefan (Gast)


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.

von Johnny (Gast)


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.

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
Noch kein Account? Hier anmelden.