Autor Beitrag
kaskus
Hält's aus hier
Beiträge: 13

WIN 2000; WIN XP
Delphi 7
BeitragVerfasst: Do 03.12.09 19:41 
Hallo Forum

ich weis, dass es hier einige Themen auch im Netz schon dafür gibt, hab auch manche Infos zur Hilfe gezogen, aber irgendwie helfen die mir nicht weiter bzw. ich bekomm es nicht hin.

Mein Problem ist, dass ich es mit der PictureBox einfach nicht hinbekomme, dass die Linien gezeichnet werden.
Zu meiner Idee:

Ich habee einen Start Button, einen Stop Button, einen Clear Button und ne Scrollbar, die bestimmt, wie groß das Feld sein soll. Minimum ist 25.

Und sobald die Scrollbar bewegt worden ist, soll das Feld dafür gezeichnet werden mit dem entsprechenden Value.
Mein Code bisher sieht dafür so aus:

ausblenden volle Höhe C#-Quelltext
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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace GameOfLife
{



    public partial class Form1 : Form
    {
        private Boolean[,] viewarray;
        private Boolean[,] dataarray;
        private int size;
        private int generation;




        public Form1()
        {
            InitializeComponent();
        }


        //Function to clear the Arrays ! 
        private void button3_Click(object sender, EventArgs e)
        {
            //If array not initialized and clear button was pressed, is a indexoutouf bounds ! 
            if (viewarray == null)
            {
                label2.ForeColor = Color.Red;
                label4.ForeColor = Color.Red;
                label2.Text = ("nothing to");
                label4.Text = ("clear");
            }
            else
            {
                //Delete the Arrays ! 
                for (int i = 0; i < viewarray.GetLength(0); i++)
                {
                    for (int j = 0; j < viewarray.GetLength(1); j++)
                    {
                        viewarray[i, j] = false;
                        dataarray[i, j] = false;
                    }

                }
                hScrollBar1.Value = 25;
                generation = 0;
                size = 25;
                label2.Text = Convert.ToString(size);
                label4.Text = Convert.ToString(generation);

            }
        }


        // Scrollbar to create the Grid and to init the arrays.
        private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            label2.ForeColor = Color.Black;
            label4.ForeColor = Color.Black;
            label2.Text = hScrollBar1.Value.ToString();
            label4.Text = Convert.ToString(generation);
            initArrays(hScrollBar1.Value);

        }


        // Arrays init.
        private void initArrays(int size)
        {
            dataarray = new Boolean[size, size];
            viewarray = new Boolean[size, size];


            for (int i = 0; i < viewarray.GetLength(0); i++)
            {
                for (int j = 0; j < viewarray.GetLength(1); j++)
                {
                    viewarray[i, j] = false;
                    dataarray[i, j] = false;
                }

            }
        }


    }

}


Hinzu kommt, wenn ich den Code für die PictureBox schreiben möchte, wie geh ich da am besten vorran ? Click ich doppelt in die PctureBox oder schreib ich manuell
private void drawGrid()
....
...
...

!?

Gruß
kaskus
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 04.12.09 12:04 
user profile iconkaskus hat folgendes geschrieben Zum zitierten Posting springen:
Click ich doppelt in die PctureBox oder schreib ich manuell
Wenn du ein Ereignis zuweisen willst, dann solltest du auch unter Ereignisse (im Visual Studio standardmäßig rechts unten, das Symbol mit dem Blitz über den Eigenschaften) das entsprechende Ereignis auswählen und es gezielt zuweisen. Dort geht dann auch ein Doppelklick auf das Ereignis.
kaskus Threadstarter
Hält's aus hier
Beiträge: 13

WIN 2000; WIN XP
Delphi 7
BeitragVerfasst: Do 10.12.09 17:50 
Hi,
es geht nicht darum, dass die PictureBox erst auf Click in die Box gezeichnet werden soll,
sondern direkt bei start das erste mal mit 25 * 25 feldern und bei bewegung der scrollbar, das nächste mal.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 10.12.09 18:33 
Eben. Deshalb schau unter Ereignisse einmal nach, dann wirst du das Ereignis Paint finden, das ausgelöst wird, wenn der Inhalt der Box neugezeichnet werden muss.
kaskus Threadstarter
Hält's aus hier
Beiträge: 13

WIN 2000; WIN XP
Delphi 7
BeitragVerfasst: Do 10.12.09 18:37 
ahh okay..
habs !

werd mich dann jetzt mal an die Graphics Container wenden.


Gibts dafür irgendwelche hilfreiche Tipps, die du immer wieder zur Hand nimmst ?

Graphics Components find ich nicht leicht zu lernen !
die sind blöd ^^
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 10.12.09 19:14 
Naja, viel zu lernen ist da im Grunde nicht. Visual Studio zeigt ja die möglichen Befehle und deren Parameter an. :nixweiss:

Beispiel:
ausblenden C#-Quelltext
1:
e.Graphics.DrawLine(new Pen(Color.Red), new Point(11), new Point(300400));					
kaskus Threadstarter
Hält's aus hier
Beiträge: 13

WIN 2000; WIN XP
Delphi 7
BeitragVerfasst: Do 10.12.09 20:26 
Hi,

bin damit soweit zu Recht gekommen, aber nur bei initilaisierung.
Mein Vorhaben ist ja, dass der Schieberegler (Scrollbar) mir die Felder angibt und dafür muss ich ja die Asbtandsberechnung haben..

Ich würd gern nach der Betätigung von hscollbar1 die Paintmethode aufrufen, aber die Signatur erwartet 2 Attribute.

Woher weis ich die ?In den anderen CS dataien wird die ohne Signatur aufgerufen.

Hier meine Scrollbar:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
        private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            label2.ForeColor = Color.Black;
            label4.ForeColor = Color.Black;
            label2.Text = hScrollBar1.Value.ToString();
            label4.Text = Convert.ToString(generation);
            initArrays(hScrollBar1.Value);
            abstand = hScrollBar1.Value;
            pictureBox2_Paint( ?????????????);

              

        }


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
        private void pictureBox2_Paint(object sender, PaintEventArgs e)
        {
            Graphics blub = e.Graphics;
            Pen p1 = new Pen(Color.Black,5);
            abstand = pictureBox2.Width / abstand;
            label4.Text = Convert.ToString(abstand);


Wie rufe ich von scrollbar die paint method. auf?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 10.12.09 23:50 
Es reicht bereits das Neuzeichnen einfach auszulösen. Dazu sagt man der Komponente entweder, dass sie sich auffrischen soll oder dass der aktuelle Inhalt ungültig ist:
ausblenden C#-Quelltext
1:
2:
            pictureBox1.Refresh();
            pictureBox1.Invalidate();
Wobei in diesem Fall das Invalidate ausreicht, da Refresh auch nur das aufruft und bei Container-Komponenten wie Panels dafür sorgt, dass das selbe auch mit den Komponenten darin passiert (das kann man bei Invalidate auch angeben).

Du kannst an Invalidate auch einen Rechteck-Parameter übergeben, wenn nur ein Teil neu gezeichnet werden muss.
kaskus Threadstarter
Hält's aus hier
Beiträge: 13

WIN 2000; WIN XP
Delphi 7
BeitragVerfasst: Fr 11.12.09 19:59 
Da ich nun, denke ich mal, meine halbn grafischen Probleme erledigt habe, würd ich jetzt gern meine GUI vorstellen, damit und meinen kompletten Code.

Die Gui ist zu sehen unter meienn Anhängen.
Label5 ist nur zu testzwecken da.. also keine bedeutung eigentlich..



was ich jetzt gern machen wrüde ist, zum einen bei mausklick in eines der kästschen soll das schwarz markiert werden und falls es schon schwarz ist, halt wieder in weis.
und diese position soll dann natürlich auch in das data und viewarray als true markiert werden.


dafür müsste ich dann wenn ich soweit richtig denke, für jede eigene größe eine if bzw. case abfrage schreiben, das ist aber zu aufwendig und ich finde nicht wirklich sinnvoll. gibts dafür irgendwelche hilfen in csharp ?

ausblenden volle Höhe C#-Quelltext
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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace GameOfLife
{



    public partial class Form1 : Form
    {
        //array to show the grid !
        private Boolean[,] viewarray;
        //array to calculate the neighboors
        private Boolean[,] dataarray;
        //size init = 25
        private int size;
        private int maxW = 600;
        private int anzahl = 25;
        private int abstand = 25;
        Graphics g1;
        private int generation;



        public Form1()
        {
            InitializeComponent();
            pictureBox2.Refresh();
            initArrays(anzahl);
        }


        //Function to clear the Arrays ! 
        private void button3_Click(object sender, EventArgs e)
        {
            //If array not initialized and clear button was pressed, is a indexoutouf bounds ! 
            if (viewarray == null)
            {

                label2.ForeColor = Color.Red;
                label4.ForeColor = Color.Red;
                label2.Text = ("nothing to");
                label4.Text = ("clear");
                pictureBox2.Refresh();
            }
            else
            {
                //Delete the Arrays ! 
                for (int i = 0; i < viewarray.GetLength(0); i++)
                {
                    for (int j = 0; j < viewarray.GetLength(1); j++)
                    {
                        viewarray[i, j] = false;
                        dataarray[i, j] = false;
                    }

                }
                hScrollBar1.Value = 25;
                generation = 0;
                size = 25;
                label2.Text = Convert.ToString(size);
                label4.Text = Convert.ToString(generation);

            }
        }


        // Scrollbar to create the Grid and to init the arrays.
        private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
        {
            label2.ForeColor = Color.Black;
            label4.ForeColor = Color.Black;
            label2.Text = hScrollBar1.Value.ToString();
            label4.Text = Convert.ToString(generation);
            
            anzahl = hScrollBar1.Value;
            initArrays(hScrollBar1.Value);
            pictureBox2.Refresh();
     
        }


        // Arrays init.
        private void initArrays(int size)
        {
            dataarray = new Boolean[size, size];
            viewarray = new Boolean[size, size];


            for (int i = 0; i < viewarray.GetLength(0); i++)
            {
                for (int j = 0; j < viewarray.GetLength(1); j++)
                {
                    viewarray[i, j] = false;
                    dataarray[i, j] = false;
                }

            }
            
        }


        //Swap arrays:
        private void swapArrays()
        {


        }




        private void pictureBox2_Paint(object sender, PaintEventArgs e)
        {
            g1 = e.Graphics;
            Pen p1 = new Pen(Color.Black,1);
            // for the right side and bottom line...
            g1.DrawLine(p1, 5990599599);
            g1.DrawLine(p1, 0599599599);
            abstand = maxW / anzahl;
            for (int i = 0; i < maxW+1; i = i+abstand)
            {
                g1.DrawLine(p1, 0, i, maxW, i);
                g1.DrawLine(p1, i, 0, i, maxW); 
            }
        }


        
        
        
        
        
        
        
        //Code to mark the Dots....
        private void pictureBox2_MouseClick(object sender, MouseEventArgs e)
        {
            coordinate(e.X, e.Y);
            label5.Text = Convert.ToString(e.X);

        }




    }

}
Einloggen, um Attachments anzusehen!