Autor Beitrag
Christoph1972
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: So 22.02.09 12:03 
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


Zuletzt bearbeitet von Christoph1972 am So 22.02.09 21:38, insgesamt 1-mal bearbeitet
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: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: So 22.02.09 22:56 
Was meint ihr, kann ich das so machen?

Hier der Code aus Program.cs
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:
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)
ausblenden 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.
ausblenden 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:
ausblenden 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
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: Mo 23.02.09 10:40 
Sebastian hat schon alles Wichtige gesagt.

Ergänzend möchte ich noch auf NET Richtlinien für Namen hinweisen. Bezeichner wie Form1 oder Button17 gehören sowieso verboten.

Gruß Jürgen
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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
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: 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 benutzt werden, nämlich die Übergabe von Werten durch Eigenschaften und "übergreifende Maßnahmen" durch Delegates.

Gruß Jürgen
Christoph1972 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 690
Erhaltene Danke: 16


VS2015 Pro / C# & VB.Net
BeitragVerfasst: 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
Hält's aus hier
Beiträge: 1



BeitragVerfasst: 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.