AGB  ·  Datenschutz  ·  Impressum  







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

Paintbox flackert

Ein Thema von delphi-n · begonnen am 10. Okt 2009 · letzter Beitrag vom 10. Okt 2009
Antwort Antwort
delphi-n

Registriert seit: 6. Sep 2009
88 Beiträge
 
#1

Paintbox flackert

  Alt 10. Okt 2009, 13:48
Hi!

Ich hab eine procedure "zeichnen". Sie wird alle 200 millisec aufgerufen.
Diese funktioniert auch, und ist folgendermaßen aufgebaut:


Delphi-Quellcode:
procedure TForm2.Zeichnen;
var x,y,z: integer;
begin
PaintBox1.Refresh; //löschen der Paintbox
    for z:=0 to 9 do //zeichen kleinerer Objekte (der hintergrund ist auf einem anderen Image)
    begin
        for x:=0 to 14 do
        begin
            for y:=0 to 14 do
            begin
            if Q[x,y,z]=1 then
            PaintBox1.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+131+Aposz*15-Aposy*15+Ba, Image11.Picture.Graphic);
            if Q[x,y,z]=2 then
            PaintBox1.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15+Bb, Image2.Picture.Graphic);
            if Q[x,y,z]=3 then
            PaintBox1.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image3.Picture.Graphic);
            if Q[x,y,z]=4 then
            PaintBox1.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image4.Picture.Graphic);
            if Q[x,y,z]=5 then
            PaintBox1.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image5.Picture.Graphic);
            if Q[x,y,z]=6 then
            PaintBox1.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image7.Picture.Graphic);
            if Q[x,y,z]=7 then
            PaintBox1.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image8.Picture.Graphic);
            if Q[x,y,z]=8 then
            PaintBox1.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image9.Picture.Graphic);
            if Q[x,y,z]=9 then
            PaintBox1.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image10.Picture.Graphic);


            end;
        end;
    end;

end;
Leider flackert das alles (wegen der Zeit zwischen löschen und neu zeichnen).
Nun hatte ich gehört, dass es besser wär alles erstmal aufzubauen, und das fertige bild in ein image oder eine Paintbox zu kopieren.
Da die PaintBox aber kein Bildspeicher hat, habe ich ein Image genommen. Leider kommen fehler.



Delphi-Quellcode:
procedure TForm2.Zeichnen;
var x,y,z: integer;
begin
PaintBox1.Refresh; //löschen des paintbox-inhalts
Image14.Picture.Destroy; //löschen des Image-inhaltes
Image14.Canvas.Draw(0,0, Image1.Picture.Graphic); //zeichnen des hintergrundes auf das image //hier kommt der Fehler s.u.
    for z:=0 to 9 do //zeichen kleinerer objekte
    begin
        for x:=0 to 14 do
        begin
            for y:=0 to 14 do
            begin
            if Q[x,y,z]=1 then
            Image14.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+131+Aposz*15-Aposy*15+Ba, Image11.Picture.Graphic);
            if Q[x,y,z]=2 then
            Image14.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15+Bb, Image2.Picture.Graphic);
            if Q[x,y,z]=3 then
            Image14.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image3.Picture.Graphic);
            if Q[x,y,z]=4 then
            Image14.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image4.Picture.Graphic);
            if Q[x,y,z]=5 then
            Image14.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image5.Picture.Graphic);
            if Q[x,y,z]=6 then
            Image14.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image7.Picture.Graphic);
            if Q[x,y,z]=7 then
            Image14.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image8.Picture.Graphic);
            if Q[x,y,z]=8 then
            Image14.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image9.Picture.Graphic);
            if Q[x,y,z]=9 then
            Image14.Canvas.Draw(PaintBox1.Left+224+Aposx*30-Aposz*15, PaintBox1.Top+152+Aposz*15-Aposy*15, Image10.Picture.Graphic);


            end;
        end;
    end;
 Image13.Canvas.Draw(0,0,Image14.Picture.Graphic); //kopieren des gesamtbildes auf das für den nutzer sichbare image
end;

diese fehler kommen:

Zitat:
---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt Project1.exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 42F82B68. Lesen von Adresse 42F82B68'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen.
---------------------------
OK Hilfe
---------------------------




---------------------------
Project1
---------------------------
Zugriffsverletzung bei Adresse 42F82B68. Lesen von Adresse 42F82B68.
---------------------------
OK
---------------------------



---------------------------
Anwendungsfehler
---------------------------
Exception EExternalException in Modul Project1.exe bei 00A47501.

Externe Exception C000001D.


---------------------------
OK
---------------------------

Ich hoffe ihr könnt mir weiterhelfen.

Vielen Dank schon mal,
Delphi-n
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#2

Re: Paintbox flackert

  Alt 10. Okt 2009, 13:54
Das OnPaint-Ereignis ist Dir aufgefallen? Was könnte man dort wohl machen? Und Image14.Picture.Destroy; //Destroy sollte niemals direkt aufgerufen werden ist eine ganz schlechte Idee, damit löschst Du das enthaltene Grafik-Objekt, ohne es auf nil zu setzen, deshalb knallt es beim 2. Aufruf.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Paintbox flackert

  Alt 10. Okt 2009, 13:56
Zitat von delphi-n:
Hi!
Leider flackert das alles (wegen der Zeit zwischen löschen und neu zeichnen).
Was auch noch helfen könnte, ist doublebuffered:=true zu setzen.
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#4

Re: Paintbox flackert

  Alt 10. Okt 2009, 14:10
Ja könnte man, aber das hilft nicht im obigen Fall des Quelltextes.
Da gibt es so einige, sagen wir mal Fehlerlein.

Delphi-Quellcode:
var x,y,z: integer;
begin
PaintBox1.Refresh; //löschen der Paintbox
Ja, löschen in dem man die Paintbox dazu zwingt sich selbst neu zu Zeichnen.
Man nehme ein Canvas.Fillrect(PaintBoxX.Clientrect); und gut.

Image14.Picture.Destroy; //löschen des Image-inhaltes Wie schon beschrieben, Image14.Free; //löschen des Image-Inhaltes wäre angebracht.

Besser noch folgendes:
if ASSIGNED(Image14) then Image1.Free;
Des weiteren würde ich mich von den Images verabschieden und gleich mit Bitmaps (TBitmap) arbeiten.
Hier wäre ein Delphi-Referenz durchsuchenOffscreenbitmap angebracht, auf das man alles vor zeichnet um es danach
anzuzeigen.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#5

Re: Paintbox flackert

  Alt 10. Okt 2009, 14:16
Hier schnell ein Beispiel (hab mal eben Lazarus unter Win7 installiert ):
Delphi-Quellcode:
const Colors: array[0..3] of TColor = (clRed, clBlue, clYellow, clGreen);

procedure TForm1.FormPaint(Sender: TObject);
var tempBMP: TBitmap;
begin
  tempBMP := TBitmap.Create;
  try
    tempBMP.Width := 100;
    tempBMP.Height := 100;
    tempBMP.Canvas.Brush.Color := Colors[FIndex];
    tempBMP.Canvas.FillRect(Classes.Rect(0,0,tempBMP.Width, tempBMP.Height));
    BitBlt(self.Canvas.Handle,10,10,tempBMP.Width,tempBMP.Height,tempBMP.Canvas.Handle,0,0,SRCCOPY);
  finally
    tempBMP.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  inc(FIndex);
  if FIndex > High(Colors) then
    FIndex := Low(Colors);
  invalidate;
end;
[edit] FIndex ist ein privates Integer-Feld, bevor noch Fragen dazu kommen [/edit]
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Paintbox flackert

  Alt 10. Okt 2009, 14:19
Das ist aber auch nur halb zu Ende gedacht. Das Beispiel aus der Code-Lib ist besser.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.619 Beiträge
 
Delphi 12 Athens
 
#7

Re: Paintbox flackert

  Alt 10. Okt 2009, 14:21
Das Beispiel wird er auch sicherlich auf Anhieb kapieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#8

Re: Paintbox flackert

  Alt 10. Okt 2009, 14:23
Zitat:
[edit] FIndex ist ein privates Integer-Feld, bevor noch Fragen dazu kommen [/edit]

Delphi-Quellcode:
var
  private FInteger: array [0..DeddyH] of integer;
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Paintbox flackert

  Alt 10. Okt 2009, 14:25
Ja, das mag ja sein, aber es ist wieder nur so halb gar. Das nützt ihm ja auch nichts.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
delphi-n

Registriert seit: 6. Sep 2009
88 Beiträge
 
#10

Re: Paintbox flackert

  Alt 10. Okt 2009, 14:36
Zitat:
Des weiteren würde ich mich von den Images verabschieden und gleich mit Bitmaps (TBitmap) arbeiten.
Hier wäre ein Delphi-ReferenzOffscreenbitmap angebracht, auf das man alles vor zeichnet um es danach
anzuzeigen.
wie könnte ich denn das obere Beispiel in das aus dem link einfügen? (die weißen kasten in dem roten brauch ich ja nicht)
  Mit Zitat antworten Zitat
Antwort Antwort


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 07:06 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