Autor Beitrag
foxy
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Fr 25.07.08 14:24 
Hallo Leute,
ich bin die ganze zeit nun hier im board und in google auf der suche nach einem guten tut zum bauen eines splashscreens.
Es gibt sehr viele beispiele etc. , aber eine grundlegende frage wird irgendwie nicht beantwortet.

Wenn ich einen Splash erzeuge mit

ausblenden C#-Quelltext
1:
2:
Splash splash = new Splash().
splash.show();


alles logisch, das ich da nun auch eine Form namens splash haben muss ist klar.

aber wie verbinde ich das ganze so, das der splashscreen so lange aktiv bleibt, wie mein programm das am starten ist noch in den vorbereitungen steckt bis es wirklich die Form des ersten fensters laden kann ?
Und vorallem wie zeige ich das auf dem Splashscreen an.
Zu dem anzeigenhabe ich mir überleget, das ich setters und getters ind die splashform machen kann, die dann dynamisch die Labels oder progressbar ändern.
Aber wie gesagt das größte problem ist wohl das einfachste, aber ich komm enicht drauf. Wo starte ich den splashscreen ?

gruß
Heiko

Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
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: Fr 25.07.08 15:07 
Hallo Heiko,

kurze Anleitung: Der Splash-Screen wird aufgerufen von der Program.cs aus in der Main-Methode. Zur Aktualisierung der Anzeige ist es am einfachsten, eine spezielle Methode in der SplashForm vorzusehen und diese Methode als Delegate während der Ausführung aller Startmaßnahmen aufzurufen. Die Struktur sieht ungefähr so aus:

Klasse und Routine für die Startmaßnahmen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
public class StartActions
{
  public OnNextStep NextStep;

  #region Init als Arbeitsablauf
  public bool Init()
  {
    bool success = true;
    //  alle Startmaßnahmen, dabei jeweils anzeigen:
    NextStep("Label2""der zweite Schritt");
    return success; 
  }
}


Das Hauptprogramm:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
[STAThread]
public static void Main(string[] args)
{
  bool startOK = true;
  using(StartForm frmStart = new StartForm()) {
    //  Start-Formular anzeigen, laufende Anzeige vorbereiten
    frmStart.Show();
    StartActions start = new StartActions();
    start.NextStep = frmStart.ShowNextStep;
    //  eigentliche Startmaßnahmen ausführen
    startOK = start.Init();
    //  Start-Formular schließen
    frmStart.Hide();
  }
  if (startOK && VSForms.Instance.FrmMain != null) {
    //  das Hauptformular wird durch StartActions erzeugt und
    //  von dort aus in der Singleton-Klasse VSForms registriert
    frmMain = VSForms.Instance.FrmMain;
    Application.Run(frmMain);
  }
}


Das Startformular enthält u.a. die Anzeige:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
public partial class StartForm : Form
{
    
  //  die laufende Anzeige  
  public void ShowNextStep(string labelName, string text) 
  {
    if (String.IsNullOrEmpty(labelName))
      LabelTeil.Text = text;
    else {
      Control[] coll = this.Controls.Find(labelName, true);
      if (coll != null && coll.Length > 0)
        coll[0].Text = text;
    }  
  }
}

//  und die Deklaration des Delegate:
public delegate void OnNextStep(string labelName, string text);


Falls das Schema noch nicht klar ist, frag' ruhig nach. Zu meiner Gesamtlösung gehört auch die Prüfung, dass das Programm nur einmal gestartet werden kann.

Gruß Jürgen
foxy Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 814

Ubuntu, Gentoo
C++, PHP, Java, Ruby, Perl (Eclipse)
BeitragVerfasst: Fr 25.07.08 15:17 
super danke :>

nur das problem ist, das du das startest BEVOR ich meine mainForm (und ihre Methoden) starte. Ich würde aber gerne haben, das je nachdem welcher schritt gerade durchgeführt wird, das auf meinem Splash angezeigt wird, und das geht ja nur wenn meine mainForm startet.

Ein beispiel:

Programmstart -> mainForm läd -> Splashscreen kommt -> abfrage der DB einträge -> Splash zeigt an "abfrage der DB einträge -> abfrage SOAP request -> Splash zeigt an SOAp request -> Routinen sind alle durch (mainForm wird initiert) -> splash close

also sowas :>
deine variante, so wie ich das lesen kann, beendet sich der Splash zu dem Zeitpunkt wenn Application.run(mainFrm)initiert wird.
Das Problem warum ich das so nicht machen kann, ist das ich die mainFrm beötige um schon elemente zu füllen.

Evtl gibt es da ja eine lösung. Ich könnte das natürlich alles auslagern, und nachträglich die Items füllen, das wird aber sehr sehr viel arbeit sein und möchte ich möglichst vermeiden.

Gruss


edit:
in formLoad hab ich es auch shcon versucht ... ohne erfolg

_________________
"Only wimps use tape backup: real men just upload their important stuff on ftp, and let the rest of the world mirror it." (Linus Torvalds)
OperatingSystem Laptop (Ubuntu Hardy)
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: Fr 25.07.08 15:59 
Hallo Heiko,

Deine Bedenken habe ich durchaus berücksichtigt. Das Laden des Hauptformulars dauert schließlich auch seine Zeit, also muss zuerst das (einfache) Startformular angezeigt werden. Deshalb habe ich zusätzlich die StartActions-Klasse:

  1. Das Startformular wird erzeugt und angezeigt.
  2. StartActions.Init führt sämtliche Startmaßnahmen aus und übergibt den laufenden Arbeitsfortschritt per Delegate an das Startformular.
  3. Unter anderem wird in StartActions (!) das Hauptformular erzeugt.
  4. Ebenso sorgt StartActions.Init für das Laden der Standarddaten (z.B. Config-Daten aus der DB).
  5. Hier können auch Daten im Hauptformular angezeigt werden, sofern nötig. Meistens läuft das aber über DataSource oder BindingSource oder DataBinding.
  6. Es wird lediglich eine Verbindung benötigt, damit in der Main-Methode von Program.cs die Instanz des Hauptformulars bekanntgemacht wird; das habe ich durch die Singleton-Instanz von VSForms geregelt.
  7. Das Startformular wird nach Erledigung geschlossen und durch den using-Block sofort freigegeben.
  8. Die Instanz des Hauptformulars, die vorher erzeugt wurde, wird in der Main-Methode als aktuelles Hauptformular an die Application übergeben. Bitte beachte: Beim Standardbeispiel steht in Application.Run(new MainForm()), bei mir wird die vorhandene Instanz übergeben.

Bitte beachte außerdem, dass bei mir das Laden von Standarddaten nicht mit dem Hauptformular zusammenhängt, sondern in eigenen Datenklassen erfolgen kann. Auch Du solltest Formulare (GUI) und Daten trennen.

Gruß Jürgen