Avatar billede koppelgaard Praktikant
15. januar 2008 - 09:46 Der er 9 kommentarer og
1 løsning

thead og form controls

Jeg vil gerne tilføje en picturebox til en form, og sætte processen igang med en tråd jeg selv erklærer
Nedenstående kan ikke umiddelbart lade sige gøre.

Hvordan gør man så ?

using System;
using System.Threading;
using System.Windows.Forms;

namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
     
        private void Form1_Load(object sender, EventArgs e)
        {
     
        }
        private void AddPicturebox()
        {
            PictureBox pictureBox = new PictureBox();
            pictureBox = new System.Windows.Forms.PictureBox();

            pictureBox.Location = new System.Drawing.Point(5, 116);
            pictureBox.Name = "textBox1";
            pictureBox.Size = new System.Drawing.Size(100, 20);

            this.Controls.Add(pictureBox);
        }
           
        private void button1_Click(object sender, EventArgs e)
        {
            Thread t1 = new Thread(this.AddPicturebox);
            t1.Priority = ThreadPriority.Highest;
            t1.Start();     
           
        }
    }
}
Avatar billede Syska Mester
15. januar 2008 - 10:47 #1
Hvad fejl når du ?

Det her tidlgiere spm burde kunne svare på det ... man kan ikke opdatere GUI fra andre tråde end den som startede GUI ... du skal bruge Invoke på formen.

http://www.eksperten.dk/spm/693243

// ouT
Avatar billede bitmatic Nybegynder
15. januar 2008 - 10:50 #2
Du skal bruge Invoke når du vil opdatere en tråd fra en anden tråd.

Prøv med:

        delegate void AddItDelegate(PictureBox p);
        void AddIt(PictureBox p)
        {
            this.Controls.Add(p);
            this.Invalidate();
        }

        private void AddPicturebox()
        {
            PictureBox pictureBox = new PictureBox();
            pictureBox = new System.Windows.Forms.PictureBox();

            pictureBox.BackColor = Color.Pink;
            pictureBox.Location = new System.Drawing.Point(5, 116);
            pictureBox.Name = "textBox1";
            pictureBox.Size = new System.Drawing.Size(100, 20);

            Invoke(new AddItDelegate(AddIt), new object[] { pictureBox });
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Thread t1 = new Thread(this.AddPicturebox);
            t1.Start();
        }

Note: Jeg har givet pictureBox'en en syg baggrundsfarve for eksemplets skyld, for ellers kan man ikke se at den er der... :-)
Avatar billede koppelgaard Praktikant
15. januar 2008 - 12:22 #3
Tak for svaret.
bitmatic svar virker. Og det buzzzz er vist omtrent samme svar - her skal jeg bare tænke lidt mere
Fejlen var et vist som jeg forstod den at jeg ikke kunne tilføje en control med en underordnet tråde til en overordnet tråd....

Hvorfor kan jeg nu gøre det med invoke?

Michael
Avatar billede Syska Mester
15. januar 2008 - 12:54 #4
Du kan gøre det med Invoke, fordi det fortæller Formens ejer(tråden) at den skal køre den Method ...

// ouT
Avatar billede bitmatic Nybegynder
15. januar 2008 - 13:43 #5
Om trådene er underordnede eller overordnede er sådan set ligegyldigt. Du kan helt generelt ikke få lov til at ændre på data i én tråd fra en anden tråd.... Det giver alt for mange problemer at tillade det, så det er forbudt fra .NET 2.0 og fremefter :)

Når du kalder Invoke(new AddItDelegate(AddIt), new object[] { pictureBox }) i tråden t1, så beder du i virkeligheden bare den tråd der ejer funktionen "AddIt" (Form1 tråden) om at kalde den når den får tid til det... Det er væsentligt at forstå, at man altså ikke kalder AddIt direkte.
Avatar billede koppelgaard Praktikant
15. januar 2008 - 21:24 #6
Subert tak begge!
Du får alle pointene bitmatic denne gang (30 point er næsten for lidt at dele mellem to) for din løsning og efterfølgende gode forklaring !

Michael
Avatar billede koppelgaard Praktikant
15. januar 2008 - 21:44 #7
Men her er det jeg egentlig skulle bruge det til :

using System;
using System.Threading;
using System.IO;
using System.Windows.Forms;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging;

namespace PictureBrowser
{
    public class PictureBox_suber:PictureClass
    {       
        private FileInfo fi;
        private PictureBox p;
        private Form f;
        private int id;

        delegate void AddItDelegate(PictureBox p);
     
        void AddIt(PictureBox p)
        {
            f.Controls.Add(p);
            f.Invalidate();        }


        public PictureBox_suber(int id,FileInfo fi , Form_thumbnail f, int x, int y, int width, int height):base(fi)
        {
            this.id = id;
            this.fi = fi;
            this.f = f;
            this.p = new PictureBox();
            p.Name = id.ToString();
            p.Location = new System.Drawing.Point(x, y);
            p.Size= new System.Drawing.Size(width, height);           
            p.Image = this.Image;
            p.SizeMode = PictureBoxSizeMode.Zoom;           

           
        }
        public PictureBox Picturebox
        {
            get{return p;}
        }
       
        public void showPictureBox()
        {
            Invoke(new AddItDelegate(AddIt), new object[] { p });
            //f.Controls.Add(p);
        }

        public void ObjectDelete()
        {
            base.Image.Dispose();
            fi.Delete();
            p.Dispose();
            p = null;
            GC.Collect();
        }
     

    }
}

Jeg tilføjer en række pictureboxe til min form vha af ovenstående klasse.

Fra formen starter jeg en tråd, som igen starter et for-loop, som så går ind og bruger ovenstående klasse til at tilføje pictureboxene med.

Men jeg får når jeg bruge den metode som I har forklaret om får jeg fejlen:
'Invoke' does not exist in the current context'
Avatar billede bitmatic Nybegynder
15. januar 2008 - 23:08 #8
Jamen så vidt jeg kan se er det du laver der da slet ikke trådet, og så giver Invoke ikke meget mening....
Avatar billede Syska Mester
15. januar 2008 - 23:36 #9
Han arver fra "PictureClass" som kan have noget trådet ting ....

Men jeg kan heller ikke lige helt gennemskue det
Avatar billede koppelgaard Praktikant
16. januar 2008 - 07:23 #10
Jeg forstår godt, at I ikke forstår.
Jeg uddyber lige i eftermiddag efter arbejde.

:-) Michael
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