AGB  ·  Datenschutz  ·  Impressum  







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

Image zeichnet nicht immer

Ein Thema von LiS · begonnen am 2. Jun 2007 · letzter Beitrag vom 3. Jun 2007
Antwort Antwort
Seite 1 von 2  1 2      
LiS

Registriert seit: 3. Dez 2004
87 Beiträge
 
Turbo Delphi für Win32
 
#1

Image zeichnet nicht immer

  Alt 2. Jun 2007, 16:47
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
  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
243 Beiträge
 
Delphi 12 Athens
 
#2

Re: Image zeichnet nicht immer

  Alt 2. Jun 2007, 18:39
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.
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Image zeichnet nicht immer

  Alt 2. Jun 2007, 19:41
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: Image zeichnet nicht immer

  Alt 2. Jun 2007, 20:01
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?
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Image zeichnet nicht immer

  Alt 2. Jun 2007, 21:33
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
243 Beiträge
 
Delphi 12 Athens
 
#6

Re: Image zeichnet nicht immer

  Alt 3. Jun 2007, 13:44
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...
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Image zeichnet nicht immer

  Alt 3. Jun 2007, 13:59
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
243 Beiträge
 
Delphi 12 Athens
 
#8

Re: Image zeichnet nicht immer

  Alt 3. Jun 2007, 14:05
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...
  Mit Zitat antworten Zitat
LiS

Registriert seit: 3. Dez 2004
87 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Image zeichnet nicht immer

  Alt 3. Jun 2007, 15:09
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!
  Mit Zitat antworten Zitat
Benutzerbild von mischerr
mischerr

Registriert seit: 6. Feb 2004
Ort: Konz
243 Beiträge
 
Delphi 12 Athens
 
#10

Re: Image zeichnet nicht immer

  Alt 3. Jun 2007, 15:15
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:29 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