[C#] this.Hide() werkt niet bij onload event

Pagina: 1
Acties:
  • 388 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik loop hier tegen een heel vreemd probleem aan...

Ben bezig om een splash klasse te schrijven (voor school, om er van te leren ;) )...deze klasse kan je aanroepen vanuit je hoofdscherm, waarna het splash screen dit hoofdscherm tijdelijk onzichtbaar maakt (via Hide() ).

Nu is het gekke: wanneer ik deze splash aanroep vanuit een button in het hoofdscherm gaat het precies zoals ik het wil, maar wanneer ik diezelfde code (button1_click) aanroep via het form.onload event gaat het mis: het splash screen komt er wel...maar het hoofdscherm blijft ook staan?

Ik heb al wat gezocht op Google en hier op Got, maar ben niks nuttigs tegengekomen.
Wel iets waardoor het hoofdscherm geminimaliseerd wordt, maar dan start het splash screen ook geminimaliseerd op...en daar heb ik dus niks aan ;).


Relevante code:
C#:
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
//HOOFDSCHERM:
//Designer:
this.Load += new System.EventHandler(this.button1_Click);

//methode:
        private void button1_Click(object sender, EventArgs e)
        {
            splash = new Splash(this);
            splash.Plaatje = "\\sprites\\logo.png";
            splash.Kleur = Color.Green;
            splash.Tijd = 3000;
            splash.Show();
        }

//SPLASH klasse:
        //Constructor
        public Splash(Form Papa)
        {
            Papa.Hide();

            InitializeComponent();

            //data initialiseren
            kleur = Color.Black;
            plaatje = "";
            papa = Papa;
            tijd = 2000;
        }



Ik zou het natuurlijk best kunnen oplossen door het splash screen als hoofdform te nemen, en dat deze daarna je eigenlijke programma opent...maar het was mijn intentie met deze klasse om achteraf aan je programma een splash screen toe te kunnen voegen zonder dat je moet gaan kloten in de automatisch gegenereerde files als program.cs

[ Voor 10% gewijzigd door Verwijderd op 18-11-2007 15:17 ]


Acties:
  • 0 Henk 'm!

Verwijderd

this.opacity = 0;
zal wel werken. Na de splash weer op 100 zetten natuurlijk.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Dat werkt inderdaad...maar dan staat het hoofdscherm nog wel op je taakbalk, wat met .Hide() niet zo is. En dat vind ik eigenlijk netter...is daar ook nog een oplossing voor?

In ieder geval bedankt voor deze oplossing, het werkt :Y

Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb het nog nooit gebruikt maar kijk eens naar "ShownInTaskbar".

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Held _O_.

Er zat echter nog een staartje vast aan die ShowInTaskbar, wanneer het splash screen klaar is zet ik die propertie weer op true...maar dan is het hoofdscherm nog onzichtbaar (in mijn geval zit ie achter VS2005).

Maar dit is met een this.Focus() ook weer verholpen, dus het werkt nu helemaal prima.

Nogmaals bedankt ;).

[ Voor 7% gewijzigd door Verwijderd op 18-11-2007 15:46 ]


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:23
Ik zou m'n splash screen gaan tonen voordat je hoofd-form geladen wordt.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 11-09 15:48
Kun je onder andere doen door je splashscreen als static variabele aan te maken.
Als je dan een Thread.wait(..) doet in de main van je hoofdform, krijg je hetzelfde effect.

code:
1
2
3
4
5
6
7
8
private static SplashScreen splash = new SplashScreen();

constructorForm(){
 ...
 initComponents();
 Thread.wait(5000);
 splash.hide();
}

zoiets

let the past be the past.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
whoami schreef op zondag 18 november 2007 @ 21:18:
Ik zou m'n splash screen gaan tonen voordat je hoofd-form geladen wordt.
Inderdaad; het ge(mis)bruik van het onLoad event is daar niet voor ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Sorry hoor, ik ben ook maar nieuw in C# :$.

Maar een klein probleempje, mijn editor (VS2005) kent Thread.Wait() niet :?

Edit: lamaar... using System.Threading helpt.
Dan kan ik Thread.Sleep() gebruiken, wat op hetzelfde neerkomt neem ik aan.

OK...probleempje:

Het splash screen wordt nu geladen voor de InitializeComponent() van het hoofdform...maar nu zie ik een lege box (het plaatje wordt dus niet geladen).

[ Voor 59% gewijzigd door Verwijderd op 18-11-2007 22:07 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Is het niet veel handiger om zoiets te doen?

C#:
1
2
3
4
5
6
7
8
9
10
11
Splash =  new SplashForm();
Splash.OnClose += SpashFormClosing;
Splash.Show();

... 
... Stuff
... 

MainFormThingie = new MainForm();
MainFormThingie.Show();
SplashForm.Close();

Owh en voordat je met Thread.Wait aan de gang gaat, een splash ding laat je alleen maar zien omdat je nog ff druk bent met iets anders voordat je je mainform kunt laten zien, anders gaat het waarschijnlijk op den duur alleen maar het geduld van de gebruiker op de proef stellen.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • kunnen
  • Registratie: Februari 2004
  • Niet online
Wordt je splash-screen niet gewoon niet gehide omdat hij pas aan het einde van de onLoad weergegeven wordt?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Pulsher schreef op maandag 19 november 2007 @ 17:07:
Wordt je splash-screen niet gewoon niet gehide omdat hij pas aan het einde van de onLoad weergegeven wordt?
De splash zie ik wel, het hoofd scherm wil alleen niet weg ;).

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Erm ..? Nogmaals is het niet een idee om het advies van een aantal mensen hier (inc mijzelf) op te volgen en de structuur een ietsje anders op te zetten zodat je dit hele probleem niet tegenkomt?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja, dat zal ik bij nieuwe projecten wel gaan doen...maar ik wilde kijken of het op deze manier mogenlijk was om achteraf nog een splash toe te voegen ;).

Acties:
  • 0 Henk 'm!

  • compufreak88
  • Registratie: November 2001
  • Laatst online: 02-05 17:51
Pulsher schreef op maandag 19 november 2007 @ 17:07:
Wordt je splash-screen niet gewoon niet gehide omdat hij pas aan het einde van de onLoad weergegeven wordt?
Daar heeft het wel mee te maken. Als form.onLoad afgelopen is, word form.show() aangeroepen (had ik ergens gelezen). Daardoor heeft het geen zin hem te laden in je onload event.

Acties:
  • 0 Henk 'm!

  • Tepel
  • Registratie: Juni 2006
  • Laatst online: 17-08-2024
Waarom plaats je de splash code niet gewoon in de constructor class van je main form? Lijkt me een stuk simpeler.
C#:
1
2
3
4
5
6
7
8
9
class MainForm : Form
{
  public MainForm ()
  {
    Splash.showSplash();
    // doe ander spul
    Splash.hideSplash();
  }
}


Mijn splash class bevat op deze manier twee statics, eentje voor het laten zien en eentje voor het verbergen. Enige waar je eventueel commentaar op zou kunnen hebben is het feit dat op het moment je een verrekte snelle PC hebt de splash eventueel maar heel kort voorbij zou kunnen komen. Nou interesseert mij dat niet zo aangezien het doel van een splash niet meer is dan een fancy laadscherm laten zien.

0x7F


Acties:
  • 0 Henk 'm!

  • Face_-_LeSS
  • Registratie: September 2004
  • Niet online
Nog mooier is natuurlijk een soort Application klasse met twee events:
- Initializing
- Initialized

En een methode Initialize. Dan krijg je zo'n dergelijke constructie:
C#:
1
2
3
4
5
MyApplication app = new MyApplication();
app.Initializing += new EventHandler(app_Initializing);
app.Initialized += new EventHandler(app_Initialized);

app.Initialize();


In de handler app_Initializing laat je dan het spashscreen zien. En in app_Initialized verstop je hem weer en laat je het mainform zien.
En als je dan vanuit je Application klasse een custom EventArgs mee geeft aan het Initializing event
die wat status data tijdens het laden doorgeeft kan je dat weer netjes weergeven op je spashscreen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Tepel schreef op woensdag 21 november 2007 @ 00:57:
Waarom plaats je de splash code niet gewoon in de constructor class van je main form? Lijkt me een stuk simpeler.
C#:
1
2
3
4
5
6
7
8
9
class MainForm : Form
{
  public MainForm ()
  {
    Splash.showSplash();
    // doe ander spul
    Splash.hideSplash();
  }
}


Mijn splash class bevat op deze manier twee statics, eentje voor het laten zien en eentje voor het verbergen. Enige waar je eventueel commentaar op zou kunnen hebben is het feit dat op het moment je een verrekte snelle PC hebt de splash eventueel maar heel kort voorbij zou kunnen komen. Nou interesseert mij dat niet zo aangezien het doel van een splash niet meer is dan een fancy laadscherm laten zien.
Dat kan inderdaad, maar omdat het doel programma zeer eenvoudig zal zijn is het ook snel geladen...en ik wilde gewoon een vaste tijd (1 sec. ofzo) een splash laten zien.

Nu had ik dat op bovenstaande manier inderdaad gemaakt, met een thread.wait...maar dan krijg ik het plaatje dus niet te zien in mn splash ;).
Pagina: 1