Autor Beitrag
Ccenter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: Fr 09.10.09 19:49 
Hallo,
ich habe gerade ein Problem:
also ich habe eine Form1 mit 2 Buttons. Wenn ich auf Button1 klicke, kommt eine Form2. Wenn ich jetzt auf Button2 klicke, möchte ich gerne Prüfen, ob Form2 offen ist oder nicht.

Hab google zwar benutzt, aber nichts wirklich hilfreiches gefunden, nur für vb.
Dort wurde etwas gesagt wie:

ausblenden Quelltext
1:
2:
3:
4:
5:
If IsFormLoaded(einstellungen) Then 
    MsgBox "Ist Offen" 
Else 
    MsgBox "Ist nicht offen" 
End If


Habe versucht das auf C# zu übertragen, ist mir aber missglückt. Könnte mir einer sagen wie das geht?
JasonDelife
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 7 Professional
C# (Visual Studio 2008 Professional), Java (NetBeans IDE 6.7)
BeitragVerfasst: Fr 09.10.09 21:13 
Lege die Form als Klassenmember an und prüfe auf null bzw. Visible.

Grüße, JasonDelife.
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: Fr 09.10.09 22:15 
Hier ist auch was: Klick Ist zwar kein C#, aber VB.Net ist ja auch .Net und das sollte genügen um es anzupassen.

_________________
Gruß
Christoph
Ccenter Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 154

Win7
C#
BeitragVerfasst: Sa 10.10.09 11:51 
Danke für die Antworten aber ich hatte in meinem Ausgangspost ja schon gesagt das ich nicht damit klar komme, vb auf C# zu übertragen.
@JasonDelife: Blöde Frage aber was meinst du mit "Lege die Form als Klassenmember an" ?
Das mit null hab ich schon vorher ausprobiert, ist mir aber auch nicht geglückt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
private void button2_Click(object sender, EventArgs e)
        {
            if (Form2 == null)
            {
                MessageBox.Show("Form2 ist nicht offen");
            }
        }


was soll da nach "Form2" hin?
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 10.10.09 12:16 
Hallo,

du musst unterscheiden zwischen einer Klasse (= Form2) und einem konkreten Objekt (Instanz). Die Definition einer Klasse geschieht mit den allgemeinen Namen und Festlegungen, die Arbeit innerhalb einer Klasse geschieht mit konkreten Bestandteilen dieser Klasse.

user profile iconCcenter hat folgendes geschrieben Zum zitierten Posting springen:
also ich habe eine Form1 mit 2 Buttons. Wenn ich auf Button1 klicke, kommt eine Form2. Wenn ich jetzt auf Button2 klicke, möchte ich gerne Prüfen, ob Form2 offen ist oder nicht.

Du befindest dich in einer Instanz mainForm der Form1-Klasse. Wenn du dort auf Button1 klickst, erzeugst du eine Instanz secondForm der Form2-Klasse. Alles, was danach folgt, wird innerhalb jeder Form1-Instanz mit secondForm gemacht. Damit reduziert sich das Problem darauf, wo alles secondForm benutzt wird und wo es bekanntgemacht (deklariert) wird.

Jason meinte also, dass secondForm nicht nur innerhalb von Button1_Click bekannt sein soll, sondern innerhalb der ganzen Form1-Klasse. Dann ist secondForm überall in einer Form1-Instanz bekannt, also auch innerhalb von Button2_Click. Dort kannst du also die gewünschten Prüfungen vornehmen.
ausblenden C#-Quelltext
1:
2:
3:
if ( (secondForm == null) || ( ! secondForm.Visible ) )
   ShowMessage("Pech gehabt");
else { /* tu was */ }

Dein Problem hat also fast nichts mit VB oder C# zu tun, sondern mit Klassenaufbau und Geltungsbereich von Variablen. (Letzteres ist zwar eine Sache der Sprache, aber dein Problem würde in VB genauso auftreten.)

Dringende Empfehlung: Arbeite dich grundsätzlich in C# und vor allem auch OOP ein, z.B. anhand der OpenBooks (dort findest du Visual C#, C#, OOP).

Gruß Jürgen
SyLuS
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Mi 07.01.15 14:28 
Hallo,

bin gerade über die Suche auf diesen Post hier gestoßen.
Muss ja sagen ich bin etwas geschockt. Ihr hättet dem armen das ruhig an einem Beispiel erklären können anstatt ihm alles in Theorie zu servieren.

Daher packe ich (Auch wenn es ein alter Thread ist, das mir in dem Fall egal. Aber so kann man den Leuten das Programmieren auch vermiesen) jetzt mal ein kleines Beispiel dazu.

Wie bereits erwähnt wird zuerst eine Klasse "Form1" erzeugt, welche 2 Buttons besitzt.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    //Event, das ausgelöst wird, wenn button1 betätigt wird.
    //Es wird Form2 geöffnet.
    private void button1_Click(object sender, EventArgs e)
    {

    }

    //Event, das ausgelöst wird, wenn button2 betätigt wird.
    //Es wird geprüft, ob Form2 bereits geöffnet ist
    private void button2_Click(object sender, EventArgs e)
    {

    }
  }



Nun erstellen wir eine Form2, die geöffnet werden soll. Den Code von Form2 lasse ich hier aber weg.
Jetzt erweitern wir Form1.

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
public partial class Form1 : Form
  {
    //Dies ist eine Variable, die von überall aus Form1 zugreifbar ist.
    //Würde der Zugriffsmodifikator (private) auf public stehen, so könnte man das Object auch von einer anderen Klasse aus sehen/verwenden
    //Da wir gleich ein Object davon erzeugen ( = new ...) ist die Form2 nie null.
    private Form2 form2Object = new Form2();

    public Form1()
    {
      InitializeComponent();
    }

    //Event, das ausgelöst wird, wenn button1 betätigt wird.
    //Es wird Form2 geöffnet.
    private void button1_Click(object sender, EventArgs e)
    {
      //Vor dem öffnen erzeugen wir ein neues Object
      //Das ist notwendig wenn die Form geschlossen und wieder geöffnet wird
      //Eine Form, welche Disposed ist lässt sich nicht erneut anzeigen
      form2Object = new Form2();

      //Jetzt das Object (Form2) anzeigen
      form2Object.Show();
    }

    //Event, das ausgelöst wird, wenn button2 betätigt wird.
    //Es wird geprüft, ob Form2 bereits geöffnet ist
    private void button2_Click(object sender, EventArgs e)
    {
      //Jede Form/Control besitzt eine Property/Eigenschaft IsDisposed.
      //Zur erklärung: Disposed bedeutet, dass ein Object als "wird nichtmehr verwendet, kannn gelöscht werden" gezeichnet ist
      //Wenn eine Form geschlossen wird, so wird automatisch disposed aufgerufen damit der Speicher wieder freigegeben wird
      //Auf null zu prüfen wäre falsch denn eine Form, die geschlossen wird ist dennoch nicht null
      //Auf Visible zu prüfen würde hier ebenfalls funktionieren aber Form2 kann ja unter umständen auch mal unsichtbar sein je nach verwendungszweck
      if (form2Object.IsDisposed)
      {
        MessageBox.Show("Form2 wird NICHT angezeigt");
      }
      else
      {
        MessageBox.Show("Form2 WIRD angezeigt");
      }
    }
  }


Ich hoffe, dass dieses Beispiel gerade Anfängern, wie dem Thread-Starter, ein wenig hilft zu begreifen, was ein Object und was eine Klasse ist und wie es sich mit der Sichtbarkeit/Zugreifbarkeit verhält wenn man die Variable nicht in der Methode sondern in der Klasse angelegt wird.
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Mi 07.01.15 19:00 
Hallo,

du kannst bei WinForms auch einfach
ausblenden C#-Quelltext
1:
Application.OpenForms					

nehmen. Da sind alle geöffneten Forms aufgelistet (egal ob sichtbar oder nicht).
Und wenn du prüfen willst, ob schon irgendein Fenster vom Typ Form2 offen ist, kannst du so prüfen:
ausblenden C#-Quelltext
1:
bool form2Opened = Application.OpenForms.Any(f => f is Form2);					

Das ist im Prinzip das Gleiche wie:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
bool form2Opened;
foreach(Form f in Application.OpenForms)
{
    if (f.GetType() == typeof(Form2))
    {
        form2Opened = true;
    }
}

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler