Delphi-PRAXiS
Seite 2 von 2     12   

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)

himitsu 19. Mai 2010 07:37

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
Male in ein TBitMap und zeige über dieses alles im Ganzen an. (entweder direkt auf dem Form.Canvas oder auf einer TPaintBox)
DoubleBuffering kannst'e abschalten.

Luckie 19. Mai 2010 07:39

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
Und hier etwas Beispielcode: http://www.michael-puff.de/Programmi...enBitmap.shtml

Kytrix 19. Mai 2010 16:03

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
jetzt bekomme ich nach ca 50 sekunden diese fehlermeldung
Delphi-Quellcode:
Erste Gelegenheit für Exception bei $75A89617. Exception-Klasse EOutOfResources mit Meldung 'Fehler beim Erstellen des Fenster-Gerätekontexts'. Prozess Proj_gEvo.exe (4780)

Medium 19. Mai 2010 16:37

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
Kein Wunder, wenn du den Code von ganz von oben in einer Schleife laufen lässt. Ich sehe nirgends ein DeleteObject(), weshalb du dir damit die GDI-Ressourcen mit Pens und Brushes volljauchst.

Kytrix 19. Mai 2010 16:46

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
Delphi-Quellcode:
procedure TgEvo.BtStartClick(Sender: TObject);
begin
  Label1.Visible:=False;
  Label2.Visible:=False;
  Label3.Visible:=False;
  Label4.Visible:=False;
  Trackbar1.Visible:=False;
  Trackbar2.Visible:=False;
  Trackbar3.Visible:=False;
  Trackbar4.Visible:=False;
  BtStart.Visible:=false;
  BorderStyle:= bsNone;
  ///FormStyle:= fsStayOnTop;
  BoundsRect:= Monitor.BoundsRect;
  PaintBox.Width:= gEvo.Width;
  PaintBox.Height:= gEvo.Height;
  BMP.Width:= PaintBox.Width;
  BMP.Height:= PaintBox.Height;
  Erzeuge_und_Zeichne;
  Application.OnIdle:=IdleHandler;
end;

procedure TgEvo.FormCreate(Sender: TObject);
begin
  OrganismusID:=0;
  ProduzentID:=0;

  BMP:= TBitMap.Create;
end;

procedure TgEvo.Paint;
Var i: integer;
begin

  Brush:= CreateSolidBrush(clWhite);
  SelectObject(BMP.Canvas.Handle, Brush);
  Pen:= CreatePen(PS_SOLID,10,clPurple);
  SelectObject(BMP.Canvas.Handle, Pen);

  Rectangle(BMP.Canvas.Handle,0,0,gEvo.Width,gEvo.Height);
  MoveToEx(BMP.Canvas.Handle,2,2,NIL);
  LineTo(BMP.Canvas.Handle,gEvo.Width-2,2);
  LineTo(BMP.Canvas.Handle,gEvo.Width-2,gEvo.Height-2);
  LineTo(BMP.Canvas.Handle,2,gEvo.Height-2);
  LineTO(BMP.Canvas.Handle,2,2);
  for i := 1 to ProduzentID do
  begin
    Produzent[i].Koerper;
  end;
  for i := 1 to OrganismusID do
  begin
    Organismus[i].Bewegung;
  end;
  for i := 1 to ProduzentID do
  begin
    Produzent[i].Kollision;
  end;

  SetBkMode(BMP.Canvas.Handle, TRANSPARENT);
  TextOut(BMP.Canvas.Handle,7,7,PWChar(IntToStr(Frames)+' FpS; '+IntToStr(Sekunden)+' Sek'),10+Length(IntToStr(Frames))+Length(IntToStr(Sekunden)));

  BitBlt(PaintBox.Canvas.Handle, 0, 0, BMP.Width, BMP.Height, BMP.Canvas.Handle,
    0, 0, SrcCopy);

end;


procedure TgEvo.Erzeuge_und_Zeichne;
Var RanStartX, RanStartY, Ran2StartX, Ran2StartY,
    RanGroesse, RanLeben, i: Integer;
begin

  for I := 1 to 6 do
  begin
    OrganismusID:=OrganismusID + 1;
    Randomize;
    RanStartX:=Random(gEvo.Width-200)+100;
    RanStartY:=Random(gEvo.Height-200)+100;
    Organismus[OrganismusID]:= TOrganismus.Create(RanStartX,RanStartY,50,1000,Random(360),55,250,6);
  end;
  for I := 1 to 6 do
  begin
    ProduzentID:=ProduzentID + 1;
    Ran2StartX:=Random(gEvo.Width-200)+100;
    Ran2StartY:=Random(gEvo.Height-200)+100;
    RanGroesse:=Random(70)+30;
    RanLeben:=RanGroesse*20;
    Produzent[ProduzentID]:= TProduzent.Create(Ran2StartX,Ran2StartY,RanGroesse,RanLeben);
  end;
end;

procedure TgEvo.IdleHandler(Sender: TObject; var Done: Boolean);
begin
  StartTime:= GetTickCount;
  Paint;
  DrawTime:= GetTickCount - StartTime;
  Inc(TimeCount, DrawTime);
  Inc(FrameCount);

  if TimeCount >= 1000 then begin
    Frames:= FrameCount;
    Inc(Sekunden);
    TimeCount:= TimeCount - 1000;
    FrameCount:= 0;
  end;

  Done:= false;
end;
wo überlade ich hier welche ressourcen ?

DeddyH 19. Mai 2010 16:55

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
MSDN-Library durchsuchenCreateSolidBrush
Zitat:

Remarks

A solid brush is a bitmap that the system uses to paint the interiors of filled shapes.

After an application creates a brush by calling CreateSolidBrush, it can select that brush into any device context by calling the SelectObject function.

Windows Embedded CE does not support dithered brushes.

When you no longer need the brush, call the DeleteObject function to delete it.
Dasselbe gilt für den Pen.

Kytrix 19. Mai 2010 23:27

Re: hDC überzeichnet zu unbestimmten zeiten alles
 
ohh man ..... :D sowas "einfaches"

vielen vielen dank leute jetzt läuft es einwandfrei und ich kann mich um die wichtigen nicht-graphischen sachen kümmern :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:01 Uhr.
Seite 2 von 2     12   

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