Entwickler-Ecke

WinForms - SplashForm - wie?


nullplan001 - Sa 03.06.06 21:04
Titel: SplashForm - wie?
Hi all,
ich möchte ein SplashForm erstellen, also ein Formular, dass nur kurz erscheint, um bestimmte Informationen anzuzeigen. Also habe ich mir ein Formular geschrieben, dass Nur ganz wenig Inhalt hat und mir als SplashScreen herhalten soll. In der Methode main() halte ich dann mein Programm 5 Sekunden an. Sieht so aus:

Chrome-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
method main;
var spl : SplashForm := new SplashForm;
begin
  spl.Show;
  new Thread(new ThreadStart(@main)).Sleep(new Timespan(0,0,5));
  spl.Close;
  Application.Run(new MainForm);
end;

So, wenn ich das kompiliere, wird mein SplashForm dargestellt, aber die Controls (2 Labels) nicht. An der Stelle sind immer Löcher. Kann ich das SplashForm irgendwie anders genau 5 Sekunden lang darstellen lassen?
Tschö,
nullplan
P.S.: Nein, kein Application.Run, weil ich das nur mit Application.Exit abbrechen kann, aber dann ist gleich das ganze Programm tot.


Christian S. - Mo 05.06.06 15:32

Könntest Du nicht eine Form mittels ShowDialog anzeigen mit einem Timer drauf, der sie noch 5 Sekunden schließt?


nullplan001 - Mo 05.06.06 18:01

Hi,
danke für deine Antwort, aber äh... ich habe mit .NET ziemliches Neuland betreten und leider keine Ahnung, wie ich einen Timer in ein Form integriere. ShowDialog habe ich gefunden. Es zu benutzen dürfte also nicht das Ding darstellen. Und... ich setze dann einfach im Constructor von SplashForm einen Timer... nur mit dem Constructor habe ich Probleme. Was ist ein TimerCallback? Kannst du mal die Zeile posten, in der du den Constructor benutzt? Ich habe nämlich auch nach der Lektüre des MSDN zu diesem Thema keine Ahnung, was ich machen soll. Meine erste Idee wäre:

Chrome-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
//In der Form-Deklaration:
SplashForm = class (Form)
  public
    method OnTimer;
    time : System.Threading.Timer;
    {...}
end;
//Im Constructor:
time := new Timer(new TimerCallBack(nil),nil,5000,Timeout.Infinite);
//In OnTimer:
method OnTimer;
begin
  time.Dispose;
  self.Close;
end;

Nur: Wo wird denn im Constructor von time die Methode OnTimer erwähnt? Nirgends. Und wie krieg ich die da rein?
Tschö,
nullplan


Christian S. - Mo 05.06.06 18:36

Hallo!

Sorry, ich meinte die Timer-Komponente, welche sich in System.Windows.Forms befindet. Die kannst Du wie jede andere Komponente auch benutzen. Die hat das Tick-Event, außerdem noch die Properties Interval und Enabled.

Grüße
Christian


nullplan001 - Di 06.06.06 17:00

Hi,
du meinst also so hier?

Chrome-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
constructor SplashForm;
begin
  {neben all dem anderen}
  Timer.Enabled := true;
  Timer.Interval := 5000;
  OnTick += new EventHandler(Tick);
  {...}
end;
method SplashForm.Tick(o:Object;e:EventArgs);
begin
  Timer.Enabled := false;
  Close;
  Dispose; {brauchs dann ja nicht mehr}
end;

So in etwa? Ist jetzt aus dem Bauch geschrieben, ich probiers gleich noch aus.
Tschö,
nullplan


Delete - Mi 07.06.06 09:55

Schau mal hier:

http://www.codeproject.com/csharp/PrettyGoodSplashScreen.asp


nullplan001 - Mi 07.06.06 17:01

Hi,
danke für den Link, aber jetzt bekomme ich Probleme mit Chrome. In diesem Artikel werden statische Methoden verwendet. Und wie werden die in Chrome implementiert? Ich habe es bereits mit dem Modifier static versucht, aber das klappt nicht (der wird nicht erkannt), in der Hilfe zu Chrome steht auch nix brauchbares und wenn ich es einfach ohne alles versuche, klappt es zwar, aber nur bei public-Methoden, bei private verlangt er eine Instanz. Aber der Witz an static-Methoden war ja, nicht extra eine solche erstellen zu müssen. Da werde ich mal Google quälen gehen.
Tschö,
nullplan


Christian S. - Mi 07.06.06 17:10

In Chrome sind das die "class methods".


Chrome Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
type
  MyType = class
    public
      class method DoFoo;
    end;

implementation

class mehtod MyType.DoFoo;
begin
...
end;


nullplan001 - Mi 07.06.06 18:55

Hi,
danke für die Antwort. Interessant, was sich die Leute so ausdenken. Naja, egal, ich habe jetzt mein Projekt class-method-frei hingekriegt, und schon kommt das nächste Problem: Also, erstens habe ich festgestellt, dass ich falsch lag. Wenn man in der Methode main eine Application.Run-Zeile hat, wird das Programm mit Application.Exit selbstverständlich komplett terminiert. Hat man jedoch zwei Application.Run-Zeilen, wird mit Application.Exit nur das momentane Formular gekillt und mit dem nächsten fortgefahren. Deshalb ist mein Quelltext auch sehr einfach gehalten. Ich vereinbare im Constructor meines SplashForms lediglich einen Timer (der im übrigen privater Member des Formulars ist), und lasse im OnTick das momentane Formular schließen. Mit Application.Exit .
Nun aber das Problem: Wenn ich jetzt GPLSplash in die uses-Klausel eines anderen Programmes aufnehme, wird mir gemeldet:

Quelltext
1:
2:
  C:\chrome\binkoff.pas(9,4) : Error : (PE17) Namespace "GPLSplash" does not exist or has no public
types

was aber schlicht falsch ist, da ich den Namespace als Library habe kompilieren lassen (auch das Hinzufügen des Pfades in die Komandozeile nützt nichts)(ja, ich habe in der Komandozeile eine Referenz auf diese Library angelegt).
Nun frage ich mich, wie ich einen selbstgemachten Namespace in mein Projekt integrieren kann? Nebenbei: Ich benutze die Comand Line Edition, also kommt mir bitte nicht mit "Auf Projekt klicken und dann im Menü...". Ich hab noch nicht mal Visual Studio, sodass mir auch ein Runterladen der IDE-Edition nichts bringen würde.
Nochmal zum Mitmeißeln:
Dateiname der Library: gplsplash.dll
Namespacename: GPLSplash
Klassenname: SplashForm (hat auch nen constructor, aber das war's an public-Zeug, der Rest ist private, damit mir keiner an den Texten rumspielt. Oder an den Größen. Oder an den Positionen. Oder was man sonst noch so verändern könnte, wenn es public wäre)
Tschö,
nullplan