Autor Beitrag
ffprogramming
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 44

Win XP
C# Java C PHP
BeitragVerfasst: Sa 14.11.09 17:59 
Moin.
Wenn man klickt soll an der Mouse Position eine Picturebox erstellt werden. Wenn man nochmal klickt soll auch wieder eine Picturebox erstellt werden. Hier liegt das Proble wie lässt sich eine Picturebox mit einer Variablen bezeichnen.
Mein Code:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void Form1_MouseDown(object sender, MouseEventArgs e)
        {
            System.Windows.Forms.PictureBox a = new PictureBox();
            a.Height = 100;
            a.Width = 100;
            a.BackColor = System.Drawing.SystemColors.ActiveCaptionText;
            a.Location = e.Location;
            this.Controls.Add(a);
        }


So wenn ich jetzt nochmal klicke wird die neu entstandene Picture Box auch mit a bezeichnet oder?
Ich würde am liebsten einfach eine Variable (int i) deklarieren. Am Ende des MouseDown events würde sie dann einfach um eins hochgesetzt (i++)
Aber wenn man anstelle von a eine Variabel einsetzt funktioniert der Code nicht. (oder sehe ich das falsch?)
Schon einmal Danke.

Filip
JasonDelife
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 81

Windows 7 Professional
C# (Visual Studio 2008 Professional), Java (NetBeans IDE 6.7)
BeitragVerfasst: Sa 14.11.09 19:22 
Nutze eine List<T> oder ein Dictionary<TKey, TValue>.

Grüße, JasonDelife.
ffprogramming Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 44

Win XP
C# Java C PHP
BeitragVerfasst: Mo 16.11.09 20:27 
ganz vergessen zu antworten:
Danke für die Antwort: Ich muss mich wenn ich mal wieder Zeit habe da einlesen: Kenne mich nicht so mit der Anwendung von Lists und Dictionarys aus aber versuche es mal.
Danke für die Antwort
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Di 17.11.09 09:41 
Hallo,

ich bin mir nicht sicher, ob Jasons Antwort wirklich hilfreich ist. Das hängt sehr davon ab, an welchen Stellen du sonst noch auf eine bestimmte PictureBox zugreifen willst. Es kann helfen, führt aber u.U. zu weit vom Weg ab.

Jedes Control hat die Eigenschaft Name. Die wird in deinem Code überhaupt nicht benutzt; laut SDK-Doku ist der Standardwert eine leere Zeichenfolge. Damit kannst du zwischen den verschiedenen PictureBoxen überhaupt nicht unterscheiden. Der erste Schritt muss also sein, a.Name festzulegen.

Mit Controls.FindControl("was auch immer") kannst du ein bestimmtes Control wiederfinden und auch als PictureBox benutzen:
ausblenden C#-Quelltext
1:
2:
3:
4:
PictureBox pb = Controls.Find("MyPictureBox27"as PictureBox;
if (pb != null) {
   // mach was mit pb
}

Du hast auch noch einen schwerwiegenden Denkfehler. Eine Variable ist zwar so etwas wie ein Zeiger auf ein spezielles Objekt im Arbeitsspeicher; aber sie hat immer nur einen bestimmten Gültigkeitsbereich. Bei deinem Code wird eine PictureBox erzeugt und der Controls-Liste hinzugefügt. In dieser Liste steht sie und bleibt sie stehen. Aber die Variable a ist außerhalb der MouseDown-Methode völlig unbekannt; es gibt keinen dauerhaften Zusammenhang zwischen a und einem bestimmten Objekt. Nur durch eine neue Zuweisung (wie in meinem Code) bekommt man wieder eine Variable, die mit dem Objekt vorübergehend verbunden ist.

Übrigens: Du solltest using-Direktiven verwenden, damit der Code kürzer wird. Ein Namespace wie Forms wird so oft benutzt, dass man zu schreibfaul ist; System.Drawing ist ein Grenzfall. "this" kann fast immer entfallen (auch wenn der Designer das schreibt); es ist gibt doch keinen Zweifel darüber, welche Controls (in deinem Code) gemeint sind. Laufende Nummern für Namen von Controls sind nur in einem solchen Ausnahmefall akzeptabel, siehe NET Richtlinien für Namen.

Gruß Jürgen
ffprogramming Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 44

Win XP
C# Java C PHP
BeitragVerfasst: Di 17.11.09 16:29 
Zwar habe ich es jetzt noch nicht ausprobiert, aber ich glaube das wird mir weiter helfen.
Ja das mit dem this Elemt weiß ich ich verwende auch usings und weiß gerade selbst nicht warum ich das so kompliziert geschrieben habe.