Autor Beitrag
Brauner
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 13.04.07 15:44 
Hallo!

Ich versuch gerade in C# (IDE-->SharpDevelop) Controls als Array zu erstellen. Habe leider bisher kein Beispielskript erfunden und wenn ich versuche, das was bei einer normalen Controlerstellung passiert, einfach alles als Array zu machen, compilt er inzwischen ohne Fehler, aber beim Ausführen kommt folgender Fehler:

Ausnahme System.NullReferenceException wurde im ausgeführten Programm ausgelöst:
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Das Ziel ist also einfach zum Beispiel 40 PictureBoxes zu erstellen und die einzelnen Bilder über einen Array ansprechen zu können.

Im Vorraus schon mal Danke!


Moderiert von user profile iconChristian S.: Topic aus Allgemeine .NET-Fragen verschoben am Fr 13.04.2007 um 17:24
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Fr 13.04.07 17:25 
Hallo!

Zeig doch mal Deinen bisherigen Sourcecode, dann kann man ja mal schauen, wo es da zu Problemen kommen kann. :-)

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Brauner Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 13.04.07 19:24 
Sorry wegen fehlenden Codetags^^

Also hier das Mainfile (MainForm.cs)...

ausblenden 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:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;

namespace test
{
  public partial class MainForm : Form
  {
    [STAThread]
    public static void Main(string[] args)
    {
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new MainForm());
    }
    
    public MainForm()
    {
      InitializeComponent();
    }
    
    void Timer1Tick(object sender, EventArgs e)
    {
    }
  }
}


...und MainForm.Designer.cs:

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:
namespace test
{
  partial class MainForm
  {
    private System.ComponentModel.IContainer components = null;
    
    protected override void Dispose(bool disposing)
    {
      if (disposing) {
        if (components != null) {
          components.Dispose();
        }
      }
      base.Dispose(disposing);
    }
    
    private void InitializeComponent()
    {
      
      this.components = new System.ComponentModel.Container();
      System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm));
      this.timer1 = new System.Windows.Forms.Timer(this.components);

      this.mypictureboxes=new System.Windows.Forms.PictureBox[40];


      this.SuspendLayout();
      // 
      // timer1
      // 
      this.timer1.Enabled = true;
      this.timer1.Interval = 200;
      this.timer1.Tick += new System.EventHandler(this.Timer1Tick);
      
      
      for(int i=1;i<40;i++)
      {
        this.mypictureboxes[i].Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
        this.mypictureboxes[i].Location = new System.Drawing.Point(1212);
        this.mypictureboxes[i].Name = "pictureBox1";
        this.mypictureboxes[i].Size = new System.Drawing.Size(2020);
        this.mypictureboxes[i].TabIndex = 0;
        this.mypictureboxes[i].TabStop = false;
      }


      // 
      // MainForm
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
      this.ClientSize = new System.Drawing.Size(292266);

      for(int i=1;i<40;i++)
      {
        this.Controls.Add(this.mypictureboxes[i]);
      }
      
      this.Name = "MainForm";
      this.Text = "test";
      this.ResumeLayout(false);
    }

    private System.Windows.Forms.PictureBox[] mypictureboxes;
    private System.Windows.Forms.Timer timer1;
    

    
  }
}


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt
alias5000
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2145

WinXP Prof SP2, Ubuntu 9.04
C/C++(Code::Blocks, VS.NET),A51(Keil),Object Pascal(D2005PE, Turbo Delphi Explorer) C# (VS 2008 Express)
BeitragVerfasst: Fr 13.04.07 23:41 
Hi!
Du erstellst dir zwar ein Array von Pictureboxen, aber denke dran, dass das im Prinzip nur ein Array von Zeigern ist. Die Objekte dahinter musst du noch in einer Schleife erstellen:
ausblenden C#-Quelltext
1:
2:
3:
foreach(PictureBox pb in this.pictureboxes) {
  pb = new PictureBox(...);
}


Und dann habe ich dir noch zwei Stellen markiert, bei denen du Fehler beim Index i machst. Ein Array mit 40 Elementen hat den Indexbereich 0-39. Du zählst aber nur von 1-39.

user profile iconBrauner hat folgendes geschrieben:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
       for(int i=1;i<40;i++)
      {
        this.mypictureboxes[i].Image = ((System.Drawing.Image)(resources.GetObject("pictureBox1.Image")));
        this.mypictureboxes[i].Location = new System.Drawing.Point(1212);
        this.mypictureboxes[i].Name = "pictureBox1";
        this.mypictureboxes[i].Size = new System.Drawing.Size(2020);
        this.mypictureboxes[i].TabIndex = 0;
        this.mypictureboxes[i].TabStop = false;
      }

      for(int i=1;i<40;i++)
      {
        this.Controls.Add(this.mypictureboxes[i]);
      }


Gruß
alias5000

_________________
Programmers never die, they just GOSUB without RETURN
Brauner Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 14.04.07 01:39 
Danke!

Das mit den Zeigern hab ich halt noch nie gecheckt, woran ich jetzt merk ob ich nur nen Zeiger hab oder wirklich den Wert.

Also:

Eine Zeiger-Variable hat einen Platz im Speicher sagen wir mal mit der Adresse WOEZRHSDFH und hat als gespeicherten Wert die Adresse (z.B. SLKDFLAHS) auf eine andere Speicherstelle. Wenn ich jetzt also neues Objekt erstell der Klasse PictureBox dann ist das Objekt nur ein zeiger auf die richtige Speicherstelle?

Und was macht dann this?
This ist das gleiche wie * bei C++. Also dass man den Wert bekommen will, der hinter der Adresse steckt der im Zeiger gespeichert ist?
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: Sa 14.04.07 10:43 
Hallo,

also das mit den Zeigern ist eigentlich ziemlich einfach (naja, nachdem ich mich jahrelang mit dem gleichen Verständnisproblem herumgeschlagen habe). Ich möchte aber nicht Deine Aussage umstellen und korrigieren, weil das nur noch mehr verwirren würde; ich gehe lieber von Deinem Problem aus:
  1. Du deklarierst zunächst Deine Liste mypictureboxes als PictureBox[]. Jetzt ist nur ein Name festgelegt, und es ist bekannt, dass dieser Name für eine Liste von PictureBoxen verwendet wird. Es ist noch kein Speicher zugeordnet:
    ausblenden C#-Quelltext
    1:
    private System.Windows.Forms.PictureBox[] mypictureboxes;					

  2. Dann erzeugst Du diese Liste. Damit wird Speicher für eine Liste angelegt. (Vom Speicherplatz her ist es [noch] gleichgültig, ob es sich um eine Liste von Integer, Form oder eben PictureBox handelt.) Dieser Befehl vermeidet (verhindert) die Fehlermeldung "keine Objektinstanz", aber nur in Bezug auf die gesamte Liste unter dem Namen mypictureboxes. Dadurch wird ein Zeiger auf diese Liste angelegt; jetzt erst weiß das Programm, an welcher Stelle im Speicher es nachschauen soll, wenn die Liste mypictureboxes benutzt wird.
    ausblenden C#-Quelltext
    1:
    this.mypictureboxes = new System.Windows.Forms.PictureBox[40];					

  3. Tatsächlich enthält diese Liste aber noch "nichts": Für jeden einzelnen Index muss eine eigene PictureBox erzeugt werden; erst danach weiß das Programm, an welcher Stelle im Speicher es nachschauen soll, wenn eine bestimmte PictureBox mypictureboxes[n] benutzt wird. Dieser Schritt hatte bei Dir gefehlt (erledigt durch den ersten Code von alias5000).
  4. Durch die vorherige Deklaration wird zusätzlich sichergestellt, dass im 3. Schritt nur eine PictureBox (oder eine davon abgeleitete Klasse) eingetragen werden kann, aber kein Integer oder Form oder Image; sonst schimpft schon der Compiler.

Unter NET denkt man in der Regel nicht darüber nach, ob man einen Zeiger oder einen Wert benutzt, sondern darüber, ob das Objekt, das man unter einem Namen ansprechen will, wirklich existiert (d.h. ob eine Instanz dieser Klasse erzeugt worden ist; andernfalls "zeigt" dieser Name an eine Stelle im Nirwana); dann hat sich nämlich NET einen Zeiger dafür geschaffen. Für Fachleute: bitte nicht meckern, wenn diese Darstellung zu sehr vereinfacht ist; mir ging es um das grundsätzliche Verständnis.

Zusatzhinweis zu this: Das hat eigentlich überhaupt nichts mit Zeigern zu tun, sondern es ist nur eine Kurzbezeichnung für die aktuelle Klasse, in der man sich befindet. Es kann (fast) immer weggelassen werden, hilft aber wegen Intellisense: Nach dem Punkt erhältst Du die zugänglichen Member dieser Klasse, sonst musst Du alle Namen "aus dem Gedächtnis" schreiben.

Ich hoffe, ich konnte es etwas klarer machen. Jürgen
Brauner Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: So 15.04.07 23:29 
Danke! Schon alles um einiges klarer^^

Gehört nicht hier rein, aber ich hab jetzt tausend Stunden danach gegooglt und einfach nichts gefunden:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
                void MainFormKeyDown(object sender, KeyEventArgs e)
    {

      
      switch(e.KeyCode)
      {
        case Keys.Left:
          move_left=1;
          break;
        case Keys.Right:
          move_right=1;
          break;
        case Keys.Up:
          move_rotate=1;
          break;
        case Keys.Down:
          move_let_fall=1;
          break;
        default:
          break;
      }    
    }


Das sollte doch jetzt für Arrow Keys funktionieren oder? Da passiert aber nichts. Mit Keys.A/Keys.D usw. funktioniert es aber an der Stelle. Was ist falsch?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: So 15.04.07 23:33 
Hallo!

Bitte erstelle für eine neue Frage auch immer einen neuen Thread in der richtigen Sparte mit entsprechendem Titel. Sonst wird's zu unübersichtlich.

Ich mache hier erst einmal zu. Solltest Du noch Fragen zum eigentlichen Thema haben, melde dieses Thema mit Bitte um Wiederöffnung ans Team (Link "Thema melden").

Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.

Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.