Timer maximal nur mit 4 Forms?

Hallo,
Wenn bei meinem Timer mehr als 4 Forms geöffnet werden, werden nur die ersten beiden und die letzten beiden Forms sichtbar gemacht.
Ist das denn nur mit 4 Forms möglich?? Habe keine Informationen darüber gefunden.
Gruß Skaletti!

Option Strict On
Public Class TabellenShow
 Private Form1 As New Schüler\_LG\_frei
 Private Form2 As New Jugend\_LG\_frei
 Private Form3 As New Junioren\_LG\_frei
 Private Form4 As New Schützen\_B\_LG\_frei
 Private Form5 As New Schützen\_A\_LG\_frei
 Private Form6 As New Damen\_LG\_frei
 Private Form7 As New Damen\_Alt\_LG\_frei
 Private Form8 As New Altersklasse\_LG\_frei
 Private Form9 As New Senioren\_LG\_frei
 Private Form10 As New Federbock\_LG

 Private Sub Timer1\_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
 Schüler\_LG\_frei.Visible = Not Schüler\_LG\_frei.Visible
 Jugend\_LG\_frei.Visible = Not Schüler\_LG\_frei.Visible
 Junioren\_LG\_frei.Visible = Not Jugend\_LG\_frei.Visible
 Schützen\_B\_LG\_frei.Visible = Not Junioren\_LG\_frei.Visible
 Schützen\_A\_LG\_frei.Visible = Not Schützen\_B\_LG\_frei.Visible
 Damen\_LG\_frei.Visible = Not Schützen\_A\_LG\_frei.Visible
 Damen\_Alt\_LG\_frei.Visible = Not Damen\_LG\_frei.Visible
 Altersklasse\_LG\_frei.Visible = Not Damen\_Alt\_LG\_frei.Visible
 Senioren\_LG\_frei.Visible = Not Altersklasse\_LG\_frei.Visible
 Federbock\_LG.Visible = Not Senioren\_LG\_frei.Visible
 'Timer1.Enabled = False
 End Sub

 Private Sub cmdStart\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStart.Click
 Federbock\_LG.Show()
 Senioren\_LG\_frei.Show()
 Altersklasse\_LG\_frei.Show()
 Damen\_Alt\_LG\_frei.Show()
 Damen\_LG\_frei.Show()
 Schützen\_A\_LG\_frei.Show()
 Schützen\_B\_LG\_frei.Show()
 Junioren\_LG\_frei.Show()
 Jugend\_LG\_frei.Show()
 Schüler\_LG\_frei.Show()
 Timer1.Enabled = True
 Timer1.Interval = 10000
 End Sub

 Private Sub cmdStop\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStop.Click
 Federbock\_LG.Close()
 Senioren\_LG\_frei.Close()
 Altersklasse\_LG\_frei.Close()
 Damen\_Alt\_LG\_frei.Close()
 Damen\_LG\_frei.Close()
 Schützen\_A\_LG\_frei.Close()
 Schützen\_B\_LG\_frei.Close()
 Junioren\_LG\_frei.Close()
 Jugend\_LG\_frei.Close()
 Schüler\_LG\_frei.Close()
 Timer1.Stop()
 End Sub

Hallo!
Abgesehen davon, dass Dein Code nicht wirklich toll aussieht (x-faches Copy/Paste), verstehe ich nicht, warum Du Instanzvariablen „Form1“…„Form10“ anlegst und dann irgendwelche anderen Forms („Federbock_LG“, „Senioren_LG_frei“, …) auf- und zumachst.

Abgesehen davon: Welchen Sinn hat es, Forms timergesteuert auf- und zuzumachen?
Ein Form ist dazu da, damit der Anwender Daten eingeben oder sich ansehen kann. Mit einem Timer bist Du kaum in der Lage zu bestimmen, wann die Eingabe abgeschlossen ist oder der Anwender sich nicht mehr für das Form interessiert.

Um auf Deine Ausgangsfrage zu antworten: Nein, es gibt keine „künstliche“ Begrenzung, dass Du nur 4, aber keine 5 Forms öffnen kannst. Wäre ja auch ziemlich hirnrissig.
Allgemein ist es - insbesondere wenn man anfängt zu programmieren - i.d.R. besser, davon auszugehen, der Fehler im eigenen Code liegt als im Framework.

Gruß,
Martin
Gruß,
Martin

Hallo Martin,
Danke für deine Antwort.

Abgesehen davon, dass Dein Code nicht wirklich toll aussieht

Mag sein, habe als Anfänger keine andere Programmierung hinbekommen.
Wenn es richtig funzen würde, würde es mich nicht stören.

(x-faches Copy/Paste), verstehe ich nicht, warum Du
Instanzvariablen „Form1“…„Form10“ anlegst und dann
irgendwelche anderen Forms („Federbock_LG“,
„Senioren_LG_frei“, …) auf- und zumachst.

Ich bin manchmal noch ein Tölpel.

 Private Form1 As New Schüler\_LG\_frei
 Private Form2 As New Jugend\_LG\_frei
 Private Form3 As New Junioren\_LG\_frei
 Private Form4 As New Schützen\_B\_LG\_frei
 Private Form5 As New Schützen\_A\_LG\_frei
 Private Form6 As New Damen\_LG\_frei
 Private Form7 As New Damen\_Alt\_LG\_frei
 Private Form8 As New Altersklasse\_LG\_frei
 Private Form9 As New Senioren\_LG\_frei
 Private Form10 As New Federbock\_LG

 Private Sub Timer1\_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
 Form1.Visible = Not Form1.Visible
 Form2.Visible = Not Form1.Visible
 Form3.Visible = Not Form2.Visible
 Form4.Visible = Not Form3.Visible
 Form5.Visible = Not Form4.Visible
 Form6.Visible = Not Form5.Visible
 Form7.Visible = Not Form6.Visible
 Form8.Visible = Not Form7.Visible
 Form9.Visible = Not Form8.Visible
 Form10.Visible = Not Form9.Visible
 'Timer1.Enabled = False
 End Sub

 Private Sub cmdStart\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStart.Click
 Form10.Show()
 Form9.Show()
 Form8.Show()
 Form7.Show()
 Form6.Show()
 Form5.Show()
 Form4.Show()
 Form3.Show()
 Form2.Show()
 Form1.Show()
 Timer1.Enabled = True
 Timer1.Interval = 10000
 End Sub

 Private Sub cmdStop\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdStop.Click
 Form10.Close()
 Form9.Close()
 Form8.Close()
 Form7.Close()
 Form6.Close()
 Form5.Close()
 Form4.Close()
 Form3.Close()
 Form2.Close()
 Form1.Close()
 Timer1.Stop()
 End Sub

Es werden allerdings nur Form1, Form2, Form9, Form10 sichtbar.

Abgesehen davon: Welchen Sinn hat es, Forms timergesteuert
auf- und zuzumachen?

Nun, es soll ein Tabellendurchlauf sein, den die Zuschauer über einen Beamer sehen können. Daten sollen natürlich nicht eingegeben werden.
Wenn es da eine andere Möglichkeit gibt die Tabellen zu präsentieren bin ich gerne bereit das zu testen. Ich arbeite mit einer Access Datenbank. Vielleicht kann man das auch in Access machen.

Um auf Deine Ausgangsfrage zu antworten: Nein, es gibt keine
„künstliche“ Begrenzung, dass Du nur 4, aber keine 5 Forms
öffnen kannst. Wäre ja auch ziemlich hirnrissig.
Allgemein ist es - insbesondere wenn man anfängt zu
programmieren - i.d.R. besser, davon auszugehen, der Fehler im
eigenen Code liegt als im Framework.

Ich bin schon davon ausgegangen das der Fehler in meinem Code liegt.
Die Frage diente lediglich zur Absicherung ob nicht doch.

Gruß Skaletti!

Hallo nochmal!
Jetzt hast Du genau das gemacht, was man nicht machen sollte.
Du hattest Deine Instanzvariablen ja schon halbwegs vernünftig benannt und nun machst Du Form1…FormN draus.

Gib’ Deinen Klassen und Variablen vernünftige Namen - sie haben es verdient. Du hast doch auch einen vernünftigen Namen, oder heisst Du Sohn1? :smile:

Weiterhin vermute ich anhand Deiner Beschreibung, dass die 10 unterschiedlichen Forms alle gleich aussehen - Tabelle drauf und nicht recht viel mehr. Der einzige Unterschied sind wohl die Daten, die in der Tabelle angezeigt werden, oder?
Dafür kopiert man aber nicht neunmal ein Formular.

Wenn es so ist, wie ich denke, dann nimm EIN Form und mach’ den Timer in dieses Form rein.
Dann aktualisierst Du die Tabelle im Tick-Ereignis und hast erheblich weniger redundanten Code, kein Rumgeflackere mit öffnenden und schließenden Fenstern und Du kannst mit einem einzigen Breakpoint die Stelle überwachen, an der die Tabelle aktualisiert wird.

Gruß,
Martin

Hallo Martin,

Jetzt hast Du genau das gemacht, was man nicht machen sollte.
Du hattest Deine Instanzvariablen ja schon halbwegs vernünftig
benannt und nun machst Du Form1…FormN draus.

Gib’ Deinen Klassen und Variablen vernünftige Namen - sie
haben es verdient. Du hast doch auch einen vernünftigen Namen,
oder heisst Du Sohn1? :smile:

Hab mir gedacht,
erstmal soll das ganze Ding laufen und wird dann mit „sprechenden“ Namen versehen. Laufen tuts noch nicht.

Weiterhin vermute ich anhand Deiner Beschreibung, dass die 10
unterschiedlichen Forms alle gleich aussehen - Tabelle drauf
und nicht recht viel mehr. Der einzige Unterschied sind wohl
die Daten, die in der Tabelle angezeigt werden, oder?

Richtig vermutet!

Dafür kopiert man aber nicht neunmal ein Formular.

Es werden keine Formulare kopiert. Ich versuch das Ganze mal etwas ausführlicher zu beschreiben. In mein Projekt (Sportveranstaltung) habe ich eine Access Datenbank mit typisierten Dataset eingebunden.Die DB wird aus den Forms Anmeldung, Ergebnisverwaltung und Mannschaftsverwaltung mit Daten gefüttert.In der DB gibt es Auswahlabfragen die nach bestimmten Kriterien die Sportler mit ihren Ergebnissen in die richtigen Klassen sortiert und eine Rangliste erstellt(Funzt bis hier prima). Diese Ranglisten(DataGridView) sollen für die Zuschauer auf eine Leinwand sichtbar gemacht werden.
Tabellendurchlauf.

Wenn es so ist, wie ich denke, dann nimm EIN Form und mach’
den Timer in dieses Form rein.
Dann aktualisierst Du die Tabelle im Tick-Ereignis und hast
erheblich weniger redundanten Code, kein Rumgeflackere mit
öffnenden und schließenden Fenstern und Du kannst mit einem
einzigen Breakpoint die Stelle überwachen, an der die Tabelle
aktualisiert wird.

Meinst Du das in einem Form die DataGridViews nacheinander angezeigt werden? Wenn das geht, wie?? Es geht hier nicht um eine Tabelle sondern um 4 x 10 Tabellen.
Gruß Skaletti!
Danke für deine Hilfe und Mühe.

Hallo nochmal!

[…]
Hab mir gedacht,
erstmal soll das ganze Ding laufen und wird dann mit
„sprechenden“ Namen versehen. Laufen tuts noch nicht.

Ich spreche aus Erfahrung: Wenn Du’s nicht gleich machst, tust Du Dich unnötig schwer und wenn’s dann irgendwann mal irgendwie läuft, dann bringst Du wahrscheinlich nicht die Energie auf, das Projekt aufzuräumen - es läuft schließlich keinen Deut besser, wenn Du sinnvolle Namen verwendest.
Außerdem wird es umso aufwändiger, je länger Du mit den nichtssagenden Bezeichnungen hantierst.

[…]

Für das, was Du vorhast, würde ich vorschlagen, EIN Form zu designen, mit dem gewünschten DataGridView drauf.

Ich weiß nicht, wie Du genau Dein DGV befütterst, aber wenn Du Dir die Datenbindung einfach per Visual Studio zusammengeklickt hast, dann dürftest Du eine Datenquelle haben (die DB), ein DataSet, eine BindingSource und einen TableAdapter.

Über den TableAdapter werden die Daten aus der DB in das DataSet geholt und die BindingSource regelt letztlich die Anzeige der Daten im DGV.

Um die angezeigten Daten zu aktualisieren musst Du daher nur das SelectCommand des TableAdapter anpassen, so dass der gerade gewünschte SELECT gemacht wird und anschließend wieder das Füllen der DataTable im DataSet per TableAdapter.Fill() anstoßen.

Die einzelnen SELECTs kannst Du Dir bspw. in einem Array halten, einen Zähler mitführen, der bei jedem TimerTick inkrementiert wird (modulo der Anzahl Arrayeinträge) und dann jeweils das n-te SELECT in den TableAdapter stopft.
Ist letztlich ein Fünfzeiler oder so.

Gruß,
Martin

Hallo Martin,
genauso wird das DGV gefüttert.
Werd mich jetzt mal mit dem beschäftigen was du vorgeschlagen hast.
Können diese Sache jetzt erstmal abschließen.
Danke für deine Hilfe und für die Ratschläge.
Mit freundlichen Grüßen
Skaletti!