Viele Labels effektiv erstellen und Verwalten - per Code

L0stS0ul

Grünschnabel
Wie lassen sich viele Labels effektiv erstellen und Verwalten - per Code?

Hallihallo!

Ich habe derzeit die (für mich) herausfordernde Aufgabe eine Anwendung mit sehr vielen Labels (und Buttons) zu erstellen.
Ich mache das mit #Develop für den Pocket PC (2003).
Aus obigem Grund kann ich alle Form Objekte nur "per Hand" im Code generieren.

Da ich -wie gesagt- viele solcher Objecte brauche, jedes davon mit den diversen Einstellungen für Schrift, Grösse, Position und Text, gibt das viel (eigentlich unnötigen) Code und wäre daher wohl kaum eine elegante Lösung.

Der einfachste Weg den ich mir vorstellen könnte, wäre per Schleife, da grosse Gruppen von diesen Objekten die gleichen Eigenschaften haben.
Leider habe ich keine Idee wie das funktioniert: Sowohl "execute" als auch "eval" scheinen auf dieser Platform (oder Sprache) nicht zu funktionieren, dabei wäre eine Interpretation eines Strings (gerne auch nur zur Compilezeit, nicht zur Laufzeit) als Befehl die wohl universellste Lösung (auch für mein zweites Problem). Weiters habe ich auch noch nicht herausgefunden, ob oder wie ich ein "Array" von Forms-Objecten erstellen kann.
Obwohl ein universeller Name schöner wäre, wäre diese Lösung nochimmer besser als den Code auszuschreiben.

Dann kommt als zweites Problem noch hinzu, dass ich alle Objekte mit Werten aus einem Textfile füllen muss. Das Format ist noch frei wählbar.

Mein Ansatz dazu wäre gewesen: Labelname %Wert1%, ...
Hier hätte ich mit einem Execute oder Eval den unschätzbaren Vorteil, dass ich per Schleife auslesen kann und gleich weis wo ich was zuweisen muss.
Ansonsten müsste ich jedes Object (jeden Label, jeden Button) per Hardcodierung laden.
Ich müsste also jetzt schon wissen wieviele es gibt und wie sie heissen, was zwar möglich wäre aber auf Grund der Erweiterbarkeit kaum wünschenswert ist.

Soweit ich in Erfahrung bringen konnte, gibt es Eval für C# nur, wenn ich ein wenig Java Code einbinde. Da das ganze natürlich möglichst kompatibel werden soll, würde diese Möglichkeit wegen der fehlenden nativen Unterstützung auf dem PocketPC entfallen.

Wenn mir jemand einen Tip geben könnte, welche einfache Lösung ich hier so geschickt übersehe, so wäre ich sehr dankbar. :)
 
Zuletzt bearbeitet:
Klingt irgendwie alles ein wenig verwirrend!

Du schreibst von vielen Labels die du darstellen musst. Jetzt hat der PocketPC allerdings eine beschränkte Größe, d.h. du kannst ohnehin nicht sehr viele gleichzeitig darstellen, ausser du verwendest Tabs.

Zusätzlich solltest du achten, dass du die Ressourcen des PocketPCs nicht sprengst, da steht nicht unendlich viel Speicher zur Verfügung.

Dein Vorschlag ist eher ungeeignet für das was du machen willst. Du solltest dir entsprechende Objekte (mit Basisobjekt für die gemeinsamen Eigenschaften) erstellen und alles dynamisch anzeigen bzw. auch wieder entsprechend verwerfen.
 
Norbert Eder hat gesagt.:
Klingt irgendwie alles ein wenig verwirrend!

Du schreibst von vielen Labels die du darstellen musst. Jetzt hat der PocketPC allerdings eine beschränkte Größe, d.h. du kannst ohnehin nicht sehr viele gleichzeitig darstellen, ausser du verwendest Tabs.

Das tut mir leid, eine Ungenauigkeit meinerseits: Ja, ich verwende Tabs.

Norbert Eder hat gesagt.:
Zusätzlich solltest du achten, dass du die Ressourcen des PocketPCs nicht sprengst, da steht nicht unendlich viel Speicher zur Verfügung.

Das stimmt natürlich. Ich habe allerdings noch keine Erfahrungswerte am PPC, daher muss ich mal probieren wieviel noch gut funktioniert und mir darüberhinausgehend andere Lösungswege überlegen.

Norbert Eder hat gesagt.:
Dein Vorschlag ist eher ungeeignet für das was du machen willst. Du solltest dir entsprechende Objekte (mit Basisobjekt für die gemeinsamen Eigenschaften) erstellen und alles dynamisch anzeigen bzw. auch wieder entsprechend verwerfen.

So wie ich das verstehe, ist ein Control-Array angebracht?
 
Ein "Control-Array" hast du ohnehin -> die Form.Controls-Auflistung. Das was ich meine, ist, dass du die Controls eventuell zur Laufzeit erstellst. Je nachdem was vom Benutzer ausgewählt wurde. Ebenso die "alten" Labels wieder entfernen, damit diese aus dem Speicher entfernt werden können.
 
Norbert Eder hat gesagt.:
Ein "Control-Array" hast du ohnehin -> die Form.Controls-Auflistung.

Kann ich damit Objecte erstellen oder nur Auflisten und evt zugreifen?

Norbert Eder hat gesagt.:
Das was ich meine, ist, dass du die Controls eventuell zur Laufzeit erstellst. Je nachdem was vom Benutzer ausgewählt wurde. Ebenso die "alten" Labels wieder entfernen, damit diese aus dem Speicher entfernt werden können.

In meiner Anwendung werden die Labels paarweise auftreten: ein Caption und ein Value. Caption gibt eine Beschreibung des Wertes an: zB Label1: Temperatur:, Label2: 28°
Diese Werte sich größtenteils statisch. Sie werden entweder am Anfang aus Grundwerten berechnet, oder von Datei geladen.
Es ist zu erwarten, dass die Tabs "schnell" durchgeblättert werden, um Informationen (ungezielt) zu suchen: Ladezeiten im Sekundenbereich sind also nicht zu tolerieren.
Auf jedem Tab werden in etwa 40-50 Labels sein, davon die Hälfte anklickbar (System.EventHandler(ClickHandler)) mit Popup.
Wieviele Tabs es geben wird steht noch nicht fest, dürften allerdings nicht mehr als 10 werden.

6-8 MB Hauptspeicher könn(t)en für dieses Programm verwendet werden, kann das noch funktionieren?
 
L0stS0ul hat gesagt.:
Kann ich damit Objecte erstellen oder nur Auflisten und evt zugreifen?
Jeder Container im .NET (Compact) Framework hat eine Components und eine Controls-Auflistung. Wird nun in diesem Container (zb. eine Form, ein Panel, oder eben einer TabPage) Controls erstellt (im Designer), werden diese automatisch der Controls-Auflistung hinzugefügt und es kann darüber zugegriffen werden. Werden Controls via Sourcecode erstellt, müssen diese der Controls-Auflistung des entsprechenden Containers hinzugefügt werden, um sichtbar zu sein.
L0stS0ul hat gesagt.:
In meiner Anwendung werden die Labels paarweise auftreten: ein Caption und ein Value. Caption gibt eine Beschreibung des Wertes an: zB Label1: Temperatur:, Label2: 28°
Diese Werte sich größtenteils statisch. Sie werden entweder am Anfang aus Grundwerten berechnet, oder von Datei geladen.
Alles klar.
L0stS0ul hat gesagt.:
Es ist zu erwarten, dass die Tabs "schnell" durchgeblättert werden, um Informationen (ungezielt) zu suchen: Ladezeiten im Sekundenbereich sind also nicht zu tolerieren.
Auf jedem Tab werden in etwa 40-50 Labels sein, davon die Hälfte anklickbar (System.EventHandler(ClickHandler)) mit Popup.
Wieviele Tabs es geben wird steht noch nicht fest, dürften allerdings nicht mehr als 10 werden.

6-8 MB Hauptspeicher könn(t)en für dieses Programm verwendet werden, kann das noch funktionieren?
Ja, das sollte schon funktionieren. Jedoch ist wirklich anzuraten, mit Ressourcen zu sparen. Eventuell können bestimmte Daten zusammengelegt werden (wenn es Sinn macht). Auf jeden Fall würde ich das zuerst mit unsinnigen Daten testen bevor du es ausprogrammierst. Normalerweise sollte es keine Probleme machen. Jedoch ist das Design schon recht wichtig, wenn soviele unterschiedliche Daten angezeigt werden müssen.

Für so einen PDA finde ich persönlich 10 Tabs mit vielen Labels drauf, dann schon sehr überladen und unübersichtlich. Aber wenn es sich nicht anders lösen läßt, dann musst du versuchen den besten Weg zu finden.
 
Norbert Eder hat gesagt.:
Jeder Container im .NET (Compact) Framework hat eine Components und eine Controls-Auflistung. Wird nun in diesem Container (zb. eine Form, ein Panel, oder eben einer TabPage) Controls erstellt (im Designer), werden diese automatisch der Controls-Auflistung hinzugefügt und es kann darüber zugegriffen werden. Werden Controls via Sourcecode erstellt, müssen diese der Controls-Auflistung des entsprechenden Containers hinzugefügt werden, um sichtbar zu sein.

Das bedeutet ich kann nicht mit Boardmitteln innerhalb von ein paar Zeilen ca. 50 Labels erstellen (von mir aus auch ohne Text)? (Hier trauere ich immernoch VB6.0 nach, wo ich ohne Probleme mehrere Instanzen von einem Feld haben konnte und durch den Index alle bequem per Schleife einstellen und befüllen konnte).

Norbert Eder hat gesagt.:
Ja, das sollte schon funktionieren. Jedoch ist wirklich anzuraten, mit Ressourcen zu sparen. Eventuell können bestimmte Daten zusammengelegt werden (wenn es Sinn macht). Auf jeden Fall würde ich das zuerst mit unsinnigen Daten testen bevor du es ausprogrammierst. Normalerweise sollte es keine Probleme machen. Jedoch ist das Design schon recht wichtig, wenn soviele unterschiedliche Daten angezeigt werden müssen.

Wenn es sich nicht vermeiden lässt Speicher zu sparen, könnte ich mit Heuristiken arbeiten und wenig benutzte Tabs "entladen". Allerdings sehe ich das als letzten Ausweg...
Zusammenlegen ist leider kaum möglich, da die Daten wenig Verbindung untereinander haben.

Norbert Eder hat gesagt.:
Für so einen PDA finde ich persönlich 10 Tabs mit vielen Labels drauf, dann schon sehr überladen und unübersichtlich. Aber wenn es sich nicht anders lösen läßt, dann musst du versuchen den besten Weg zu finden.

Ich hoffe stark nicht soviele zu brauchen. 10 ist mehr als Obergrenze zu sehen, aber ich kann noch nicht sagen ob ich wirklich soviele brauchen werde.

:offtopic:

(1) Was mich in dem Zusammenhang noch interessiert: Kann ich die Grösse eines Labels bei gegebenem Inhalt "optimieren" (sprich: so klein wie möglich halten) ohne dabei etwas abzuschneiden - und das ganze noch per Algorithmus? Also ohne dass ich mir jedes Feld ansehen muss und abschätze wieviel kleiner oder grösser es sein kann/muss?

Ich habe versucht das über die Buchstabenzahl zu lösen, das funktioniert allerdings aufgrund der unterschiedlichen Buchstabenbreite nicht gut (Bsp: brille, mamma).

(2) Was ist der einfachste Weg den Font Style eines Labels zu verändern?
MyLabel.Font.Style = System.Drawing.FontStyle.Underline; Scheint intuitiv, aber geht nicht, da Font.Style Readonly sind.

Da ich die Schriftart und Grösse nicht verändern will, wäre die einzige andere Lösung, die mir gerade einfällt, alle Fontbezogenen Werte auszulesen, in ein neues Font Object einzufügen und das dann dem Label zuzuweisen? Das geht doch bestimmt auch einfacher?
 
Zuletzt bearbeitet:
Gibt es keine Listcontrols oder Gridcontrols für Pocket PC ?
So, wie sich das hier anhört ist, das genau ein Fall für eine Liste.
 
L0stS0ul hat gesagt.:
Das bedeutet ich kann nicht mit Boardmitteln innerhalb von ein paar Zeilen ca. 50 Labels erstellen (von mir aus auch ohne Text)? (Hier trauere ich immernoch VB6.0 nach, wo ich ohne Probleme mehrere Instanzen von einem Feld haben konnte und durch den Index alle bequem per Schleife einstellen und befüllen konnte).

Dazu habe ich nun doch etwas gefunden :)
Es ist doch möglich Control-Arrays in C# zu benutzen, allerdings muss man sich selber eine Klasse erstellen.
Bei MS gibt es einen Artikel, der beschreibt wie man das macht: Howto (Microsoft)
Hier scheint es sie bereits fertig zu geben (Ohne Gewähr, ich habe die obere Version verwendet.)
Folgende Probleme "verfolgen" mich derzeit nochimmer:

L0stS0ul hat gesagt.:
(1) Was mich in dem Zusammenhang noch interessiert: Kann ich die Grösse eines Labels bei gegebenem Inhalt "optimieren" (sprich: so klein wie möglich halten) ohne dabei etwas abzuschneiden - und das ganze noch per Algorithmus? Also ohne dass ich mir jedes Feld ansehen muss und abschätze wieviel kleiner oder grösser es sein kann/muss?

Ich habe versucht das über die Buchstabenzahl zu lösen, das funktioniert allerdings aufgrund der unterschiedlichen Buchstabenbreite nicht gut (Bsp: brille, mamma).

(2) Was ist der einfachste Weg den Font Style eines Labels zu verändern?
MyLabel.Font.Style = System.Drawing.FontStyle.Underline; Scheint intuitiv, aber geht nicht, da Font.Style Readonly sind.

Da ich die Schriftart und Grösse nicht verändern will, wäre die einzige andere Lösung, die mir gerade einfällt, alle Fontbezogenen Werte auszulesen, in ein neues Font Object einzufügen und das dann dem Label zuzuweisen? Das geht doch bestimmt auch einfacher?

Übrigens: Danke für die Hilfe bisher!

mfg, L0stS0ul
 
mage hat gesagt.:
Gibt es keine Listcontrols oder Gridcontrols für Pocket PC ?
So, wie sich das hier anhört ist, das genau ein Fall für eine Liste.

Sieht nach einer sehr, sehr viel einfacheren Lösung aus, als ich das derzeit mit meinen Labels habe :D
Ich vermute das löst viele meiner Label-Probleme.

Danke! :)
 
Zurück