![]() |
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) ); |
Re: hDC überzeichnet zu unbestimmten zeiten alles
Vielleicht liegt es an der Füllfunktion
Delphi-Quellcode:
ExtFloodFill(A_DC, AStartX,AStartY,APenColor,FLOODFILLBORDER);
|
Re: hDC überzeichnet zu unbestimmten zeiten alles
Nein dann würde mein programm ja schon anfangan falsch füllen bzw alles überzeichnen...
|
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:
- 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. |
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 |
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:
natürlich das Rechteck größer, als den zu füllen Kreis/Bereich
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); ist dann eines der Rechtecke gefüllt, dann hast du schon den Ursprung eingegrenzt |
Re: hDC überzeichnet zu unbestimmten zeiten alles
Zitat:
|
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); |
Re: hDC überzeichnet zu unbestimmten zeiten alles
keiner eine idee ?
|
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 16:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz