www.mikrocontroller.net

Forum: PC-Programmierung Programm stürzt ab


Autor: kevin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: kevin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier die Fehlermeldung!

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kevin (Gast)
Datum:

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

Autor: kevin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/singleinstanceap...
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/formcontrolposit... (sichert
in die Registry)

Vielleicht kannst auch du so bestimmte Einstelldaten dauerhaft
speichern?

Autor: kevin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kevin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: kevin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Fehlermeldung siehe Bild!

Autor: kevin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: arc (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: kevin (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: kevin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.