Avatar billede mikkel_strack Nybegynder
11. august 2006 - 10:26 Der er 9 kommentarer og
1 løsning

Kalde en funktion i en anden form

Jeg har to forms. En hovedform og en form som åbnes fra hovedform.
Vil kalde en funktion i hovedformen fra den form som åbnes, men der sker ikke en skid...det crasher ik engang :o/

Har lavet et lille testprogram.

Form1
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        private static Form1 instance;
        public Form1()
        {
            InitializeComponent();
        }

        public static Form1 Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Form1();
                }

                return instance;
            }
        }

        public void SetText()
        {
            textBox1.Text = "Hej hej";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.Show();
        }
    }
}

Form2
namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        Form1 f1;

        public Form2()
        {
            InitializeComponent();
            f1 = Form1.Instance;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            f1.SetText();
        }
    }
}


Meningen her er at når man trykker på knappen i form2, så skulle den gerne sætte teksten 'Hej hej' ind i et tekstfelt på form1

Som et lille tillægsspørgsmål. Plejede 'hovedformen' ikke at låse når man åbner en ny form? I tilfældet ovenover, at form1 låser når jeg form2.show()

Mvh. Mikkel
Avatar billede the_party_dog Nybegynder
11. august 2006 - 10:27 #1
Form1
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        private static Form1 instance;
        public Form1()
        {
            InitializeComponent();
        }

        public static Form1 Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Form1();
                }

                return instance;
            }
        }

        public void SetText()
        {
            textBox1.Text = "Hej hej";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2(this);
            f2.Show();
        }
    }
}

Form2
namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        Form1 f1;

        public Form2(Form1 frmMainForm)
        {
            InitializeComponent();
            f1 = frmMainForm;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            f1.SetText();
        }
    }
}
Avatar billede mikkel_strack Nybegynder
11. august 2006 - 10:44 #2
Det virker, men undrer mig hvorfor den åbenbart ikke får fat i min instance. Hvis du eller en anden har et umiddelbart bud, så lad mig endelig høre.

Derudover kan du smide et svar. Thx :o)

        private static Form1 instance;

        public static Form1 Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Form1();
                }

                return instance;
            }
        }
Avatar billede the_party_dog Nybegynder
11. august 2006 - 11:01 #3
For mig at se handler det lidt omkring det hele..

Det du laver er:

private static Form1 instance;

        public static Form1 Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Form1();
                }

                return instance;
            }
        }
Hvis instance er null, det vil den altid være når dit program kører. Så opretter du en form1. Men du peger ikke på den form1 som du har kørende, som du kan se. Så jeg ville lave det om til:

Form1
namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        private Form1 instance;
        public Form1()
        {
            InitializeComponent();
            instance = this;
        }

        public Form1 Instance
        {
            get
            {
                return instance;
            }
        }

        public void SetText()
        {
            textBox1.Text = "Hej hej";
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.Show();
        }
    }
}

Form2
namespace WindowsApplication1
{
    public partial class Form2 : Form
    {
        Form1 f1;

        public Form2()
        {
            InitializeComponent();
            f1 = Form1.Instance;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            f1.SetText();
        }
    }
}

Dine statics bryder jeg mig heller ikke så meget om, når vi er kommet over i en windows applikation, og ikke længere kører med en et console projekt.
Avatar billede the_party_dog Nybegynder
11. august 2006 - 11:04 #4
Hov.. Igen er jeg for hurtig.....

Jeg vil faktisk mene at sådan som du vil have det til at virke, vil du have svært ved det... Netop fordi du ikke peger på det oprettet objekt af form1, skal det hele være static for at det vil virke. Fordi det bliver static kan du se det på objektet Form1, men du vil aldrig få fat i det objekt af Form1 som du har lavet en instans af, når du kører hele dit projekt.

Jeg vil mene at min løsning vil være det nemmeste lige nu.... Kan ikke lige gemmenskue hvad der skal til, for at få det til at virke for dig, med din property.
Avatar billede the_party_dog Nybegynder
11. august 2006 - 11:13 #5
Nu skal jeg se om jeg kan forklare det hele lidt bedre, så det også giver mening for andre end mig :-).

Du har et klasse som hedder Form1. I den klasse har du en property, som skal returnere en instans af typen Form1. Den property har du lavet static og public for at du kan tilgå den ved bare at skrive From1.Instance.

Når du kører dit projekt, vil der blive oprettet en instans af din Form1 klasse, lad os kalde den objForm1. Det du så gør i objForm1 er at du laver en instans af Form2, den kalder vi objForm2. I objForm2 vil du så hive fat i din instans af objForm1. Det forsøger du at opnå ved at kalder Form1.Instance property'en.

Din property tjekker om den lokale instance variabel er null, det vil den altid være. Så opretter du en ny instans af Form1 klassen, den bliver så objForm1-2. Nu kalder dit objForm2 objekt SetText funktionen på det objekt den lige har modtaget, i dette tilfælde er det så på objForm1-2 objektet, og ikke dit objForm1 objekt som du ønsker at få fat i.

Derfor virker din fremgangs måde, fordu du aldrig får givet den korrekte pegepind til dit objForm1 objekt. Derfor virker min tilgang, fordi jeg sender pegepinden fra den KALDENDE objForm1 objekt. På den måde kan dit objForm2 objekt kalde SetText og få det til at virke.
Avatar billede mikkel_strack Nybegynder
11. august 2006 - 11:23 #6
Okay...jeg troede faktisk at den ville hive fat i objForm1 - var i hvert fald det som var hensigten.

Jeg stort set kun net, så mine erfaringer med applikationer er meget små - så stoler på du har ret :o)

Vidste du iøvrigt hvorfor den bagvedliggende form ikke låser når jeg åbner en ny? Mener jeg helt bestemt de plejede at gøre.

Og smid så det svar! ;o)
Avatar billede the_party_dog Nybegynder
11. august 2006 - 13:10 #7
Du skal skrive f2.ShowDialog(), så låser du den bagvedliggende form.

Du er helt opsat på at jeg skal svare.. :-)

Du kan jo nok se at din property laver en new Form1(), så vil den jo ikke have en jordisk chance for at hive fat i det rigtige objekt.
Avatar billede mikkel_strack Nybegynder
11. august 2006 - 13:27 #8
Alså..nu er konceptet jo således (* = sæt evt. selv navn ind efter eget valg):

Mikkel(*) kan ikke finde ud af det...Mikkel(*) er ked..
Mikkel(*) spør'
Festlig køter(*) svarer
Mikkel(*) er nu glad
Festlig køter(*) får point og er også glad..

Sån virker eksperten...jeg indretter mig bare ;o)
Avatar billede the_party_dog Nybegynder
11. august 2006 - 13:36 #9
Hehe... :-)

Det er rigtigt, jeg plejer bare ikke svare før personen jeg hjælper er helt sikker på at alt det virker som det skal. Samt at jeg har afklaret de spørgsmål der måtte hænge sammen med det der er blevet lavet/besvaret...

Fik du det til at virke med ShowDialog?
Avatar billede mikkel_strack Nybegynder
11. august 2006 - 14:42 #10
Huskede godt det med ShowDialog straks du skrev - er bare 100 år siden jeg sidst har lavet noget applikationsgejl. Man sveder den slags ud.

Men ja...det virker fint lige nu. Der mangler stadig en del, sån samlet set, så kommer sikkert en del knaster mere inden jeg bliver helt færdig.
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