AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Dynamische Erstellung von TImage Objekten führt zu Fehler in canvas.inc
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamische Erstellung von TImage Objekten führt zu Fehler in canvas.inc

Ein Thema von Basetyp · begonnen am 6. Dez 2012 · letzter Beitrag vom 6. Dez 2012
Antwort Antwort
Basetyp

Registriert seit: 18. Apr 2012
12 Beiträge
 
#1

Dynamische Erstellung von TImage Objekten führt zu Fehler in canvas.inc

  Alt 6. Dez 2012, 19:55
Guten Abend Delphi Praxis.

Ich hab mich mal grade an ein Programm gemacht, dass dynamisch TImage Objekte aus Bitmapabschnitten erstellt.
Das Programm soll ca. 10000 Bitmaps in eine Array of TImage laden und dann in die Form ausgeben.

Allerdings gibt es nach ca. 20sec des Wartens diese Meldung: Klick!

Hier der dazu gehörende Code:
Delphi-Quellcode:
procedure DrawEntities(E: Array_Array_TPoint; Source_Bitmap: TBitmap);
var i, t: Integer;
    Destination_Rect, Source_Rect: TRect;
begin
  For i := 0 to Length(Entity_image) - 1 do
  begin
    Entity_image[i].Free;
  end;
  SetLength(Entity_Image,0);
  For i := 0 to Length(E) - 1 do
  begin
    For t := 0 to Length(E[i]) - 1 do
    begin
      Setlength(Entity_image, Length(Entity_image) + 1);
      Entity_image[High(Entity_image)] := TImage.Create(nil);
      Entity_image[High(Entity_image)].Parent := MAPTEST_form;
      Entity_image[High(Entity_image)].Height := 5;
      Entity_image[High(Entity_image)].Width := 5;
      Entity_image[High(Entity_image)].Top := E[i,t].y*5;
      Entity_image[High(Entity_image)].Left:= E[i,t].x*5;

      // Ab hier wird ein bestimmter Abschnitt einer Bitmap in die Array geladen.
      Destination_Rect := Rect(0,0,5,5);
      Source_Rect := Rect(i * 5, 1,i * 5 + 5,6);
      Entity_image[High(Entity_image)].Canvas.FillRect(Destination_Rect);
      Entity_image[High(Entity_image)].Picture.Bitmap.Canvas.CopyRect(Destination_Rect,Source_Bitmap.Canvas,Source_Rect);
      Entity_image[High(Entity_image)].BringtoFront;
    end;
  end;
end;
Liegt es vielleicht daran, dass ich irgendwann zuviele Objekte erstellt habe?
Es gibt eigentlich nur ca. 10 verschiedene Möglichkeiten an Bitmaps mit welcher ein TImage gefüllt kann. Ich glaube aber, dass hier für jedes TImage ein neues Objekt angelegt wird.
Da ich nur begrenzte Delphi-Kenntnisse habe und eigentlich nicht mal weiß was ein Parent und TImage.Create(nil) machen, kann ich den Fehler nicht selbst beheben.

EDIT: Vielleicht sollte ich ergänzen, dass das Programm durchaus lauffähig ist und nur sobald ich mehr als ca. 3300 TImages in der Array habe, der Fehler auftritt.

Geändert von Basetyp ( 6. Dez 2012 um 19:59 Uhr)
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: Dynamische Erstellung von TImage Objekten führt zu Fehler in canvas.inc

  Alt 6. Dez 2012, 21:12
Liegt es vielleicht daran, dass ich irgendwann zuviele Objekte erstellt habe?
Ziemlich sicher sogar. Die GDI Resourcen sind durch mehr als nur das RAM begrenzt. Es ist auch ziemlicher Unfug, eine visuelle Komponente (TImage) für die Datenhaltung zu benutzen missbrauchen. Nimm hier ausschließlich TBitmaps, und EIN TImage zur Darstellung.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Basetyp

Registriert seit: 18. Apr 2012
12 Beiträge
 
#3

AW: Dynamische Erstellung von TImage Objekten führt zu Fehler in canvas.inc

  Alt 6. Dez 2012, 23:04
Sehr schön. Danke genau das wollte ich hören

Hab den Code mal weniger TImage missbrauchend gemacht.

Delphi-Quellcode:
procedure DrawEntities(E: Array_Array_TPoint; Source_Bitmap: TBitmap);
var i, t: Integer;
    Destination_Rect, Source_Rect: TRect;
begin
  MAPTEST_form.Image3.Width := 500;
  MAPTEST_form.Image3.Height := 500;
  For i := 0 to Length(E) - 1 do
  begin
    For t := 0 to Length(E[i]) - 1 do
    begin
      Destination_rect := Rect(E[i,t].x*5, E[i,t].y*5, E[i,t].x*5 + 5, E[i,t].y*5 + 5);
      Source_rect := Rect(i * 5, 1, i * 5 + 5, 6);
      MAPTEST_form.Image3.Canvas.FillRect(Destination_rect);
      MAPTEST_form.Image3.Picture.Bitmap.Canvas.CopyRect(Destination_rect,Source_Bitmap.Canvas,Source_rect);
    end;
  end;
end;
  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 17:18 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