Avatar billede martinhrj Nybegynder
17. januar 2008 - 17:53 Der er 2 kommentarer

Hvordan fanger man et windowopen-event?

Mit problem er således. Jeg vil gerne have mit program til at starte op, vise formen i 5 sekunder og derefter begynde at gøre noget automatisk.

Jeg har prøvet mange ting... deriblandt at skrive det ind i construktoren af formen, at lave det i Load eller Shown eventsene... men uanset hvad jeg gør, venter programmet 5 sekunder med at vise formen, og starter så umiddelbart med det det skal gøre. Jeg vil gerne vise en information til brugeren, som så skal have 5 sekunder til at annullere, hvis det er et dårligt tidspunkt (programmet skal starte som en scheduled task).

Jeg åbner vinduet med Application.Run(form), og så vidt jeg kan se det, reagerer den ikke på kode der kommer efter den linie... så det er heller ikke en mulighed.

Er der nogen der kan give mig løsningen?

På forhånd tak!
Avatar billede Spotgun Seniormester
17. januar 2008 - 20:09 #1
Smækkede lige en hurtig test sammen, og havde ikke de store problemer med at få det til at køre. Se følgende for inspiration:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Tests.TimedStart
{
    public partial class Form1 : Form
    {
        private int seconds = 5;
        private string lblPre = "Antal sekunder til programstart: ";

        public Form1()
        {
            InitializeComponent();
            label1.Text = lblPre + seconds;
            timer1.Interval = 1000;
            timer1.Start();
        }

        private void StartApp()
        {
            button1.Enabled = false;
            progressBar1.Maximum = 100;
            progressBar1.Minimum = 1;
            for (int i = 0; i < 100; i++)
            {
                progressBar1.Increment(1);
                System.Threading.Thread.Sleep(50);
            }
            this.Dispose();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            this.Dispose();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            seconds--;
            label1.Text = lblPre + seconds;
            label1.Update();
            if (seconds == 0)
            {
                timer1.Stop();
                label1.Text = "Programmet starter nu...";
                label1.Update();
                StartApp();
            }
        }
    }
}
Avatar billede johny Nybegynder
28. januar 2008 - 12:31 #2
Der er to måder der lige kan løse det på en let måde så vidt jeg lige kan se. Den ene er at lave en tråd mere der sørger for det i slutningen af din konstruktør:

Thread t = new Thread(muligNedlukning);
t.Start();

private void muligNedlukning(){
 
}

Hvis du smider det ind i dit program, så kan du lave den håndtering du vil på tråden. Nu fortæller du nemlig heller ikke hvordan det er du gerne vil give brugeren mulighed for at annulere at programmet åbnes.

Den anden metode, er at lave eventhandling på Load(). Hvis du i Visual Studio går ind på design view, klikker på formen og så går over i properties og vælger events, så er der en der der hedder Load. Dobbeltklik på det tomme felt der ud for, og så skulle du kunne få det til at lykkes.

Igen, du skriver ikke hvordan du har tænkt dig at løse det, men denne her tilgang skulle gerne kunne løse dit primære problem, med at formen ikke bliver synlig før efter de 5 sekunder.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester