Entwickler-Ecke

WinForms - Tutorial für Splash Screen gesucht?


Christoph1972 - So 22.02.09 12:03
Titel: Tutorial für Splash Screen gesucht?
Hallo zusammen,

ich suche ein Tutorial für einen Splash Screen.

Bei codeproject.com habe ich zwei gefunden. Die sind jedoch von 2003, da gibt es dann Unstimmigkeiten mit den Frame Works. Heißt, ich raffe es nicht die Tutorials umzusetzen. Das eine davon ist mir für den Anfang zu überladen, wobei es genau das ist was ich brauche.

Ich würde gerne so vorgehen:

1.Stufe:
Einen einfachen Splash erstellen, um zu sehen wie das geht.(dazu konnte ich nichts bei der Suche finden)

2.Stufe:
Der Splash soll in einem eigenen Thread laufen.


3.Stufe:
Der Splash soll Nachrichten anzeigen, wie z.B. was gerade initialisiert wird, Datenbank Connection herstellen usw.


Ich habe hier mal wieder das klassische Problem, ich möchte etwas machen und weis nicht wo steht, wie es geht. Und das im Google-Zeitalter :roll:


Kennt hier jemand einen Link, der mein Vorhaben gut beschreibt?


Gruß
Christoph


JüTho - So 22.02.09 13:40

Hallo Christoph,

vorab: was ist ein Stuffe?

Ein Tutorial kenne ich nicht. Dein Punkt 2 geht nicht, weil es immer nur einen GUI-Thread gibt.

Mein Verfahren geht etwa so:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
MainForm main = null
using(SplashScreen splashScreen = new SplashScreen()) {
   splashScreen.Show();
   //  hier kann auch ein LoginForm eingebaut werden
   main = new MainForm();  // visible = false vorbelegen
   main.Init(splashScreen.GetShowInitialization, username usw.);
}
if (main != null)
   Application.Run(main);

Der Arbeitsfortschritt wird dadurch angezeigt (3.Schritt), dass ein Delegate showInitialization im SplashScreen definiert wird und mit GetShowInitialization als "Zeiger" an das MainForm (oder das LoginForm oder eine DB-Klasse) übergeben wird und von dort aus aufgerufen wird, sodass auf diesem Wege Labels im SplashScreen neue Inhalte bekommen.

Gruß Jürgen


Christoph1972 - So 22.02.09 21:37

Hi,


eine Stuffe ist eine stark fehlerbehaftete Stufe :oops:


Ok, dann muss ich mir wohl einen Splash Screen zusammen wursteln. Eine "best practice" Anleitung wäre mir lieber gewesen, da ich mir mit Code-Schnipseln aus dem Internet schon oft Unfug angeeignet habe.

Vielen Dank schon mal für deine Antwort!!!



Gruß
Christoph


Christoph1972 - So 22.02.09 22:56

Was meint ihr, kann ich das so machen?

Hier der Code aus Program.cs

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:
namespace SplashScreen
{
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Form1 MainForm = null;
             
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);            
            
            using (SplashForm Splash = new SplashForm ())            
            {
                Splash.Show();
                MainForm = new Form1();
                      
                MainForm.ConnectingDatabase();
               
                Splash.Close();                
            }

            if (MainForm != null)
            {                
                Application.Run(MainForm);
            }
        }
    }
}



Und hier aus dem MainForm (Form1)

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:
namespace SplashScreen
{
    public delegate void InitializingStatusMessageEventHandler(String StatusMessage);

    public partial class Form1 : Form
    {
        static public event InitializingStatusMessageEventHandler InitializingStatus;

        public Form1()
        {
            InitializeComponent();
            this.Visible = false;           

        }

        public void ConnectingDatabase()
        {
            System.Threading.Thread.Sleep(2000);

            if (InitializingStatus != null)
            {
                InitializingStatus("Prima");
            }
        }
    } 
}




Und noch der Code aus dem SplashForm

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
namespace SplashScreen
{
    public partial class SplashForm : Form
    {
        public SplashForm()
        {
            InitializeComponent();
            Form1.InitializingStatus += new InitializingStatusMessageEventHandler(Form1_InitializingStatus);
        }

        void Form1_InitializingStatus(string Message)
        {
            label1.Text = Message;
            label1.Refresh();
        }
    }
}



Sorry, wenn ich das hier so ausführlich poste, aber ich möchte „vernünftigen“ Code erstellen und ich habe niemand, mit dem ich mich zum Thema .Net austauschen kann. Eure Meinung ist mir also wichtig :zwinker:

Gruß
Christoph


Kha - Mo 23.02.09 10:28

user profile iconChristoph1972 hat folgendes geschrieben Zum zitierten Posting springen:
Sorry, wenn ich das hier so ausführlich poste, [...]
Och, das ist doch noch gut überschaubar :) .
Das Event sollte allerdings nicht statisch sein - gerade um die beiden Forms zu entkoppeln, ist es doch da.

C#-Quelltext
1:
2:
3:
4:
Splash.Show();
MainForm = new Form1();
MainForm.InitializingStatus += Splash.HandleStatus;
MainForm.ConnectingDatabase();

Sonst fallen mir nur Kleinigkeiten auf: Parameter und lokale Variablen bitte klein schreiben. Und ein wirklicher EventHandler sieht eigentlich so aus, aber das ist nun wirklich fast egal:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
public class InitializingStatusEventArgs : EventArgs
{
  public string Message { get; set; }
  public int Progress { get; set; } // [0..100], falls du noch eine hübsche ProgressBar willst
}
...
public event EventHandler<InitializingStatusEventArgs> ...


JüTho - Mo 23.02.09 10:40

Sebastian hat schon alles Wichtige gesagt.

Ergänzend möchte ich noch auf NET Richtlinien für Namen [http://msdn.microsoft.com/de-de/library/ms229002(VS.80).aspx] hinweisen. Bezeichner wie Form1 oder Button17 gehören sowieso verboten.

Gruß Jürgen


Christoph1972 - Mo 23.02.09 22:06

Hi,

ich habe das static gemacht, damit ich Form1 nicht in der SplashForm instanzieren muss. Mir ist leider nicht klar, wie ich das anders lösen kann. Ich hätte nicht gedacht das ein Splash Screen so aufwendig ist.

Gruß
Christoph


JüTho - Di 24.02.09 11:07

Hallo Christoph,
user profile iconChristoph1972 hat folgendes geschrieben Zum zitierten Posting springen:
Ich hätte nicht gedacht das ein Splash Screen so aufwendig ist.

Aufwändig wird es dadurch, dass der SplashScreen wechselnde Informationen aus dem MainForm.Load-Ablauf oder aus dem DB-Zugriff anzeigen soll. Dazu müssen die "normalen" Verfahren zur Kommunikation von 2 Forms [http://www.mycsharp.de/wbb2/thread.php?threadid=5960] benutzt werden, nämlich die Übergabe von Werten durch Eigenschaften und "übergreifende Maßnahmen" durch Delegates.

Gruß Jürgen


Christoph1972 - Di 24.02.09 21:22

Hallo,

das größte Problem ist einfach, das ich noch nicht genügend Kenntnisse habe, um eure Codeschnipsel zu verstehen. Von diesen Schnipseln gibt es ja auch hier im Forum genug. Deshalb hatte ich ja auch nach einer konkreten Anleitung gefragt.
So, einen Splash der Nachrichten anzeigt, habe ich jetzt. Sogar ohne das Statische Event! Nur die Progressbar mit Marquee-Style will noch nicht. Die friert natürlich ein.



Gruß
Christoph


Knuddlbaer - Sa 07.03.09 08:34

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:

Dein Punkt 2 geht nicht, weil es immer nur einen GUI-Thread gibt.



Starte einen neuen Thread. In diesem(!) legst Du die SplashForm an und rufst Application.Run() auf - fertig ist der 2. UI Thread.