![]() |
Durch Array mehrere Label auf visible setzen
Hallo zusammen!
Seit ein paar Tagen versuche ich in meinem Programm etwas zu realisieren, finde aber für .NET leider keine Lösung. Ich möchte bei öffnen des Forms nur ein NumericUpDown anzeigen, mit dem man auswählen kann, wieviele Labels und TextBoxen angezeigt werden. Ich habe also diese alle auf Visible := false gesetzt. Was ich bisher versucht hab, ist ein Array zu erstellen, in dem die mögliche Anzahl des NumericUpDown jeweils vor der entsprechenden Durchnummerierung der Labels steht. Ein kleiner Auszug daraus den ich zum testen benutze:
Delphi-Quellcode:
Zur Erklärung (ich weiß nciht ob dies so überhaupt möglich ist):
const
nupdolabel : array[1..17] of Word = (2,1,2,3,4, 3,1,2,3,4,5,6,7,8, 4,1,2,3,4,5,6,7,8,9,10,11,12, 5,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16); Wenn im NumericUpDown "2" gewählt wurde, sollen die ersten 4 in die Schleife zum visible setzten geschrieben werden, bei 3 die ersten 8, bei 4 sollen es 12 sein und bei 5 alle 16. Wenn dies funktonieren sollte, muss ich jedoch noch vor diese Zahlen das Wort "Label" setzten, und zwar so, dass nachher auch wieder erkannt wird, dass es ein Label ist. Mein Versuch dies zu realisieren:
Delphi-Quellcode:
Das entscheidende ist wohl der Teil:
var
swfl : array[1..12] of System.Windows.Forms.Label; procedure TWinForm.NumericUpDown1_ValueChanged(sender: System.Object; e: System.EventArgs); var lv : byte; begin if NumericUpDown1.Value = 2 then begin for lv := low(swfl) to high(swfl) do begin swfl[lv] := Findcomponent(Format('Beschr%d',nupdolabel[lv])) as System.Windows.Forms.Label; end; end; end;
Delphi-Quellcode:
Diesen habe ich auf einer Win32 Delphi Seite gefunden. Daher funktioniert er leider auch nicht bei .NET, da es FindComponent dort nicht gibt.
swfl[lv] := Findcomponent(Format('Beschr%d',nupdolabel[lv])) as System.Windows.Forms.Label;
Meine Fragen sind jetzt, ob es überhaupt so funktionieren kann, was ich vor habe, und wenn ja, ob jemand einen erstatz für FindComponent hat oder vielelicht sogar eine elegantere Lösung für dieses vorhaben hat. Immer daran denken wenn etwas ganz komisches darin steht, was gar nicht gehen kann: Ich bin ein Anfänger! ;) Ich hoffe, jemand kann mir helfen. *hoff* :) by Michael |
Re: Durch Array mehrere Label auf visible setzen
Guten Morgen!
Möchte, oder kann mir hierzu keiner helfen? Kann mir jemand nen Tip geben, außer eine andere Version zu nehmen? by Michael |
Re: Durch Array mehrere Label auf visible setzen
ich finde die Lösung reichlich ungünstig. Warum erstellst du zig labels die du gar nicht benötigst? Erstelle doch die Labels erst wenn sie benötigt werden.
Und anstelle von FindComponent wäre ein Array doch besser geeignet. Denn FindeComponent SUCHT bei jedem Aufruf die Componente mti dem Namen (wie der Name der Funktion ja auch schon erahnen lässt) und da ist ein Arrayzugriff bedeutend schneller. |
Re: Durch Array mehrere Label auf visible setzen
Zitat:
Du meinst also ich sollte die Labels nicht durch das Array auf .visible setzen, sonder erst gar nicht einfügen und durch das Array erst durch .create erstellen!? Wenn ich das richtig versthe, ist das eine gute Lösung. Leider habe ich immer noch ein Brett vorm Kopf bei der Umsetzung. Wenn ich das FindComponent durch ein Array ersetzen will, müsste ich ja ein array haben, dass nicht nur die Durchnumemrierung enthält sondern gleich den ganzen Namen, oder? Also "Label1, Label2, Label3, Label4 usw..". Stimmt das? Ich weiß, das eine der schlimmsten fragen aber, wenn das richitg ist, muss ich leider fragen, wie geht das? Es wäre wirklich super nett, wenn sich jemand dem Problem antuen könnte und mir Codemäßig etwas weiterhelfen könnte. by Michael |
Re: Durch Array mehrere Label auf visible setzen
Ich habe ja keine Ahnung von .net, aber wieso speicherst du nicht einfach die Pointer auf die Labels in einem Array?
Oder du erstellst die Labels direkt dynamisch. mfG Markus |
Re: Durch Array mehrere Label auf visible setzen
Hallo Michael,
bei NET musst Du nicht nach Components suchen, sondern nach Controls: Jedes Control speichert die Elemente, die es enthält. Vorteil: Du kannst (z.B. innerhalb eines Panel) alle unmittelbar darin enthaltenen Elemente direkt suchen und bearbeiten. Nachteil: Wenn alle Controls eines Formulars benötigt werden, muss immer rekursiv gearbeitet werden. Konkret (in C#-Schreibweise):
Code:
Je nachdem, was Du ansonsten erreichen möchtest, ist SirThornberry's Vorschlag besser, die Labels erst zur Laufzeit zu erzeugen. Wie Du das machst, steht im Abschnitt "Vom Designer generierter Code". Das kannst Du in eigene Prozeduren übertragen, etwa so:
for (int i0 = 0; i0 < MyPanel.Controls.Count; i0++) {
if (MyPanel.Controls[x0] is Label) { MyPanel.Controls[x0].Visible = true; } } // oder direkt für ein bestimmtes Control: MyPanel.Controls["Label8"].Visible = true;
Code:
Viel Erfolg! Jürgen
private void CreateLabel(string name, string caption, int left, int top) {
// deklarieren und erzeugen Label newLabel = new Label(); // Eigenschaften zuweisen newLabel.Name = name; newLabel.Text = caption; newLabel.Width = 60; newLabel.Height = 13; newLabel.Left = left; newLabel.Top = top; // dem Panel oder Form zuweisen MyPanel.Controls.Add(newLabel); } PS. Ich hoffe, es gelingt Dir selbst, den Code in Delphi-Schreibweise zu übersetzen. Wenn ich das machen will, dauert es länger und dürfte fehlerhaft sein. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz