Forum: PC-Programmierung Label gleichzeitg refreshen


von Falk (Gast)


Lesenswert?

angenommen ich habe 20 labels und setze deren visible-eigenschaft per 
knopfdruck alle auf false, dann sind alle labels auf einem klick 
verschwunden. setze ich deren visible-eigenschaft nun per knopfdruck 
alle wieder auf true, so baut sich jedes label einzeln auf, selbst wenn 
diese nicht verändert wurden.
gibt es eine möglichkeit alle labels auf einmal anzeigen zu lassen?

von Chris .. (dechavue)


Lesenswert?

Hi,

Hieraus:Beitrag "Visual Basic Grafikaufbau sehr langsam" schließe ich, dass 
du immernoch mit VB.Net arbeitest.

Hier könntest du mal SuspendLayout + ResumeLayout versuchen.
(http://msdn.microsoft.com/de-de/library/system.windows.forms.control.suspendlayout(VS.80).aspx)

greets

von Falk (Gast)


Lesenswert?

danke für deine antwort,

leider haben die methoden "SuspendLayout" und "ResumeLayout" nicht das 
Problem behoben oder ich benutze diese falsch....

hier mal mein code in VB.Net beim knopfdruck...

me.Suspendlayout()

for i=0 to 19

     me.label(i).visible = true

next

me.ResumeLayout()


die labels bauen sich nach wie vor nacheinander auf.
kennt jemand weiteren rat?

von Chris .. (dechavue)


Lesenswert?

Hi,

Schade, einen Vesuch wars wert, ich war mir nicht mehr sicher ob dadurch 
nur die Layout- oder auch die Zeichenlogik gestoppt wird.

Ich denke, du hast schlicht und ergreifend zu viele Controls auf deinem 
Form.
Ich habe es mit 200 Labels getestet und diese erscheinen/verschwinden 
alle gleichzeitig.

Was du noch versuchen könntest, ist die Labels in ein Panel 
zusammensufassen und dieses anzeigen/verstecken.

Als wirklich Dirty-Hack um das anzeigen etwas zu beschleunigen kannst du 
die unsichtbaren Labels mit Control.Remove zu entfernen, ihre Visible 
auf true setzten und sie mit Control.AddRange auf einen Schlag wieder 
hinzuzufügen.
Das bewirkt, dass das ganze zwar zeitverzögerter aber dann auf einen 
Schlag kommt (getestet mit 1000 Labels)

Ich würde dir aber dringend raten, die Anzahl deiner Controls zu 
vermindern, bzw Teile in eigene (User)Controls zusammenzufassen.

von Entlöter (Gast)


Lesenswert?

Gibts bei VB.NET nicht auch die Property
frmXYZ.DoubleBuffered = true;
kann mich schwach daran erinnern.

Auch aus meiner Erinnerung:
DoEvents
Weiß allerdings nicht ob es diese Dinge bei VB.NET noch gibt und ob sie 
in deinem Fall helfen.

von Falk (Gast)


Lesenswert?

vielen dank für deine antwort,


ich weiß jetzt auch woran es liegt das das bild bei mir schon nach 20 
labels anfängt zu flimmern, und zwar am hintergrundbild der form!
wenn ich dieses entferne, dann klappen die oben genannten 
lösungsvorschläge.
nur will ich ungern auf mein hintergrundbild verzichten, hab es auch 
schon soweit wie möglich komprimiert (jpg-datei, 1280x1024 auflösung, ca 
1MB).
gibt es nicht vielleicht eine möglichkeit das bild einmal zu laden und 
dann niewieder?

von Chris .. (dechavue)


Lesenswert?

Im Speicher wird das Bild nach dem Laden unkomprimiert abgelegt, und 
dieses verhältnismäsig große Bild (~5MB) muss bei jedem Neuzeichnen 
(jedem Ändern einer visible) komplett neu gezeichnet werden.
Als einfachste Möglichkeit könntest du versuchen, vor deiner Schleife 
zum Ändern der Visibles das Hintergrundbild zu entfernen und es danach 
neu zu setzten, das reduziert die Anzahl der Zeichenvorgänge des Bildes 
auf 1x pro Visiblegruppe.
Sollte es dadurch zu sehr flackern, kannst du noch versuchen 
DoubleBufferd einzuschalten.
Eine weitere Lösung wäre, das Bild in Segmente aufzuteilen, welche du im 
OnPaintBackground mit e.Graphics.Drawimage zeichnest, dort kannst du 
meines wissens auch prüfen welcher Teil gezeichnet werden muss, und dann 
nur die jeweiligen Segmente zeichnen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.