Avatar billede tripwire Nybegynder
12. januar 2007 - 22:13 Der er 7 kommentarer og
1 løsning

Application.run problem

Hej, lad mig starte med at sige at jeg er nybegynder i C# og jeg har ikke helt styr på messagepumps endnu.

Jeg har lavet et lille eksempel for at vise mit problem

----------
using System;
using System.Windows.Forms;
using System.Drawing;

class Launcher
{
  public static void Main(){
      MyForm f1 = new MyForm();
    Application.Run(f1);
    f1.setWindowTitle("test");
    }
}

class MyForm:Form{
    public void setWindowTitle(string s){
        Console.WriteLine("setWindowTitle called");
        Text = s;
    }
 
  protected override void OnPaint(PaintEventArgs e){
      e.Graphics.DrawString("Hello World!", new Font("Arial", 35),
      Brushes.Blue, 10, 100);
  }
}
------------

Mit problem er så at intet under linien
Application.Run(f1);
kører før MyForm (f1) er lukket.

Linien
f1.setWindowTitle("test");
kører ikke før vinduet er væk og så er det jo ligemeget. Mit program går ind i Application.Run og kommer først videre når vinduet er lukket.

Hvordan kommer jeg udover dette?
Avatar billede erikjacobsen Ekspert
12. januar 2007 - 22:15 #1
Tråde (Threads) er vel en mulighed?
Avatar billede tripwire Nybegynder
12. januar 2007 - 22:17 #2
Endnu et område jeg ikke har helt styr på endnu (der er faktisk mange når vi snakker C#)

Kan du udbygge eksemplet med tråde, så det kommer til at fungere?
Avatar billede erikjacobsen Ekspert
12. januar 2007 - 22:19 #3
Nej. Men Google er din ven - der er mange eksempler derude.
Avatar billede tripwire Nybegynder
12. januar 2007 - 23:25 #4
Ok, nu har jeg kigget på forskellige eksempler på trådhåndtering, men på nuværende tidspunkt forvirrer det mig mere end det gavner.

Hvis du ikke vil/gider hjælpe med at rette i den kode jeg tager udgangspunkt i, så lader jeg spørgsmålet stå i håb at der er andre der vil træde til. Det kan trods alt ikke være alt for mange linier der skal tilføjes for at mit lille eksempel kommer til at køre...
Avatar billede crazysnap Seniormester
13. januar 2007 - 00:31 #5
Hej tripwire,

Du kan jo nedarve ApplicationContext med en ny klasse og kalde formen derfra. Men siden du siger du er helt ny inden for C# vil jeg ikke kede dig med lange forklaringer. Jeg har givet et eksempel nedenfor som udfører den handling du ønsker! :)


using System;
using System.Windows.Forms;
using System.Drawing;

class Launcher
{
        public static void Main()
        {
                Application.Run(new MyApplication());
        }
}

class MyApplication : ApplicationContext
{
    public MyApplication()
    {
        MyForm f1 = new MyForm();
        MyForm2 f2 = new MyForm2();

        f1.setWindowTitle("test");
        f1.Show();

        f2.setWindowTitle("Test myform2");
        f2.Show();
    }
}

class MyForm : Form
{
    public void setWindowTitle(string s)
    {
        Console.WriteLine("setWindowTitle called");
        Text = s;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.DrawString("Hello World!", new Font("Arial", 35), Brushes.Blue, 10, 100);
    }
}

class MyForm2 : Form
{
    public void setWindowTitle(string s)
    {
        Console.WriteLine("setWindowTitle called");
        Text = s;
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        e.Graphics.DrawString("Hello World from MyForm2!", new Font("Arial", 35), Brushes.Blue, 10, 100);
    }
}

}



I mit eksempel har jeg endda tilføjet endnu en MyForm klasse så du virkelig kan se at tingene fungerer. :)


Håber det var det du ledte efter, ellers må jo lige skrive igen! :)


Mvh.

- Snap
Avatar billede tripwire Nybegynder
13. januar 2007 - 09:14 #6
Mange tusind tak. Det var lige præcis det jeg skulle bruge.  :)
Smider du et svar?
Avatar billede crazysnap Seniormester
13. januar 2007 - 13:41 #7
Det var da godt at høre! :)


Held og lykke med det og tak for pointene!


Mvh.

- Snap
Avatar billede md_craig Nybegynder
15. januar 2007 - 11:38 #8
Nu dit eget eksempel... setWindowTitle??.. jeg går ud fra at den metode er lavet af rent pedagoiske grunde eller hvad?... og at sætte Text på formen efter du har startet den er vel også rent pedagoisk?... For i dit eget eks. burde dette være fint: (Du skal dog lige bruge din egen form istedet, "MyForm").

Form f = new Form();
f.Text = "Test";
Application.Run( f );

...

Men jeg går ud fra dit egentlige problem er at du ønsker nogle flere ting udført direkte fra din main eller fra der hvor du kalder App...Run()...

Men hvor vidt det er nødvendigt at begynde at lave egen app context skal du lige overveje...

Ting du skal overveje er om der er nogen gode grunde til at de først skal udføres efter at MainFormen er startet (kan de evt. udføres inden?)... i såfald gør det (IMO)... Personligt kan jeg kun komme i tanke om brugen i selv samme forbindelse som Snap demonstrerer det, nemlig at man vil starte 2 "Uafhængige" Forms... (Som kan være designmæssigt pænere afhængigt af hvad det er man vil lave).
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