Avatar billede extremecode Nybegynder
07. oktober 2004 - 21:12 Der er 19 kommentarer og
1 løsning

hvordan lukker man en form fra en console app??

Jeg har en form som starter fra en console...

form = new Form();
Application.Run(form);

Formen kommer fint frem men hvordan lukker jeg den igen fra console....??

Har prøvet med:
form.Close();
form.Dispose();

Application.Exit();

men intet virker...
Avatar billede arne_v Ekspert
07. oktober 2004 - 21:23 #1
Application.Exit();

i samme console program bør lukke vinduet.
Avatar billede extremecode Nybegynder
07. oktober 2004 - 21:41 #2
ok men hvis jeg skriver

form = new Form();
Application.Run(form);
Application.Exit();

bliver formen ikke lukket...
der Sker nada
Avatar billede Slettet bruger
07. oktober 2004 - 21:43 #3
Det er rigtigt at Application.Exit() eller form.Close lukker formen, men du kan ikke lukke formen ved at have følgende:

static void Main(string[] args)
{
  ....
  Application.Run(form);
  Application.Exit(); // eller form.close
}

Problemet er at Application.Run starter et message loop, som kører indtil formen lukker. (Og så er det jo for sent)
Derfor må du have en eventhandler der bliver trigget som lukker formen, eller en anden tråd der styrer din form, hvorfra du kalder form.Close.

Herunder er et lille program der viser hvordan en timer kan styre hvornår formen lukkes.

using System;
using System.Windows.Forms;

namespace Test
{
    public class Form1 : System.Windows.Forms.Form
    {
        private System.ComponentModel.Container components = null;

        public Form1()
        {
            InitializeComponent();
        }

        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.Size = new System.Drawing.Size(300,300);
            this.Text = "Form1";
        }
    }

    class Class1
    {
        static Form1 form;

        static void Main(string[] args)
        {

            Timer timer = new Timer();
            timer.Tick+=new EventHandler(timer_Tick);
            timer.Interval=5000;
            timer.Enabled=true;
            form = new Form1();
            Application.Run(form);
           
        }

        private static void timer_Tick(object sender, EventArgs e)
        {
            form.Close();
        }
    }
}
Avatar billede casualty Nybegynder
07. oktober 2004 - 21:44 #4
prøv dette:
Application.Run();
form=new form();
form.Show();
form.Hide();
Avatar billede extremecode Nybegynder
07. oktober 2004 - 21:45 #5
hmm ok hvad så hvis jeg bruger form.showDialog() istedet....men det kan jeg heller ikke får til at virke med close...men det er måske det samme som med Application??
Avatar billede casualty Nybegynder
07. oktober 2004 - 21:46 #6
prøv dette:
Application.Run();
form=new form();
form.Show();
Thread.Sleep(1000);//så kan du nå at se hvad der sker
form.Hide();
System.Exit();

Husk: using System.Threading;
Avatar billede extremecode Nybegynder
07. oktober 2004 - 21:47 #7
tjaa show vil jeg helst ikke bruge da jeg køre nogen ting i en tråd og show dermed fryser...
Avatar billede arne_v Ekspert
07. oktober 2004 - 21:48 #8
Nu er der jo allerede flere der har sagt det.

Application.Exit();

virker udmærket.

Men linie skal jo udføres. Det er ikke nok at linie forefindes i programmet.

Den her lukker vinduet efter 10 sekunder:

        private static void Exit()
        {
            Thread.Sleep(10000);
            Application.Exit();
        }
        [STAThread]
        public static void Main(string[] args)
        {
            (new Thread(new ThreadStart(Exit))).Start();
            Application.Run(new MainForm());
        }
Avatar billede extremecode Nybegynder
07. oktober 2004 - 22:06 #9
ok kan se at det virke Arne....men kan kun få det til at virke hvis jeg starter timeren inden jeg viser formen....

hvad hvis jeg vil lukke formen efter jeg har skrevet Application.Run(new MainForm());
Avatar billede arne_v Ekspert
07. oktober 2004 - 22:08 #10
Du skal have udført noget kode for at lukke formen. Du udfører ikke
de linier efter Application.Run før formen er lukket.

Du kan lukke formen når du klikke rpå en button i formen.

Du kan sætte en time rop inden du åbner formen.

Men et eller andet skal der til.
Avatar billede extremecode Nybegynder
07. oktober 2004 - 22:11 #11
hmm ok men det jeg skal kunne er at lukke formen uden at komme i kontakt med den...

jeg har en tråd der køre konstant og kontrollere om variabel er true eller false..

hvis den er true skal den åbne en form og dræbe den anden form (pga af lidt ram skal den dræbes)
hvis den er false skal den åbne en anden form og dræbe den første form...

dette skal gøres uden bruge kontakt

det er derfor jeg er ude efter en måde hvorpå man kan lukke sin form
Avatar billede arne_v Ekspert
07. oktober 2004 - 22:13 #12
Er det så ikke bare at lade den tråd kalde Application.Exit og Application.Run
hvis variabel er sat ?
Avatar billede extremecode Nybegynder
07. oktober 2004 - 22:13 #13
har prøvet at benytte tråde til begge forms hvorpå jeg kunne slå trådene ihjel og det virkede også fint indtil jeg skulle benytte microsofts browser component i den ene form...også frøs den når jeg benyttede mig af tråd...

så derfor kan jeg åbenbart ikke gøre det på den måde mere
Avatar billede arne_v Ekspert
07. oktober 2004 - 22:14 #14
Nej - den kan selvfølgelig ikke kalde Application.Run - den skal starte en tråd som
kører Application.Run !
Avatar billede arne_v Ekspert
07. oktober 2004 - 22:17 #15
Se f.eks. dette (lidt bizarre) eksempel:

        private static void Open()
        {
            Application.Run(new MainForm());
        }
        private static void CloseAndOpen()
        {
            for(;;)
            {
                Thread.Sleep(3000);
                Application.Exit();
                Thread.Sleep(1000);
                (new Thread(new ThreadStart(Open))).Start();
            }
        }
        [STAThread]
        public static void Main(string[] args)
        {
            (new Thread(new ThreadStart(CloseAndOpen))).Start();
            (new Thread(new ThreadStart(Open))).Start();
        }
Avatar billede extremecode Nybegynder
07. oktober 2004 - 22:22 #16
hmm den ser interresant ud Arne...tester den lige
Avatar billede extremecode Nybegynder
07. oktober 2004 - 22:28 #17
hehe for fedt Arne det virke sgu...og du har også løst mit problm med at form fryser hvis jeg benytter mig af browser komponent
Avatar billede extremecode Nybegynder
07. oktober 2004 - 22:28 #18
Du er dagens mand i skysovs....
point har du dælmer fortjent
Avatar billede arne_v Ekspert
07. oktober 2004 - 22:29 #19
så må jeg hellere ligge et svar
Avatar billede extremecode Nybegynder
07. oktober 2004 - 22:34 #20
godt har også et andet spørgsmål herinde under C# http://www.eksperten.dk/spm/547884 der omhandlede mit webbrowser problem...der kan du så også lige få 100 point da du også løste det :)
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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