Hallo,
ich hoffe doch, dass dir bewußt ist, dass ein TRectangle ein Objekt ist?
Die Objektinstanz muss man erst erzeugen, bevor man diese Verwenden kann.
So wie du es machst, greifst du auf Speicher zu, der deinem jeweiligen Rectangle
gar nicht gehört. Du schreibst also irgendwo in den Speicher weil die TRectangle
Variablen ohne weitere Initialisierung einfach eine zufällige Speicheradresse enthalten.
So und wie lösen wir das nun?
Hier mal etwas Code der 60 Rectangles erzeugt und in eine Liste packt:
Die Liste ist mittels Generics umgesetzt, falls das konzeptionell aber über
euren Unterricht hinausgeht kann man das auch ein wenig mehr "OldSchool" umsetzen.
Delphi-Quellcode:
unit BoardForm;
interface
uses
[..]
// was alles für eine FMX Form usw. nötig ist
System.Generics.Collections;
type
TBoardForm =
class(TForm)
private
FRectangleList : TObjectList<TRectangle>;
procedure CreateRectangle(x,y, Width, Height : Single; Color: TAlphaColor);
public
procedure CreateRectangles;
end;
implementation
procedure TBoardForm.CreateRectangle(x,y, Width, Height : Single; Color: TAlphaColor);
var
Rectangle: TRectangle;
begin
Rectangle := TRectangle.Create(self);
// Owner ist die eigene Form
Rectangle.Position.X := x;
Rectangle.Position.Y := y;
Rectangle.Width := Width;
Rectangle.Height := Height;
Rectangle.Fill.Color := Color;
FRectangleList.Add(Rectangle);
end;
procedure TBoardForm.CreateRectangles;
var
i : Integer;
begin
// Liste erzeugen inkl. OwnsObjects auf true, damit die hinzugefügten
// Rectangles beim späteren Freigeben der Liste auch freigegeben werden.
// Bei Desktopprogramm und ab Delphi 10.4 auch bei Smartphone App sonst
// sog. Speicherleck.
FRectangleList := TObjectList<TRectangle>.Create(true);
// 60 Rectangles mal irgendwie erzeugen, X/Y Platzierung kannst du selber gerade ziehen
for i := 1
to 60
do
CreateRectangle(i*3, i*3, 5, 5, TAlphaColor.claBlue);
// Ändern der Farbe eines bestimmten Rectangles (des 6.):
FRectangleList[5].Fill.Color := TAlphaColor.claRed;
end;
Und falls Generics zu heftig für euch ist:
Statt TObjectList<TRectangle> eine normale TObjctList; aus System.Contnrs benutzen
und beim Lesezugriff typecasten: TRectangle(FRectangleList[5]).Fill.Color := TAlphaColor.claRed;
Grüße
TurboMagic