Einzelnen Beitrag anzeigen

Incocnito

Registriert seit: 28. Nov 2016
210 Beiträge
 
#2

AW: Array oder Objectlist für Component

  Alt 19. Jul 2019, 15:36
Hi MelCode,

ich denke du musst dein Problem etwas präzisieren.
Im Moment klingt es für mich wie "Ich muss ein Haus bauen, welche Farbe soll ich nehmen?".
Ich denke mal, solange du kein definiertes, begrenztes Problem hast wird vermutlich keiner (oder kaum einer) anwtworten.

Ein paar Ideen zu deinem Projekt:
1) Falls du visuell ein Schachbrettmuster mit 5x5 Feldern hast, würde ich auch ein zweidimensionales Array wählen.
Also var MeineFelder : Array [0..5] of Array[0..5] of TMeinFeld;

2) Und da siehst du auch schon meinen zweiten Vorschlag... Ich würde einen eigenen Typen pro Feld definieren,
damit du den Status auch mit hinterlegen kannst.
Delphi-Quellcode:
type
  TMeinFeld = record
    Koordinaten : TRect; // Kann vermutlich weg (siehe 4)
    IstGrau : Boolean;
  end;
In diesem Typ könntest du auch weitere Informationen hinterlegen.

3) Die Eingabe der zufällig gefüllten Felder ... du wirst das wohl kaum in eimem Label eingeben können.
Du meinst warscheinlich ein Edit-Feld.
Hier musst du bedenken, dass der Benutzer auch andere Sachen eingeben könnte.
Eine Idee wäre den Wert per StrToIntDef(edEingabe.Text, 0); auszulesen und falls
der Wert kleiner oder gleich 0 ist oder größer als 5 eine Meldung zu geben "Geben Sie einen vernünftigen Wert ein!".
Da es sich aber nur um 5 Möglichkeiten handelt (0 außen vor, dafür würde ich einen "Bereinigungs-Knopf machen),
würde ich sogar 5 kleine Buttons machen. Da gibt es dann auch keine Falscheingaben, die abgefangen werden müssten.
Bei einer Schulaufgabe würde ich allerdings prüfen, ob Buttons erlaubt sind, da die Lehrkraft vielleicht auch gerade
wollte das geübt wird fehlerhafte Eingaben abzufangen.

4) Falls du immer gleichgroße Felder hast, wäre vermutlich die Angabe der Koordinaten
überflüssig, da sich diese durch die Position im Array schon bestimmen lassen.
Delphi-Quellcode:
for iXCoord := Low(MeineFelder) to High(MeineFelder) do
begin
  for iYCoord := Low(MeineFelder[iXCoord]) to High(MeineFelder[iXCoord]) do
  begin
    ZeichneFeld(
      iXCoord,
      iYCoord,
      50, // Feste Höhe
      50, // Feste Breite
      MeineFelder[iXCoord][iYCoord]
    );
  end;
end;
Wie dann deine ZeichneFeld-Funktion aussehen muss hängt auch davon ab, wo du was machen willst.
Ein etwas dümmliches Beispiel mit Buttons:
Delphi-Quellcode:
procedure TMyForm1.ZeichneFeld(
  const iXCoord : Integer;
  const iYCoord : Integer;
  const iHeight : Integer;
  const iWidth : Integer;
  AktuellesFeld : TMeinFeld
);
var
  btn : TButton;
begin
  btn := TButton.Create(Self);
  btn.Top := iYCoord;
  btn.Left := iXCoord;
  btn.Height := iHeight;
  btn.Width := iWidth;
  if (AktuellesFeld .IstGrau) then btn.Caption := 'oelse btn.Caption := 'x';
  btn.Visible := True;
end;
Falls das mehrfach ausgeführt wird, müsstest du natürlich alle erzeugten Buttons in einer Liste Speichern und
vor dem erneuten Erzeugen die Objekte dieser Liste freigeben, aber da du vermutlich nur auf einem Canvas
etwas zeichnest, musst du nur das Canvas vorher leeren und keine Objekte freigeben.

Ich hoffe das (oder irgendwas davon) hilft dir weiter.

Mit freundlichem Gruß
Incocnito
  Mit Zitat antworten Zitat