Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[C#] Sender probleem bij beginneling

Pagina: 1
Acties:
  • 728 views

Verwijderd

Topicstarter
Ik heb een aantal buttons die elk een nieuwe picturebox aanmaken en deze op mijn form plaatsen. Elke picturebox roept een image op van de hd.
Dit doe ik op volgende manier:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private int teller1 = 0;
private Point positie1 = new Point(0,0) ;


private void button4_Click_1(object sender, EventArgs e)
        {
            teller1 += 1;
            PictureBox x = new PictureBox();
            Controls.Add(x);
            x.Name = "pic" + teller1;
            x.Image = Image.FromFile(@"C:\pic\trafo.jpg");
            x.Location = new Point(this.positie1.X + 300, this.positie1.Y);
            positie1.Y += x.Height + 5;
            x.ClientSize = new Size(80,80);
            x.AllowDrop = true;
            x.AllowDrop = true; 
       }


Deze code werkt.

Nu wil ik het de geplaatste pictureboxen ook kunnen verplaatsen.
Ik heb om te experimenteren eerst gewoon een picturebox geplaatst op mijn form, dus niet een button die deze aanmaakt.

Met deze code kan ik de geplaatste picturebox verplaatsen:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
private bool mouse_is_down = false;

private void pictureBox2_MouseUp(object sender, MouseEventArgs e)
        {
            mouse_is_down = false;
        }


private void pictureBox2_MouseDown(object sender, MouseEventArgs e)
        {
            mouse_is_down = true;
            
        }


private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
        {

            if (mouse_is_down)
            {
                Point current_pos = Control.MousePosition;
                pictureBox2.Location = current_pos;
            } 
        }


En dit werkt ook, welliswaar met een klein foutje: als ik op de picturebox klik dan kan ik verslepen, maar de picture staat een grote afstand van de muiscursur af.


Wat wil ik nu doen: ik wil nu de picboxen die de button aanmaakt kunnen verplaatsen, maar elke picturebox die wordt aangemaakt krijgt een andere naam. Hoe moet ik dit programmeren? Ik veronderstel dat er een sender bij moet?

  • Storme
  • Registratie: December 2004
  • Laatst online: 18-06 16:41
Indien je het goed wilt doen, dan erf je van picturebox en steek je daar je nodige logica in.

Maar als beginneling is deze oplossing misschien net iets makkelijker:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void button4_Click_1(object sender, EventArgs e)
{
...
PictureBox x = new PictureBox();
x.MouseDown += new MouseEventHandler(picbox_MouseDown);
x.MouseUp += new MouseEventHandler(picbox_MouseUp);
x.MouseMove += new MouseEventHandler(picbox_MouseMove);
Controls.Add(x);
...
}

        void picbox_MouseMove(object sender, MouseEventArgs e) {  // de sender is altijd het object die de event getriggered heeft
            PictureBox x = (PictureBox)sender;  // zoek maar even op casten in c#
            if (x.Tag != null && x.Tag) {   // Mouse is down 
                Point current_pos = Control.MousePosition;
                x.Location = current_pos;
            } 
        }

        void picbox_MouseUp(object sender, MouseEventArgs e) {
            ((Control)sender).Tag = false;   // mouse up
        }

        void picbox_MouseDown(object sender, MouseEventArgs e) {
            ((Control)sender).Tag = true;  //mouse down
        }

[ Voor 4% gewijzigd door Storme op 12-02-2008 13:11 ]


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 02:33
Je hebt nu de mousUp, -Down, en Move events nu in je testcase aan de picturebox gehangen. Het enige wat je dus moet doen is deze ook aan je dynamisch aangemaakt pictureboxes te hangen:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
private void button4_Click_1(object sender, EventArgs e)
{
teller1 += 1;
PictureBox x = new PictureBox();
Controls.Add(x);
x.Name = "pic" + teller1;
x.Image = Image.FromFile(@"C:\pic\trafo.jpg");
x.Location = new Point(this.positie1.X + 300, this.positie1.Y);
positie1.Y += x.Height + 5;
x.ClientSize = new Size(80,80);
x.AllowDrop = true;
x.AllowDrop = true; 

// Hang hier je events aan de picturebox
}


Oh ja, en zou je code tags willen gebruiken? Leest een stuk prettiger

[ Voor 5% gewijzigd door sig69 op 12-02-2008 13:11 ]

Roomba E5 te koop


  • smallboy
  • Registratie: September 2000
  • Laatst online: 15-11 17:15

smallboy

N/A

En voor het probleempje dat ze niet op de goede plek staan: dat heeft te maken met het feit dat coordinaten op je scherm anders zijn dan op je form. Zoek in de help even de functies PointToScreen en PointToClient op. Daar moet je een eind mee kunnen komen.

[ Voor 11% gewijzigd door smallboy op 12-02-2008 13:29 ]


Verwijderd

Topicstarter
Storme schreef op dinsdag 12 februari 2008 @ 13:09:
Indien je het goed wilt doen, dan erf je van picturebox en steek je daar je nodige logica in.

Maar als beginneling is deze oplossing misschien net iets makkelijker:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
private void button4_Click_1(object sender, EventArgs e)
{
...
PictureBox x = new PictureBox();
x.MouseDown += new MouseEventHandler(picbox_MouseDown);
x.MouseUp += new MouseEventHandler(picbox_MouseUp);
x.MouseMove += new MouseEventHandler(picbox_MouseMove);
Controls.Add(x);
...
}

        void picbox_MouseMove(object sender, MouseEventArgs e) {  // de sender is altijd het object die de event getriggered heeft
            PictureBox x = (PictureBox)sender;  // zoek maar even op casten in c#
            if (x.Tag != null && x.Tag) {   // Mouse is down 
                Point current_pos = Control.MousePosition;
                x.Location = current_pos;
            } 
        }

        void picbox_MouseUp(object sender, MouseEventArgs e) {
            ((Control)sender).Tag = false;   // mouse up
        }

        void picbox_MouseDown(object sender, MouseEventArgs e) {
            ((Control)sender).Tag = true;  //mouse down
        }
Bedankt!
Deze werkwijze snap ik, ik was al volgens deze manier aan het redeneren maar ik kon het niet vertalen naar code.
Ik heb dit geprobeerd, maar er blijft 1 error; dat is op regel 14: operator '&&' cannot be applied to operands of type bool and object.
Ik snap eigenlijk heel regel 14 niet.

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 02:33
Even casten naar (bool)

Roomba E5 te koop


Verwijderd

Verwijderd schreef op dinsdag 12 februari 2008 @ 13:35:
[...]
Ik snap eigenlijk heel regel 14 niet.
Hij controleert daar of je op die bepaalde picturebox hebt geklikt.

Elke picturebox heeft een property 'Tag', en die is 'null' bij het aanmaken. Dus eerst wordt gecontroleerd of x.tag != null (geeft true als het geen null is).

Daarna is die 'Tag' property op TRUE gezet wanneer er met de muis is geklikt (mousedown, zonder los te laten dus) op die picturebox...en dit wordt gecontroleerd dmv de && (and) operator.

Wat er dus staat in pseudocode: wanneer(niet null EN true) dan { verplaatsen }

Verwijderd

Topicstarter
Dit is mij nu duidelijk.

Wat ik echter nog altijd niet snap is dat ik een error krijg op regel 14 (&&)

Als ik de fout negeer, of && x.tag verwijder, dan werkt het programma, maar als ik de picbox heb neergezet en ik kom erna met de muis aan die picbox, dan loopt de picbox weg |:(

  • smallboy
  • Registratie: September 2000
  • Laatst online: 15-11 17:15

smallboy

N/A

Er moet staan
C#:
1
&& (bool)x.Tag
zoals hierboven al gezegd :)

Verwijderd

Topicstarter
Yes, heb het ana gang!!

Bedankt!! _/-\o_

Verwijderd

Maar snap je nu ook waarom je moet casten naar bool, en waarom het fout liep wanneer je die AND operator + statement weghaalde?

  • Storme
  • Registratie: December 2004
  • Laatst online: 18-06 16:41
smallboy schreef op dinsdag 12 februari 2008 @ 14:21:
Er moet staan
C#:
1
&& (bool)x.Tag
zoals hierboven al gezegd :)
oeps, ja, ik heb de code maar rap ff geschreven, idd vergeten te casten :)
Verwijderd schreef op dinsdag 12 februari 2008 @ 16:19:
Maar snap je nu ook waarom je moet casten naar bool, en waarom het fout liep wanneer je die AND operator + statement weghaalde?
Zou goed zijn als je hierop een antwoord weet :)

Verwijderd

Topicstarter
Volgens mij moet je naar Bool casten omdat we bij de MouseEvents Up en down een waarde 1 of 0 (bool) toekennen aan de Tag..

Waarom het fout liep als ik de AND operator + statement weghaalde, geen idee :)


Ben nu in mijn programma aan het experimenteren met databases, maar het lukt niet.
Op internet hopen informatie gevonden over db's, maar nergens een leuke duidelijke stap voor stap inleiding.

Ik zou om te beginnen gewoon een database willen openen, er via een button en datagrid wat records willen toevoegen en verwijderen.. Van deze simpele dingen.
Dit liefst met een SQL database, een Acces db is ook ok.
Iemand een leuke link hiervoor?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:01
Tja, zoeken naar tutorial moet je toch best zelf kunnen. Op MSDN is er bv genoeg te vinden. Zoek eens even op System.Data, SqlConnection, OleDbConnection, DataAdapter, DataSet, etc...

https://fgheysels.github.io/

Pagina: 1

Dit topic is gesloten.