Autor Beitrag
thore.fiedermann
Hält's aus hier
Beiträge: 5

Win XP, WIN Vista

BeitragVerfasst: Mi 24.06.09 08:38 
Ich habe eine Windows Form, die ich bei Erzeugung mit recht vielen Pictureboxen bestücke. Diese Pictureboxen laden einige Bilder im *.PNG-Format. Dies benutze ich wegen der Transparenten Anteile un der Dateigröße wegen. Allerdings habe ich das gleiche Problem bei Bildern im BMP, GIF und JPG - Format.
(Projekt: HMI)

Problem dabei ist, dass die Elemente auf der Form beim Anzeigen ganz unschön aufpoppen. Erstens dauert der Aufbau schon recht lange und zweitens sind diese leeren weißen Vierecke der Pictureboxen auch häßlich.

Ich habe im Netz schon nach den verschiedensten Möglichkeiten gesucht das ganze zu beschleunigen: DoubleBuffered, SuspendLayout, Ich habe das Fenster erst unsichtbar gemacht und wollte es nach der Objekterzeugung anzeigen, Ich habe das Fenster weit außerhalb des sichtbaren Bereiches erzeugt und dann verschoben, etc. Ich habe mir auch alle Forumbeiträge was das Zeichnen auf eine Form und in Pictureboxen angeht angeguckt und keine Lösung gefunden. Die Geschwindigkeit ändert sich auch mit dem Release Build ohne Debugger nicht!

Das gleiche Problem stellt sich bei meinem Testprojekt (Projekt: TestLabels). Ich plaziere darauf 5000 Labels (ist auch bei kleineren Zahlen schon sichtbar) und zeige diese nur an und die Aufbauzeiten des Formulars sind der Horror.

Ich habe zum Testen meine beiden Projekte mit angehängt. Es wäre schön, wenn ihr Euch bei der Lösung des Problems konkret auf diese beziehen könntet damit ich das besser nachvollziehen kann!

Ich bin zwar Programmierer, aber ich habe mir C# selber beigebracht. Vielleicht gibt es ja irgendwo einen Schalter, den ich nur umlegen muss, damit das alles schneller läuft. Schön wäre ein einzeiliger Befehl wie "Project.MachDasAllesSchneller(this);" ;-) Vielen Dank für Eure Mühe!


Hier der Quelltext für meine kleines Testprojekt mit den Labels. Dann braucht ihr Euch das Projekt nicht runterladen. Wichtiger ist mir aber das Projekt "HMI" mit den Pictureboxen. Nur ist hier der Quellcode zu lang:
ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
using System;
using System.Drawing;
using System.Windows.Forms;

namespace testApp
{
  public partial class Form1 : Form
  {
  
    Label[] lblTest = new Label[5000];

    public Form1()
    {
      InitializeComponent();
    }

    private void Form1_Load(object sender , EventArgs e)
    {
      this.Top = 0;
      this.Left = 0;
      this.Width = 1600;
      this.Height = 1200;
    }

    private void button1_Click(object sender , EventArgs e)
    {
      this.Hide(); // Fenster verstecken 
      Random x = new Random();
      for (int i = 0; i < lblTest.GetLength(0); i++)
      {
        lblTest[i] = new Label()
        {
          Visible = true
        , Top = x.Next(1190)
        , Left = x.Next(1500)
        , Height = 15
        , Width = 100
        , Text = x.Next(1000000000).ToString()
        , BackColor = Color.Aquamarine
        , Parent = this
        };
      }
      this.Show(); // Fenster wieder anzeigen
    }
  }
}
Einloggen, um Attachments anzusehen!


Zuletzt bearbeitet von thore.fiedermann am Di 30.06.09 10:46, insgesamt 2-mal bearbeitet
Nemag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 2



BeitragVerfasst: Mi 24.06.09 08:57 
Servus

hab jetzt hier leider kein VS2008 müßte ich dann heute abend mal anschauen.

Wollte quasi auch nur schnell was zu den Bildern mit spez. Ordner sagen.
Du kannst die Bilder auch direkt in die Properties (Resources) mit rein ziehen, dann sind sie fest im Programm oder es gibt die Möglichkeit das du einen eigenen Ordner in deiner Projektmappe anlegst und dort die Bilder hinterlegst und im VS dann die Option "In Ausgabeverzeichnis kopieren" (In Eigenschaften der Datei) setzt.
Dass erspart dir schon mal das Kopieren der Bilder im nachhinein.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 24.06.09 09:42 
Sehr viele Bilder oder Labels sind normalerweise ein Zeichen für ein schlechtes Konzept. :nixweiss:

Ich schaue mir das Projekt gleich einmal an, aber bei so vielen Labels oder so ist ein langsamer Aufbau wohl kaum zu vermeiden.

// EDIT:
Wenn ich mir das so anschaue, dann wäre es wohl sinnvoller, wenn du eine Zeichenfläche nimmst und darauf die Elemente selbst zeichnest. Das geht sicher schneller als viele einzelne PictureBoxen.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Mi 24.06.09 09:53 
siehe auch hier. Jürgen
thore.fiedermann Threadstarter
Hält's aus hier
Beiträge: 5

Win XP, WIN Vista

BeitragVerfasst: Mi 24.06.09 11:03 
Die Bilder sind deshalb in den einzelnen Pictureboxen, weil es sich bei dem Gesamtformular um eine bewegte Prozessgrafik handelt. Sie werden zur Laufzeit immer wieder verschoben. Die Funktion, wenn das Formular einmal geöffnet wurde ist auch einwandfrei. Nur der erste Aufbau ist einfach nur schlecht und für mich irgendwie unbefriediegend!
Nur als Anmerkung: Die Bilder sind in einem extra Unterordner, weil sie bei einem Kunden evtl. ausgetauscht werden müssen. Dafür will und kann ich aber nicht immer eine neue EXE zur Verfügung stellen.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 24.06.09 11:26 
user profile iconthore.fiedermann hat folgendes geschrieben Zum zitierten Posting springen:
Die Bilder sind deshalb in den einzelnen Pictureboxen, weil es sich bei dem Gesamtformular um eine bewegte Prozessgrafik handelt.
Ja, sicher, aber das ändert doch nichts daran, dass man das auch an die entsprechenden Positionen zeichnen kann. :gruebel:

Ich habe das in C# bisher wenig gemacht, aber es wird da sicherlich auch gehen.
Nemag
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 132
Erhaltene Danke: 2



BeitragVerfasst: Mi 24.06.09 11:44 
user profile iconthore.fiedermann hat folgendes geschrieben Zum zitierten Posting springen:

Nur als Anmerkung: Die Bilder sind in einem extra Unterordner, weil sie bei einem Kunden evtl. ausgetauscht werden müssen. Dafür will und kann ich aber nicht immer eine neue EXE zur Verfügung stellen.


Ich sehe es ein ich hab mich vielleicht ein bissel undeutlich ausgedrückt.
Du kannst einen eigenen Ordner in VS anlegen in dem du die Bilder schiebst und bei denen kannst du dein unter Eigenschaften "In Ausgabeverzeichnis kopieren" als Option setzen. Dann wird der Ordner automatisch ins das Debugverzeichnis hinzugefügt... sodass du das nicht im Anschluss per Hand machen musst.

Aber das nur so am Rande - hat ja mit deinem eigentlichen Problem nicht viel zu tuen.
thore.fiedermann Threadstarter
Hält's aus hier
Beiträge: 5

Win XP, WIN Vista

BeitragVerfasst: Mi 24.06.09 12:19 
Ich habe leider bei Durchsicht der Nutzungbedingungen der Forenregeln übersehen, dass Crossposts nicht gestattet sind.
Ich wollte, wie ich in einem anderem Forum bereits gesagt habe, nur eine möglichst breite Entwicklergemeinde ansprechen, weil ich wie gesagt nicht davon ausgehe dass alle Leute an allen Foren angemeldet sind.
Mein Fehler! Ich bitte das zu entschuldigen!

@jaenicke: Ich kann natürlich auch die einzelnen Bilder in eine großes malen. Aber bei der Aktualisierung von einem kleinen Teil des Bildes, müsste ich dann ja das ganze Bild neu zeichnen?! Bei einer Aktualisierung von bis zu 3 Mal die Sekunde würde das doch dann zu lange dauern. Außerdem brauch ich die einzelnen Click-Ereignisse der Pictureboxen für Einstellungen.

@Nemag: Danke für den Hinweis! Funktioniert einwandfrei! Schon wieder was gelernt!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 24.06.09 12:28 
user profile iconthore.fiedermann hat folgendes geschrieben Zum zitierten Posting springen:
dass Crossposts nicht gestattet sind.
Gestattet schon (hier jedenfalls), aber damit man ggf. schauen kann, ob man gerade genau das selbe schreiben will wie im anderen Forum schon jemand geschrieben hat, musst du die verlinken. Wäre doch blöd, wenn man sich unnötig Mühe macht. ;-)

user profile iconthore.fiedermann hat folgendes geschrieben Zum zitierten Posting springen:
@jaenicke: Ich kann natürlich auch die einzelnen Bilder in eine großes malen. Aber bei der Aktualisierung von einem kleinen Teil des Bildes, müsste ich dann ja das ganze Bild neu zeichnen?!
Nein, der Ausschnitt reicht ja. Prinzipiell musst du dir vor Augen führen, dass ja das, was du speziell für deinen Zweck optimieren kannst, mit visuellen Komponenten allgemein stattfinden muss.
Und das gibt entsprechenden Overhead...

user profile iconthore.fiedermann hat folgendes geschrieben Zum zitierten Posting springen:
Außerdem brauch ich die einzelnen Click-Ereignisse der Pictureboxen für Einstellungen.
Das muss man eben umrechnen, also schauen wo die Maus beim Klick gerade war.
Ich habe das in C# bisher nicht gemacht, es wird dort aber sicher auch gehen.

Ich weiß nicht, ob du die Sprache Delphi kennst, aber die Syntax ist ja ein wenig ähnlich. Du kannst dir ja einmal dieses Projekt von mir anschauen:
www.delphi-forum.de/viewtopic.php?p=557541
Dort arbeite ich nur mit einer großen Zeichenfläche (und ohne Bilder). Vielleicht zeigt dir das wie ich es meine. ;-)
thore.fiedermann Threadstarter
Hält's aus hier
Beiträge: 5

Win XP, WIN Vista

BeitragVerfasst: Di 30.06.09 10:42 
Zitat:
Dort arbeite ich nur mit einer großen Zeichenfläche (und ohne Bilder).

Das Problem bei dem Ganzen ist, dass ich die Bilder ja brauche. Die sind von einem Designer vorgegeben worden und ich muss sie verwenden.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 30.06.09 10:45 
Du kannst ja die Bilder auch zeichnen, das war ja nur ein Beispiel.

Ich sollte vielleicht einmal in C# das selbst ausprobieren wie gut sich das Prinzip von Delphi auf C# übertragen lässt. Ich hätte eigentlich gedacht, dass das relativ einfach wäre. Mal schauen... :gruebel: