AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi hDC überzeichnet zu unbestimmten zeiten alles
Thema durchsuchen
Ansicht
Themen-Optionen

hDC überzeichnet zu unbestimmten zeiten alles

Ein Thema von Kytrix · begonnen am 17. Mai 2010 · letzter Beitrag vom 19. Mai 2010
Antwort Antwort
Seite 1 von 2  1 2      
Kytrix

Registriert seit: 26. Nov 2007
54 Beiträge
 
#1

hDC überzeichnet zu unbestimmten zeiten alles

  Alt 17. Mai 2010, 03:14
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) );
Angehängte Dateien
Dateityp: zip proj_gevo_113.zip (380,0 KB, 8x aufgerufen)
  Mit Zitat antworten Zitat
Nred

Registriert seit: 17. Mai 2010
1 Beiträge
 
#2

Re: hDC überzeichnet zu unbestimmten zeiten alles

  Alt 17. Mai 2010, 13:40
Vielleicht liegt es an der Füllfunktion

ExtFloodFill(A_DC, AStartX,AStartY,APenColor,FLOODFILLBORDER);
  Mit Zitat antworten Zitat
Kytrix

Registriert seit: 26. Nov 2007
54 Beiträge
 
#3

Re: hDC überzeichnet zu unbestimmten zeiten alles

  Alt 17. Mai 2010, 13:45
Nein dann würde mein programm ja schon anfangan falsch füllen bzw alles überzeichnen...
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#4

Re: hDC überzeichnet zu unbestimmten zeiten alles

  Alt 17. Mai 2010, 13:52
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Kytrix

Registriert seit: 26. Nov 2007
54 Beiträge
 
#5

Re: hDC überzeichnet zu unbestimmten zeiten alles

  Alt 17. Mai 2010, 14:22
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.142 Beiträge
 
Delphi 12 Athens
 
#6

Re: hDC überzeichnet zu unbestimmten zeiten alles

  Alt 17. Mai 2010, 14:51
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: hDC überzeichnet zu unbestimmten zeiten alles

  Alt 17. Mai 2010, 15:23
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?
  Mit Zitat antworten Zitat
Kytrix

Registriert seit: 26. Nov 2007
54 Beiträge
 
#8

Re: hDC überzeichnet zu unbestimmten zeiten alles

  Alt 17. Mai 2010, 15:32
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);
Angehängte Dateien
Dateityp: exe proj_gevo_551.exe (838,5 KB, 4x aufgerufen)
  Mit Zitat antworten Zitat
Kytrix

Registriert seit: 26. Nov 2007
54 Beiträge
 
#9

Re: hDC überzeichnet zu unbestimmten zeiten alles

  Alt 18. Mai 2010, 10:31
keiner eine idee ?
  Mit Zitat antworten Zitat
Kytrix

Registriert seit: 26. Nov 2007
54 Beiträge
 
#10

Re: hDC überzeichnet zu unbestimmten zeiten alles

  Alt 19. Mai 2010, 00:41
habe die fehlerquelle auf das Doublebuffering isoliert ...
kann mir jemand sagen wie ich doublebuffering richtig benutze ?
  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 14:09 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