Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Image zeichnet nicht immer (https://www.delphipraxis.net/93215-image-zeichnet-nicht-immer.html)

LiS 2. Jun 2007 15:47


Image zeichnet nicht immer
 
Hallo!

Ich bin grade an meinem "Wer wird Millionär"-Publikumsjoker. Es sollen die vier Balken auf den Images 'img_Proz1' 'img_Proz2' 'img_Proz3' und 'img_Proz4' mit der Höhe proportianal zur Prozentzahl angezeigt werden, doch seltsamerweise funktioniert das nicht:

Delphi-Quellcode:
procedure TForm1.img_Joker_PClick(Sender: TObject);
var
  Prozente: TProzente;
  i,j,Pixel:integer;
begin
    Publikum(Stufe,Antwort,Prozente);
    for i := 1 to 4 do
    begin
      Pixel := trunc(Prozente[i] * 1.44);
      TImage(Form1.FindComponent('img_Proz'+inttostr(i))).Top := 184 - Pixel;
      TImage(Form1.FindComponent('img_Proz'+inttostr(i))).Height := Pixel;
      TImage(Form1.FindComponent('img_Proz'+inttostr(i))).Canvas.Pen.Color := $000000;
      TImage(Form1.FindComponent('img_Proz'+inttostr(i))).Canvas.FillRect(ClientRect);
      TImage(Form1.FindComponent('img_Proz'+inttostr(i))).Canvas.Pen.Color := $FF0000;
      for j := 0 to Pixel do
      begin
        TImage(Form1.FindComponent('img_Proz'+inttostr(i))).Canvas.MoveTo(0,j);
        TImage(Form1.FindComponent('img_Proz'+inttostr(i))).Canvas.LineTo(27,j);
      end;
      TImage(Form1.FindComponent('img_Proz'+inttostr(i))).Repaint;
    end;
    pnl_Publikum.Visible := true;
end;
Die Funktion Publikum() gibt in dem Array[1..4] of Integer namens Prozente die 4 Prozentzahlen zurück, das konnte ich auch verifizieren. Der Wert von Pixel gibt die Höhe der Säule an, die gerade bearbeitet wird und dieser Wert ist immer korrekt, das habe ich überprüft. Ich habe absolut keine Ahnung wo der Fehler noch stecken könnte...
Wenn man den Joker das allererste Mal nach dem Programmstart benutzt funktioniert er korrekt, doch danach sind die Balken auf dem Bildschirm jedesmal verschoben, nur 1 Pixel hoch (und verschoben) oder gar nicht vorhanden, obwohl sie vorhanden sein müssten!
Es wäre nett, wenn ihr euch das mal anschauen könntet, vielleicht sehe ich ja den Wald vor lauter Bäumen nicht... Vielen Dank schonmal!

MfG Leif

mischerr 2. Jun 2007 17:39

Re: Image zeichnet nicht immer
 
Hallo!

> TImage(Form1.FindComponent('img_Proz'+inttostr(i)) ).Canvas.FillRect(ClientRect);

- ClientRect bezieht sich auf das Form und nicht auf das Image.
- Vor der Zeichenoperation Canvas.Brush.Color und Canvas.Brush.Style setzen, da Pen AFAIK nur für die Umrandung zuständig ist.

Desweiteren...
...nimm doch einfach 1 (..4) Images und zeichne echte, verschiedene, gefüllte Rechtecke. Das würde dann auch die for j - Schleife sparen.
...in obigem Befehl Form1 weglassen oder durch Self ersetzen
...FindComponent weniger oft aufrufen und in einem TComponent zwischenspeichern, welchen ich dann casten würde. Ich halte das so für zu performancelastig. Werden die Images dynamisch bzw. zur Laufzeit erstellt? Wenn nein, dann würde ich die Komponente direkt ansprechen und mir den FindComponent komplett sparen.

3_of_8 2. Jun 2007 18:41

Re: Image zeichnet nicht immer
 
Performancelastig ist es kaum, aber schlechter Stil.

Was wirklich performancelastig ist, ist die Tatsache, dass auf Images gezeichnet wird. Aber für ein sehr einfaches Spiel wie dieses ist das in Ordnung.

Muetze1 2. Jun 2007 19:01

Re: Image zeichnet nicht immer
 
Zitat:

Zitat von 3_of_8
Performancelastig ist es kaum, aber schlechter Stil.

Es wird mit jedem Aufruf erneut die Komponentenliste iteriert mit einem Stringvergleich: wenn das nicht performancelastig ist für dich, was denn?

3_of_8 2. Jun 2007 20:33

Re: Image zeichnet nicht immer
 
Auf ein Image zu zeichnen ist performancelastig. Die paar Stringvergleiche, sind ja nur ein paar wenige Taktzyklen, steckt sogar eine 10 Jahre alte CPU ohne Probleme weg, aber wer 80 mal in der Sekunde wie wahnsinnig auf ein Image zeichnet, zwingt damit auch gerne mal neuerere CPUs in die Knie.

mischerr 3. Jun 2007 12:44

Re: Image zeichnet nicht immer
 
Ich gehe ja mal davon aus, dass hier nicht x-mal pro Sekunde auf ein TImage gezeichnet wird. Für sowas gibt's ja schliesslich die TPaintBox...

3_of_8 3. Jun 2007 12:59

Re: Image zeichnet nicht immer
 
Eine TPaintBox ist auch nicht viel besser. Und wie gesagt: Die paar Stringvergleiche sind kaum ein Problem und machen sich in der Performance kaum bemerkbar. Guter Stil ist es natürlich trotzdem nicht.

mischerr 3. Jun 2007 13:05

Re: Image zeichnet nicht immer
 
Na wenn Dir die Paintbox schon zu performancelastig ist, dann erklär mir doch mal wie man unter Windows überhaupt noch was auf den Bildschirm zaubern soll. Immerhin machen ja die meisten Controls nix anderes als das, was man in der OnPaint-Routine der TPainbox machen sollte: Simple Canvas Operationen...

LiS 3. Jun 2007 14:09

Re: Image zeichnet nicht immer
 
War das echt so eine Sünde von mir, die 180 Linien mal schnell auf ein Image zu zeichnen? Das Bild erscheint bei mir jetzt auch augenblicklich, sobald man klickt... Ich glaub ich wechsel jetzt trotzdem mal zur Paintbox, wusste gar nicht, dass die dafür so viel besser geeignet ist! Und da ich es jetzt ohne FindComponent mache, geht es deswegen auch viel schneller... Danke dafür nochmal!

mischerr 3. Jun 2007 14:15

Re: Image zeichnet nicht immer
 
Aber denkt dran, dass DU bei der Paintbox für das Zeichnen zuständig bist und in jedem OnPaint alles neuzeichnen und ggf auch deine Daten neu ermitteln musst, sofern sie nicht zwischengespeichert sind. Ich würde es mir daher überlegen ob es Sinn macht zu wechseln, oder ob das Image nicht doch die bessere Wahl ist. Hängt halt von der Anwendung ab...

Oder einfach im Speicher auf ein BMP schreiben und dann im OnPaint nur noch ein BitBlt...

Aber viele Wege führen zum Ziel und manchmal lernt man dabei ja auch was. :???:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:43 Uhr.
Seite 1 von 2  1 2      

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