Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi hDC überzeichnet zu unbestimmten zeiten alles (https://www.delphipraxis.net/151410-hdc-ueberzeichnet-zu-unbestimmten-zeiten-alles.html)

Kytrix 17. Mai 2010 03:14


hDC überzeichnet zu unbestimmten zeiten alles
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi ich habe ein inzwischen etwas größeres projekt in dem ich alle objekte per hand zeichne was auch wunderbar funktioniert bis irgendwann zu einem zufälligen zeitpunkt der komplette berreich mit einer meiner verwendeten farben gefüllt wird.

aber da dies spontan passiert weiß ich auch nicht wo ich ansetzen sollte mit der fehlerssuche ?

Hier mal ein auszug aus einer der zeichenroutinen...

Delphi-Quellcode:
rocedure TOrganismus.Koerper;
Var Winkel, SichtX, SichtY, SichtRichtungI, Prozent: Integer;
    p: Extended;
    R, G: Byte;
begin
  //Kreis
  Winkel:=1;
  APenWidth:=2;
  hPen := CreatePen (APenStyle, APenWidth, APenColor);
  SelectObject(A_DC,hPen);
  MoveToEx(A_DC, AStartX+Round(cos(Pi*Winkel/180)*AGroesse), AStartY+Round(sin(Pi*Winkel/180)*AGroesse) ,NIL );
  for Winkel := 1 to 360 do
  begin
    LineTo(A_DC, AStartX+Round(cos(Pi*Winkel/180)*AGroesse), AStartY+Round(sin(Pi*Winkel/180)*AGroesse) );
  end;
  hBrush:= CreateSolidBrush(ABrushColor);
  SelectObject(A_DC,hBrush);
  ExtFloodFill(A_DC, AStartX,AStartY,APenColor,FLOODFILLBORDER);
  //RichtungsLinie
  APenWidth:=3;
  hPen := CreatePen (APenStyle, APenWidth, clBlack);
  SelectObject(A_DC,hPen);
  MoveToEx(A_DC, AStartX, AStartY, NIL);
  LineTo(A_DC, AStartX+Round(cos(Pi*ASichtRichtung/180)*AGroesse), AStartY+Round(sin(Pi*ASichtrichtung/180)*AGroesse) );
  //Sichtfeld
  APenWidth:=1;
  SetBkMode(A_DC, TRANSPARENT);
  APenStyle:=PS_DOT;
  hPen := CreatePen(APenStyle, APenWidth, clBlack);
  SelectObject(A_DC,hPen);
  SichtX:=AStartX+Round(cos(Pi*ASichtRichtung/180)*AGroesse);
  SichtY:=AStartY+Round(sin(Pi*ASichtRichtung/180)*AGroesse);
  MoveToEx(A_DC, AStartX+Round(cos(Pi*ASichtRichtung/180)*AGroesse), AStartY+Round(sin(Pi*ASichtrichtung/180)*AGroesse), NIL );
  for SichtRichtungI := (ASichtRichtung-(ASichtWinkel div 2)) to (ASichtRichtung+(ASichtWinkel div 2)) do
  begin
    LineTo(A_DC, SichtX+Round(cos(Pi*SichtRichtungI/180)*ASichtWeite), SichtY+Round(sin(Pi*SichtRichtungI/180)*ASichtWeite) );
  end;
  LineTo(A_DC, AStartX+Round(cos(Pi*ASichtRichtung/180)*AGroesse), AStartY+Round(sin(Pi*ASichtrichtung/180)*AGroesse) );

Nred 17. Mai 2010 13:40

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
Vielleicht liegt es an der Füllfunktion

Delphi-Quellcode:
ExtFloodFill(A_DC, AStartX,AStartY,APenColor,FLOODFILLBORDER);

Kytrix 17. Mai 2010 13:45

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
Nein dann würde mein programm ja schon anfangan falsch füllen bzw alles überzeichnen...

himitsu 17. Mai 2010 13:52

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
Also ich denke auch, daß es an den FlodFill liegt.

Eventuell sind ja einige deiner selbstgemalten Kreise nicht richtig geschlossen
(warum überhaupt selber zusammenstückeln und nicht gleich einen Kreis zeichnen lassen? )
Delphi-Quellcode:
for Winkel := 1 to 360 do
begin
  LineTo(A_DC, AStartX+Round(cos(Pi*Winkel/180)*AGroesse), AStartY+Round(sin(Pi*Winkel/180)*AGroesse) );
end;

Zitat:

aber da dies spontan passiert weiß ich auch nicht wo ich ansetzen sollte mit der fehlerssuche ?
Du könntest ja einfach mal Codeteile auskommentieren

- wenn der Fehler immernoch auftritt, dann ist der Fehler wahrscheinlich nicht in diesen Teilen enthalten
(es sei denn es gibt mehrere Fehlerstellen)

dann also weitere Codes auskommentieren (und diesen eventuell wieder aktivieren/dekommentieren)


- tritt der Fehler nicht mehr auf, dann hast du schonmal den Fehler eingegrenzt

nun also den Code wieder stück für Stück aktivieren und auskommentieren, bis am Ende nur noch der Fehlerhafte Code (bzw. der eine efehl) auskommentiert ist.

Kytrix 17. Mai 2010 14:22

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
Weil ich für bestimme Kollisionsberechnungen die koordinaten errechnen muss also kann ich ihn gleich selbst zeichnen... wenn die kreise nicht geschlossen wären würde der fehler ja schon von anfang an bestehen und nicht irgendwann einfach mal auftreten ....

ich bin dabei sachen auszukommentieren

füllen, pie-funktion für die lebensanzeige und die textausgabe habe ich schon auskomentiert und es wird trotzdem irgendwann der ganze berreich mit einer zufällig gewählten farbe (aus denen die ich zum zeichnen nutze) gefüllt... wenn es immer die selbe farbe wäre und immer zum selben zeitpunkt dann wäre das asukommentieren des fehlerhaften berreichs ja kein problem

himitsu 17. Mai 2010 14:51

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
Womöglich könnte es auch mehrere Stellen geben
- jenachdem welche zuerst anfangt "durchzudrehn", bzw. als Letzes gezeichnet wird, ist ja immer nur eine sichtbar, da sie sich ja gegenseitig übermalen.

Im Prinzip brauchst du erstmal nur die FloddFill auszukommensieren.
Am Besten gleich alle und dann Befehl für Befehl wieder aktivieren
und so den/die ensprechenden Befehl(e) erstmal aussortieren.


alternativ könntest du auch mal ein Rechteck um die Floodfill legen, um dessen wirkung zu begrenzen.

Delphi-Quellcode:
MoveTo(A_DC, AStartX-100, AStartY-100);
LineTo(A_DC, AStartX-100, AStartY+100);
LineTo(A_DC, AStartX+100, AStartY+100);
LineTo(A_DC, AStartX+100, AStartY-100);
ExtFloodFill(A_DC, AStartX,AStartY,APenColor,FLOODFILLBORDER);
natürlich das Rechteck größer, als den zu füllen Kreis/Bereich

ist dann eines der Rechtecke gefüllt, dann hast du schon den Ursprung eingegrenzt

Blup 17. Mai 2010 15:23

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
Zitat:

Zitat von Kytrix
Weil ich für bestimme Kollisionsberechnungen die koordinaten errechnen muss also kann ich ihn gleich selbst zeichnen...

Dir ist schon klar das deine Methode einen gefüllten Kreis zu zeichnen deutlich langsamer ist?

Kytrix 17. Mai 2010 15:32

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
Liste der Anhänge anzeigen (Anzahl: 1)
Es kann nicht an der Füllfunktion liegen ....

ich verwende sie garnicht mehr und das selbe ergebis (früher oder später) siehe anhang ....


Wie schnell ich das alles zeichne ist für mich nicht wirklich relevant aber wenn du was besseres für mich hast dann her damit


ich verwende "doublebuffer"
Delphi-Quellcode:
  DC:=GetDC(gEvo.WindowHandle);

  DC_Mem := CreateCompatibleDC(DC);
  BM_Mem := CreateCompatibleBitmap(DC, gEvo.Width, gEvo.Height);
  H_Old := SelectObject(DC_Mem, BM_Mem);
.....
Delphi-Quellcode:
  Brush:= CreateSolidBrush(clWHITE);
  SelectObject(DC_Mem, Brush);
  Pen:= CreatePen(PS_SOLID,10,clPurple);
  SelectObject(DC_Mem, Pen);

  Rectangle(DC_Mem,0,0,gEvo.Width,gEvo.Height); // vielleicht werden die Brushes durcheinander
  MoveToEx(DC_Mem,2,2,NIL);                     // geworfen und so der falsche farbwert angenommen?
  LineTo(DC_Mem,gEvo.Width-2,2);
  LineTo(DC_Mem,gEvo.Width-2,gEvo.Height-2);
  LineTo(DC_Mem,2,gEvo.Height-2);
  LineTO(Dc_Mem,2,2);
  for i := 1 to ProduzentID do
  begin
    Produzent[i].Koerper(DC_Mem);
  end;
  for i := 1 to OrganismusID do
  begin
    Organismus[i].Bewegung(DC_Mem);
  end;
  for i := 1 to ProduzentID do
  begin
    Produzent[i].Kollision;
  end;

  SetBkMode(DC_Mem, TRANSPARENT);
  TextOut(DC_Mem,7,7,PWChar(IntToStr(Frames)+' FpS; '+IntToStr(Sekunden)+' Sek'),10+Length(IntToStr(Frames))+Length(IntToStr(Sekunden)));

  BitBlt(DC, 0, 0, gEvo.Width, gEvo.Height, DC_Mem, 0, 0, SRCCOPY);

Kytrix 18. Mai 2010 10:31

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
keiner eine idee ?

Kytrix 19. Mai 2010 00:41

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
habe die fehlerquelle auf das Doublebuffering isoliert ...
kann mir jemand sagen wie ich doublebuffering richtig benutze ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:55 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