Autor Beitrag
itsaproblem
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 09.11.08 14:33 
Hallo,
ich hab mal wieder ein kleineres Problem...
Ich will bzw. soll ein Programm schreiben für Matrix Multi, Add, und Sub. und das mit Oberfläche.
Also ich habs jetzt soweit, dass wenn ich z.B. eingebe Matrix A mit (4,5), dass er mir die Text-Boxen macht, doch wenn ich dann z.B. die 4 in eine 3 ändere, bleibt die letzte Zeile stehen... nun meine Frage was muss ich machen, damit er mir die dann wieder entfernt.

Also das generieren der Text-Boxen hab ich so gemacht:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
            int Bis = Convert.ToInt32(ZA.Text);
            TextBox [] Boxen =new TextBox[Bis];


            for (int k = 0; k < Bis; k++)
            {
                Boxen[k] = new System.Windows.Forms.TextBox();
                Boxen[k].Location = new System.Drawing.Point(12146+k*30);
                Boxen[k].Name = "A" + k;
                Boxen[k].Size = new System.Drawing.Size(6426);
                Boxen[k].TabIndex = 3;
                Boxen[k].KeyUp += new System.Windows.Forms.KeyEventHandler(this.ZA_KeyUp);
                Boxen[k].KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.ZA_KeyPress);
                Controls.Add(Boxen[k]);
            }

Aber hab keine Ahnung wie ich sie wieder weg bekomm wenn ich ne "kleinere" Matrix danach berechnen will.

Schon mal jetzt vielen Dank.

Quaneu
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 09.11.08 14:40 
Was du eigentlich ja nur machen müsstest ist, einmal eine Schleife von der aktuellen Anzahl an Boxen (am Anfang 0) bis zur gewünschten laufen zu lassen und diese neu zu erstellen. Dann werden nur die neu erstellt, die tatsächlich neu gebraucht werden.

Dann eine zweite Schleife, die von der neuen Anzahl bis zur aktuellen Anzahl läuft (da passiert dann nur etwas, wenn die neue Anzahl kleiner ist) und die dann überflüssigen Boxen entfernt.
itsaproblem Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 09.11.08 14:52 
Danke für die schnelle Antwort. Nur versteh ich die Antwort nicht so ganz. Denn sie sind ja dann schon in der Oberfläche wenn ich z.B. beim ersten mal eine (5,7) Matrix hab und beim zweiten mal nur eine (3,7) dann stehen die ja schon in der Oberfläche, bzw. wurden generiert. Und wenn ich ich die dann nur in den Schleifen "anders" lauf, werden sie doch nicht entfernt, oder?
Oder steh ich auf der Leitung.
Also gemacht wird der Code-Ausschnitt (siehe. oben) im Key-Up, von der Text-Box, die die Zeilenzahl einliest.
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: So 09.11.08 15:24 
Ist das so schwer, in der SDK-Doku/MSDN selbst nach passenden Methoden zu suchen? Du benutzt Controls.Add; Controls ist eine ControlCollection; also schau nach, was es passendes gibt zum Entfernen. Ach nee, da steht ja:
Zitat:
Entfernt das angegebene Steuerelement aus der Steuerelementauflistung.

Damit ist die betreffende Box nicht mehr sichtbar, aber noch vorhanden. Also muss noch Dispose aufgerufen werden.

Aber diese Aufgabe ist ein klarer Hinweis, wann ein Array nicht sinnvoll ist: Das ist eine Liste von fester Größe. Du willst die Liste aber variabel halten; also ist unbedingt List<TextBox> zu empfehlen. Nachteil bei diesem Vorgehen ist sowieso, dass alle TextBoxen doppelt verwaltet werden: als sichtbares Control und als Teil der Liste. (Mir fällt aber auf die Schnelle nichts Einfacheres ein.)

Zu beachten ist, dass zum Entfernen von Elemente immer eine Schleife vom Maximum abwärts zum Minimum zu verwenden ist!

Übrigens solltest Du auf Convert.ToXxx möglichst verzichten; benutze in aller Regel Parse, TryParse, ParseExact, TryParseExact (hier für int).

Jürgen
itsaproblem Threadstarter
Hält's aus hier
Beiträge: 12



BeitragVerfasst: So 09.11.08 19:27 
Danke für die Antwort.
Mach auch kein array in dem Sinne sondern hab ne class Matrix und die generiert mir dann den array so wie ich sie grad brauch, indem der Konstruktor den array so generiert wie ich sie grad brauch.