Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Prism Durch Array mehrere Label auf visible setzen (https://www.delphipraxis.net/95798-durch-array-mehrere-label-auf-visible-setzen.html)

Mr_Rollercoaster 13. Jul 2007 10:20


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:
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);
Zur Erklärung (ich weiß nciht ob dies so überhaupt möglich ist):
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:
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;
Das entscheidende ist wohl der Teil:
Delphi-Quellcode:
swfl[lv] := Findcomponent(Format('Beschr%d',nupdolabel[lv])) as System.Windows.Forms.Label;
Diesen habe ich auf einer Win32 Delphi Seite gefunden. Daher funktioniert er leider auch nicht bei .NET, da es FindComponent dort nicht gibt.

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

Mr_Rollercoaster 16. Jul 2007 07:05

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

SirThornberry 16. Jul 2007 07:07

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.

Mr_Rollercoaster 16. Jul 2007 10:07

Re: Durch Array mehrere Label auf visible setzen
 
Zitat:

Zitat von SirThornberry
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.

Danke schonmal für die Antwort! :)

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

markusj 16. Jul 2007 10:11

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

Jürgen Thomas 16. Jul 2007 10:52

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:
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;
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:
Code:
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);
}
Viel Erfolg! Jürgen

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 04:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz