Formular-Array? Mehrere (Gleiche) Formulare öffnen.

sinni800

Mitglied
Ich möchte ein kleines Notizprogramm bauen, das für jede Notiz, die in einer Datenbank ist (Schon dafür gesorgt) ein neues Fenster öffnet, in welchem die Notiz angezeigt wird. Nun dachte ich so nach der Art des Control Arrays ein FORM-ARRAY zu bauen.
Habe folgendes versucht, doch kriege immer einen Fehler.

Ich lese eine Access-Datenbank mit OleDB aus, funktioniert so weit perfekt, nur eben das mit 'für jede Notiz einen Zettel' .. klappt noch nicht. Es t auch perfekt alles erst in Arrays zu schreiben. Aber nur eben das nicht.

Ich möchte alle Fenster eigentlich ansprechbar behalten. Das ist der Grund. Wenn das auch anders geht; Tipps wären willkommen!

Ich bekomme eine NullReferenceException, und den berühmten
Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.
Fehler.

Nun aber zu meinem Code:

Code:
    Dim notehh() As Notes.note 'note = Das Notizformular. Die hh sind nur willkürlich hingemacht, damit bloß keine Konflikte zwischen Variablen oder Namen oder so kommen. Das ist übrigens in der Klasse, und nicht in der Prozedur (habs auch schon mit Public und so versucht)

        Dim conn As OleDb.OleDbConnection = New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\DB.mdb")
        Dim comm As OleDb.OleDbCommand = New OleDb.OleDbCommand("SELECT [Memo].* FROM [Memo]", conn)

        Dim reader As OleDb.OleDbDataReader
        conn.Open()
        reader = comm.ExecuteReader
        Dim x As Integer = 0

        While reader.Read()
            notehh(x) = New note
            notehh(x).TextBox1.Text = reader.Item("MemoText")
            notehh(x).Show()

            wr("Lade Note " + x.ToString)

            x = x + 1
        End While

Code:
    Notes.note[] notehh; 
    //note = Das Notizformular. Die hh sind nur willkürlich hingemacht, damit bloß keine Konflikte zwischen Variablen oder Namen oder so kommen. Das ist übrigens in der Klasse, und nicht in der Prozedur (habs auch schon mit Public und so versucht)

    
    OleDb.OleDbConnection conn = new OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\DB.mdb"); 
    OleDb.OleDbCommand comm = new OleDb.OleDbCommand("SELECT [Memo].* FROM [Memo]", conn); 
    
    OleDb.OleDbDataReader reader; 
    conn.Open(); 
    reader = comm.ExecuteReader; 
    int x = 0; 
    
    while (reader.Read()) { 
        notehh(x) = new note(); 
        notehh(x).TextBox1.Text = reader.Item("MemoText"); 
        notehh(x).Show(); 
        
        wr("Lade Note " + x.ToString); 
        
        x = x + 1;
Habs in C# konvertieren lassen, für die die es so besser können ;)

Der Fehler taucht bei

notehh(x) = New note

auf
 
Zuletzt bearbeitet:
Hallo,

irgendwie solltest du vorher schon mal die Größe des Arrays festlegen, also sowas in der Art:
C#:
Notes.note [] notehh = new Notes.note[ groesse ];
Ansonsten könntest du auch eine ArrayList verwenden. Die lässt sich dynamisch erweitern.

Gruß
MCoder
 
Eine Arraylist lässt sich auch mit anderen Werten wie Objekten füllen?

Mal schaun..

Ist das aber nicht Speicherfressend wenn ich z. B. ne 50er Größe mach, sie sofort fertigdeklarier und füllen lass?

Oder: Kann man nicht mit einem Befehl ein Array vergrößern? Dazu wäre ja ne Arraylist gut, oder?

Hab deinen Befehl mal in VB.NET umwandeln lassen:

Dim notehh As Notes.note() = New Notes.note(49)

Dieser zurück in VB.NET bringt mir aber seltsamerweise

Notes.note[] notehh = new Notes.note(49); also Klammern am Ende, keine eckigen. Ich glaub es ist wohl einfach ein Syntaxfehler.

Mein VB code bringt mir nun einen Fehler bei der 49: Zu viele Argumente. Hab auch schon versucht nach dem ersten note() die Klammer wegzutun... Ich werds jetz wohl einfach mit ner schleife deklarieren müssen (1-50)

Dim notehh(49) As Notes.note
bringt mir nun keinen Fehler.. Aber wenn ich die 49 auch hinten in die Klammer setze schon. Und zwar "Für Arrays, die mit expliziten Grenzen deklariert sind, ist keine explizite Initialisierung zulässig."

Ist wohl immer so ne Sache zwischen VB.NET und C#...

EDIT: Es t jetzt mit
Dim notehh(49) As Notes.note
Seltsamerweise... ....

Und im Code nun

Code:
notehh(x) = New note
notehh(x).TextBox1.Text = reader.Item("MemoText")
notehh(x).Show()

Jetz müsste ich dieses Array wie gesagt dynamisch vergrößern können.. Oder ein Arraylist verwenden. Oder einfach 150 andeklarieren, welche ja entgegen dem was ich oben schrieb nicht sofort befüllt werden..
 
Zuletzt bearbeitet:
Eine Arraylist lässt sich auch mit anderen Werten wie Objekten füllen?
Wertetypen werden automatisch in ein Objekt gepackt (Boxing bzw. Unboxing)
Ist das aber nicht Speicherfressend wenn ich z. B. ne 50er Größe mach, sie sofort fertigdeklarier und füllen lass?
Bei einer ArrayList brauchst du keine Größe festzulegen. Sie erweitert sich dynamisch beim Hinzufügen von Objekten.
Kann man nicht mit einem Befehl ein Array vergrößern
Probier's mal mit
Code:
ReDim notehh(neue_groesse);
Gruß
MCoder
 
Zurück