AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Durch Array mehrere Label auf visible setzen

Ein Thema von Mr_Rollercoaster · begonnen am 13. Jul 2007 · letzter Beitrag vom 16. Jul 2007
Antwort Antwort
Mr_Rollercoaster

Registriert seit: 25. Mai 2007
Ort: Mechernich
9 Beiträge
 
#1

Durch Array mehrere Label auf visible setzen

  Alt 13. Jul 2007, 11:20
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:
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
  Mit Zitat antworten Zitat
Mr_Rollercoaster

Registriert seit: 25. Mai 2007
Ort: Mechernich
9 Beiträge
 
#2

Re: Durch Array mehrere Label auf visible setzen

  Alt 16. Jul 2007, 08:05
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Durch Array mehrere Label auf visible setzen

  Alt 16. Jul 2007, 08:07
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Mr_Rollercoaster

Registriert seit: 25. Mai 2007
Ort: Mechernich
9 Beiträge
 
#4

Re: Durch Array mehrere Label auf visible setzen

  Alt 16. Jul 2007, 11:07
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
  Mit Zitat antworten Zitat
markusj

Registriert seit: 9. Dez 2005
Ort: Kandel
408 Beiträge
 
#5

Re: Durch Array mehrere Label auf visible setzen

  Alt 16. Jul 2007, 11:11
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
Markus
  Mit Zitat antworten Zitat
Jürgen Thomas

Registriert seit: 13. Jul 2006
Ort: Berlin
750 Beiträge
 
#6

Re: Durch Array mehrere Label auf visible setzen

  Alt 16. Jul 2007, 11:52
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.
#D mit C# für NET, dazu Firebird
früher: Delphi 5 Pro, Delphi 2005 Pro mit C# (also NET 1.1)
Bitte nicht sauer sein, wenn ich mich bei Delphi-Schreibweisen verhaue; ich bin inzwischen an C# gewöhnt.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:42 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