Einzelnen Beitrag anzeigen

TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.824 Beiträge
 
Delphi 12 Athens
 
#2

AW: Problem mit Schleifen/Array/??? - Brettspiel Mastermind

  Alt 15. Okt 2020, 21:00
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
  Mit Zitat antworten Zitat