Avatar billede golyf Nybegynder
30. november 2005 - 09:17 Der er 8 kommentarer og
1 løsning

Kan en Form være static?

Jeg har lavet et lille eksempel:

--- Form1 ---

namespace WindowsApplication2 {
    public class Form1 : System.Windows.Forms.Form     {
        private System.Windows.Forms.Label label1;
        private System.ComponentModel.Container components = null;
        public Form1() {
            InitializeComponent(); }

        [STAThread]
        static void Main() {
            Application.Run(new Form1()); }

        private void Form1_Load(object sender, System.EventArgs e) {
            Class1 a = new Class1(this); }

        public void SkrivLabel(string TxtTilLabel) {
            label1.Text = TxtTilLabel; }
    }
}

--- Class1.cs ---

namespace WindowsApplication2 {
    public class Class1     {
        private Form1 CallForm;
        public Class1(Form1 CallForm) {
            this.CallForm = CallForm;
            this.CallForm.SkrivLabel("Hejsa...");
        }
    }
}

Det jeg gerne vil er at jeg fra Class'en kan skrive Form1.SkrivLabel("Hejsa.."); og så virker det. Sådan som jeg har forstået det, skal min Form1 være deklareret statisk for at det kan du, men det kan jeg heller ikke få til at virke.
Avatar billede nielle Nybegynder
30. november 2005 - 09:37 #1
Det er ikke Form1 som skal være erklæret static, men derimod SkrivLabel().
Avatar billede nielle Nybegynder
30. november 2005 - 09:44 #2
Problemet er så bare at du ikke kan kalde non-static ting fra en static metode.

Dette compiler og virker:

public static void SkrivLabel()
{
    MessageBox.Show("Kald af SkrivLabel().");
}

- mens dette:

public static void SkrivLabel()
{
    label1.Text = "Kald af SkrivLabel()";
}

- end ikke kan compile (label1 er ikke erklæret static).
Avatar billede golyf Nybegynder
30. november 2005 - 10:39 #3
Så det du siger er at hvis jeg laver funktionen statisk, så dutter skidtet ikke fordi label1 ikke er statisk. Så alt i alt, så er den løsning jeg har fundet frem den tætteste på?
Mit mål er at have en "GUI pakke", som tager sig af alt det grafiske brugerinterface. Det vil typisk være form's (hvis flere) og en mængde funktioner som bruger/retter/skriver i disse form's. I mine tanker er det ok at en form kan instasieres flere gange, men nogle form's vil man også kun bruge i én udgave og derfor kun en instans. Den troede/håbede jeg kunne være statisk.
Det er sådan et forsøg på at være rigtig object orrienteret også i GUI'en.....
Avatar billede akempff Nybegynder
30. november 2005 - 13:07 #4
Der burde vel ikke være noget i vejen for at skrivlabel returnerede en label.
Alla det her:
public static Label SkrivLabel()
        {
            Label l = new Label();
            l.Text = "Kald af SkrivLabel()";
            return l;
        }
Avatar billede akempff Nybegynder
30. november 2005 - 13:23 #5
Ja ok, læste lige spørgsmålet igen. 
Jeg svarede vist ikke helt på det der bliver spurgt om.
Undskyld
:)

Du kunne godt have en guiFactory klasse, hvor du via ikke statiske metoder laver designet, bgcolor, beskeder osv osv og så en metode der returnere en Form hvor alle attributer er sat. Men hvis det skulle give mening at lave det statisk så skulle dine designs gemmes på en eller anden måde og så hentes ind i de statiske metoder.
Men jeg ved ikke lige helt om det er sådan noget du tænker på.
Avatar billede golyf Nybegynder
30. november 2005 - 14:29 #6
akempff: Det er helt ok. Jeg lærer også lidt af det uanset :-)

Tak og point til dem som vil ha'
Avatar billede nielle Nybegynder
30. november 2005 - 17:35 #7
30/11-2005 10:39:18> Rent faktisk har du to muligheder, nemlig:

1)

At erklære din label for static:

static private System.Windows.Forms.Label label1;

Dette kræver dog at du efterfølgende skal ned og rette alle forekomster af:

this.label1

- til:

label1

Derefter kan du bare skrive:

namespace WindowsApplication2 {
    public class Class1 {
        public Class1() {
            Form1.SkrivLabel("Hejsa...");
        }
    }
}


2)

Det var den grimme metode. Den pæne er at beholde label1, som en instans-variabel, og så betjene den via instanser i stedet fro selve klassen (static). Det er det du gør, men du har lidt for meget kode med.

Ret din:

namespace WindowsApplication2 {
    public class Class1 {
        private Form1 CallForm;
        public Class1(Form1 CallForm) {
            this.CallForm = CallForm;
            this.CallForm.SkrivLabel("Hejsa...");
        }
    }
}

- til:

namespace WindowsApplication2 {
    public class Class1 {
        public Class1(Form1 CallForm) {
            CallForm.SkrivLabel("Hejsa...");
        }
    }
}

(... Medmindre at du selvfølgelig også ønsker at kunne kalde SkrivLabel fra andre metoder i din Class1).
Avatar billede akempff Nybegynder
30. november 2005 - 21:01 #8
Jeg synes du skal give nielle pointene, det er lidt mere udspecificeret med kode osv.

Men for lige at runde af så bryder det ikke med nogle objekt orienterede principper at du sender din form med i konstruktøren som du gør. Din form er jo også et objekt og det manipulerer du så via dine dertil indrettede metoder. Det er fin stil at gøre det som du gør det.
Avatar billede golyf Nybegynder
30. november 2005 - 21:51 #9
Jeg havde det med at lave "arbejdsklasser" som jeg lavede statiske (i Java og lignende i C++) dengang jeg tog min uddannelse.
Jeg skal bare ha' svar, så jeg kan dele point ud....
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