Laden...

Der Name xyz ist im aktuellen Kontext nicht vorhanden.

Erstellt von Ledge vor 13 Jahren Letzter Beitrag vor 13 Jahren 15.814 Views
L
Ledge Themenstarter:in
17 Beiträge seit 2010
vor 13 Jahren
Der Name xyz ist im aktuellen Kontext nicht vorhanden.

Hallo zusammen,

Mein
M233.Kill();
M233.WaitForExit();

funktioniert nicht, da ich M233 in einem If-Block generiert habe. Es kommt die Meldung:

Der Name M233 ist im aktuellen Kontext nicht vorhanden.

Wie mache ich M233 den außerhalb des If-Blocks bekannt?

Gruß, Wolle

private void tWindowCheck_Tick(object sender, EventArgs e)
        {
             //enumerate thru Windows collection
			Windows wndList = new Windows(InvisibleBox.Checked,NoTitleBox.Checked);
			foreach (Window wnd in wndList)
            {
                if (CutLongString(wnd.Title, 11) == "Futurehouse")
                {
                    Globals.HSGestartet = true;
                    break;    
                }
            }
            if (Globals.HSGestartet == true)
            {
                if (Globals.M233Gestartet == false)
                {
                    Process M233 = Process.Start(@"C:\Test.exe");
                    Globals.M233Gestartet = true;
                    Globals.M233killed = false;
                }
            }
            else
            {
                if (Globals.M233killed == false)
                {
                    M233.Kill();
                    M233.WaitForExit();
                    Globals.M233killed = true;
                    Globals.M233Gestartet = false;
                    
                }
            }
            Globals.HSGestartet = false;
		}
F
174 Beiträge seit 2007
vor 13 Jahren

Hallo Ledge,

indem du das Objekt einfach vor dem If-Block erzeugst.


Process M233;
if (Globals.HSGestartet)
{
    ...

Du solltest dir auch das hier anschauen: [Tipp] Anfängerfehler == true / == false.

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

genauer gesagt indem Du die Variable M233, die eine Referenz auf ein Objekt der Process-Klasse aufnehmen kannst, vor dem if-Block deklarierst.
Die eigentliche Erzeugung des Objekts findet aber erst mit dem Process.Start-Aufruf statt, der Dir ein entsprechendes Objekt zurückliefert.
Deshalb solltest Du dann wenn Du den Prozess beenden willst, vorher prüfen ob überhaupt ein Prozess erstellt wurde.

Bitte beachte auch [Hinweis] Wie poste ich richtig? Punkt 1.1.1, denn hierbei handelt es sich um elementare Grundlagen, die wir als bekannt voraussetzen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

L
Ledge Themenstarter:in
17 Beiträge seit 2010
vor 13 Jahren

Danke erstmal für die Hilfe, aber leider klappt es nocht nicht.

Habe folgende Änderung gemacht, aber nun bekomme ich den Fehler:

Verwendung der nicht zugewiesenen lokalen Variable "M233"

Was mach ich falsch?

private void tWindowCheck_Tick(object sender, EventArgs e)
        {
             //enumerate thru Windows collection
            Windows wndList = new Windows(InvisibleBox.Checked,NoTitleBox.Checked);
            foreach (Window wnd in wndList)
            {
                if (CutLongString(wnd.Title, 11) == "Futurehouse")
                {
                    Globals.HSGestartet = true;
                    break;
                }
            }
            Process M233;
            if (Globals.HSGestartet == true)
            {
                if (Globals.M233Gestartet == false)
                {
                    M233 = Process.Start(@"C:\Test.exe");
                    Globals.M233Gestartet = true;
                    Globals.M233killed = false;
                }
            }
            else
            {
                if (Globals.M233killed == false)
                {
                    M233.Kill();
                    M233.WaitForExit();
                    Globals.M233killed = true;
                    Globals.M233Gestartet = false;

                }
            }
            Globals.HSGestartet = false;
        } 
3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

Was mach ich falsch? Du initialisierst die Variable nicht:

Process M233 = null;

sollte helfen.

Dann vor der Benutzung beim Kill-Aufruf

if(M233 != null)

nicht vergessen.

Bitte lies Dir den Hinweis aus meinem vorherigen Post durch, und befasse Dich mit den Grundlagen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

K
62 Beiträge seit 2009
vor 13 Jahren

Solang M233 lokal deklariert bleibt, wird sie beim M233.Kill() auch nie definiert sein...

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

@Kileak: auch wieder wahr... hatte gar nicht gesehen daß das scheinbar in einem Timer aufgerufen wird.

@Ledge: Für diesen Fall brauchst Du eine Membervariable (Feld) für den Prozess in der Klasse die die tWindowCheck_Tick-Methode enthält.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

S
211 Beiträge seit 2010
vor 13 Jahren

Würde sogar behaupten dass das vom Timer unabhängig ist.
Wenn die Variable im if Block deklariert wird und im zugehörigen else Block gekillt wird, davor aber immer wieder mit null initialisiert wird, macht das irgendwie alles nicht wirklich Sinn 🤔

3.170 Beiträge seit 2006
vor 13 Jahren

Hallo,

Würde sogar behaupten dass das vom Timer unabhängig ist.

Völlig richtig, das ist natürlich unabhängig vom Timer.
Entscheidend ist lediglich, daß die Methode bei einem Durchlauf nur entweder den Prozess erzeugt oder ihn killt (diesen Umstand hatte ich anfangs übersehen).
Deshalb wird eine Membervariable gebraucht, um in jedem Durchlauf der Methode auf die Variable zuzugreifen -> diese darf dann natürlich nicht innerhalb der Methode mit null initialisiert werden, das darf nur im Konstruktor und nach dem Kill-Aufruf geschehen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

L
Ledge Themenstarter:in
17 Beiträge seit 2010
vor 13 Jahren

Danke Euch für die Antworten, damit konnte ich mir was basteln.

Mit den Grundlagen werde ich mich in jedem Falle beschäftigen.

Ich habe leider nur im Moment bissle Zeitdruck. Ich muss eine Anwendung die ich vor Jahren in VB 6 erstellt habe in c#.net portieren, vb war kein Prob, aber c# bin ich wie Du gemerkt hast noch ziemlicher Anfänger.

Vielen Dank noch für die schnelle Reaktion, habe mir Die Tips auch schon zu gemüte geführt.

Habe jetzt m233 in Globals mit

public static Process M233 = null;

initialisiert und damit geht es wunderbar.

Und duck ^^ jetzt nicht über mich herfallen 😉, ist bestimmt nicht das gelbe vom Ei aber für den Fall tut es ganau das was ich damit erzielen möchte.

Falls es da eine Möglichkeit gibt wie man das selbe erreicht aber es prinzipiel deutlich besser oder auch stilechter ist bin ich ganz Ohr.

Brauche auch nur Stichwörter, wonach ich Googlen soll.

Grüße und Ihr seid super, Wolle

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo Ledge,

Ich habe leider nur im Moment bissle Zeitdruck.

deinen Zeitdruck kannst da aber bitte nicht auf das Forum abwälzen und er ist keine Rechtfertigung für Regelverstöße.

aber c# bin ich wie Du gemerkt hast noch ziemlicher Anfänger.

Um so wichtiger ist es, dass du [Hinweis] Wie poste ich richtig? Punkt 1.1.1 liest und beherzigst.

Siehe auch [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen).

herbivore