Frage

Ich bin ein extremer Neuling in C #, aber ich habe durch das Head Start C # Tutorial Buch langsam worden zu bewegen (und finde es sehr angenehm, so weit). Allerdings habe ich eine Wand auf der ersten „lab“ Zuordnung getroffen: Sie Code geben für eine PictureBox Controlling, und ich kann diesen Code an die Arbeit auf dem Hauptformular zu bekommen, aber ich kann es nicht innerhalb einer Klasse an die Arbeit . Ich bin gegangen, zurück über die alten Lehren, und ich habe eine ziemlich gute Vorstellung davon, was ich fehle, aber für das Leben von mir kann ich nicht herausfinden, wie das Hauptformulars PictureBox zuzugreifen aus meiner Klasse ( wie das Tutorial sagt mir, ich tun sollte).

Es ist ein bisschen frustrierend, weil ich nicht im Voraus überhaupt in dem Buch springen habe, aber ich würde schwören wir dies noch nicht abgedeckt haben. Wie dem auch sei, unter Berufung auf Echt Programmierer.

Hier ist der Code im Tutorial zur Verfügung gestellt, in einem Abschnitt namens „Ihr Objekt Dinge auf dem Formular steuern kann“ (p208 für jedermann mit dem Buch).

Point p = MyPictureBox.Location 
p.x += distance;
MyPictureBox.Location = p

Im Folgenden Ich poste die entsprechenden (ich glaube?) Teile meines Code unten. Button1 für mich funktioniert, wenn kompiliert, Button2 „Werke“, in dem Sinne, dass die aktuelle Klasse sagt er nur das übergebene INT zu drucken, weil ich den Code auf Kommentar ich nicht zur Arbeit bekommen.

Vielen Dank im Voraus!

Code für Form1:

//


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
// Namespaces I'll need.

namespace Troubleshooting_PicBoxes
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent(); // Start all the Form1 stuff (all IDE-generated)

    }

    private void button1_Click(object sender, EventArgs e) //method from clicking the first button
    {
        int distance = 5; // Create this variable called "distance"

        Point BoxMovement = MyPictureBox.Location; //create a point called BoxMovement

        BoxMovement.X += distance; // Adjust the X of BoxMovement by my distance int.

        MyPictureBox.Location = BoxMovement; // now adjust the Box by the Point's location.

    }

    private void button2_Click(object sender, EventArgs e)
    {
        PicMover PicMoverObject1 = new PicMover(); // Reserve Space for&Create object
        PicMoverObject1.MoveThatPic(5); // Execute Object Method with a value of 5




    }


}
}

Code für PicMover Klasse:

//

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Troubleshooting_PicBoxes
{
class PicMover
{


    public void MoveThatPic(int distance) // New method, 
                                          // takes a variable called Distance.

    {
        MessageBox.Show(distance.ToString()); // Just show us that Variable.


        // I need to be able to access Form1's picture box before I can use this. :(
        /*           Point BoxMovement = MyPictureBox.Location; //create a point called BoxMovement
                    BoxMovement.X += distance; // Adjust the X of that by distance.
                    MyPictureBox.Location = BoxMovement; // now adjust the Box by the Point's location.
        */


    }
}

}

War es hilfreich?

Lösung

Wenn Sie den Zugriff auf etwas brauchen, warum Sie es nicht nur Zugang geben? Wie es als Argument an die Methode übergeben.

public void MoveThatPic(PictureBox picBox, int distance) // New method, 
                                      // takes a variable called Distance.

{
    MessageBox.Show(distance.ToString()); // Just show us that Variable.


    // I need to be able to access Form1's picture box before I can use this. :(
    Point BoxMovement = picBox.Location; //create a point called BoxMovement
    BoxMovement.X += distance; // Adjust the X of that by distance.
    picBox.Location = BoxMovement; // now adjust the Box by the Point's location.
}

jetzt in button2 Click-Ereignishandler:

private void button2_Click(object sender, EventArgs e)
{
    PicMover PicMoverObject1 = new PicMover(); // Reserve Space for&Create object
    PicMoverObject1.MoveThatPic(MyPictureBox, 5); // Execute Object Method with a value of 5
}

Andere Tipps

Die Tutorial Code wie folgt aussieht Sie den Speicherort von Ihrer Klasse sind Grabbing (MyPictureBox.Location) dann den Speicherort zu ändern, dann das Objekt zu diesem neuen Standort.

Point p = MyPictureBox.Location // Save the location of your object
p.x += distance; // Increase the distance
MyPictureBox.Location = p // Set your object to the new location

Die zweite Taste drücken Veranstaltung ist anders. Vielleicht sollten Sie einen Standort aus der Funktion zurückkommen? Also, wenn Sie die Funktion aufrufen, stellen Sie die PictureBox auf dem Hauptformular auf den Wert zurück.

Wenn Sie erstellen möchten ein Allzweck-Klasse, die von jeder Form zugegriffen werden kann ..., die eine Instanz schafft ... jede PictureBox auf dieser F bewegen orm, dann ‚Deerchao des Antwort zeigt Ihnen, wie es geht.

Obwohl ... betrachten ... jede Form haben wird, um eine eigene Instanz von PicMover erklärt ; Form1 Instanz von PicMover ist nicht „sichtbar“ zu jeder anderen Form, es sei denn Du es auch irgendwie veröffentlichen.

Um es technisch ausgedrückt: die PicMover Klasse, wie hier definiert, besteht im Rahmen der Applikation Namespace; es ist eine Schablone für Objekttyp zu schaffen, dass jede andere Klasse in der Anwendung verwenden kann, eine Instanz, zu machen, aber dass keine Klasse in der Anwendung „hat“ eine Instanz von standardmäßig .

Hier ist eine Alternative zu Deerchao des ausgezeichneten Antwort, die „Injektion“ zeigt: Injektion ist geeignet, wenn Sie eine Instanz einer Klasse zu wollen „Halt auf“ eine Referenz: in diesem Beispiel sagen wir, dass die Form der Instanz eines PictureBox wird „gebunden "auf eine Instanz der‚PicMover Klasse:

Wir erklären eine öffentliche Eigenschaft in der Klasse ‚PicMover die einen Verweis auf Form1 PictureBox halten wird:

public class picMover
{
    // note use of C# 3.0 automatic property feature here
    public PictureBox myPictureBox { get; set; }

    public void movePic(int distance)
    {
        // note test for null here
        if (myPictureBox != null)
        {
            myPictureBox.Left += distance;
        }
    }
}

So in Form1, nachdem Sie die Instanz erstellen ‚PicMover, stellen Sie ihre internen PictureBox Eigenschaft, und verwenden Sie dann ihre internen‘ movePic Methode: wie folgt aus:

// instance of PicMover created in the Form's scope
picMover myPicMover = new picMover();

private void Form1_Load(object sender, EventArgs e)
{
    // when the Form loads inject the reference to the PictureBox instance into the instance of 'PicMover
    myPicMover.myPictureBox = pictureBox1;
}

private void button1_Click(object sender, EventArgs e)
{
    myPicMover.movePic(23);
}

Beachten Sie, dass, imho, testen, um sicherzustellen, dass ein „injiziert“ Referenz auf ein Objekt vorhanden ist, indem für null zu testen, bevor Sie es eine gute Gewohnheit ist, in zu erhalten.

Eine weitere Möglichkeit, eine Instanz des PictureBox Objekt bekommen kann „gebunden“ in eine Instanz von ‚PicMover ist die Instanz des PictureBox an den Konstruktor der Klasse als Parameter übergeben: ich durch die Zeit, ich wette, beende dieses Posting , wird jemand hat sonst schon eine Antwort zeigt, dass die Technik geschrieben. Sie könnten zu „injizieren“ wollen mit einem Public Property wie hier angezeigt, wenn Sie die interne Referenz erwarten in der Klasse zu dem Constructor gegen das Bestehen die PictureBox geändert werden, wenn Sie nicht erwarten, es zu ändern.

Eine andere Strategie ist es, ‚PicMover eine öffentliche statische Klasse zu machen, mit öffentlichen statischen Methoden: dann kann jeder Form‚sehen sie,‘und es gibt keine Notwendigkeit für jede Form eine Instanz davon zu machen (in der Tat kann man nicht" wenn Sie beispielsweise“eine statische Klasse wollen. das ist, was eine statische Klasse ist)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top