Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Array oder Objectlist für Component (https://www.delphipraxis.net/201358-array-oder-objectlist-fuer-component.html)

MelCode 15. Jul 2019 16:48

Array oder Objectlist für Component
 
Hallo zusammen,
ich komme gerade bei einer Aufgabe nicht weiter, die mich schon länger beschäftigt.

Es geht darum, dass er Schachbrett mit 25 Feldern zu sehen sein soll. Durch Eingebe der Zahlen 1-5, in ein Label, kann man beeinflussen wie viele Felder Farbig markiert werden sollen. 1=1 Feld, 2=2 Felder und so weiter.
Die Felder, die markiert werden, sollen zufällig gewählt sein.

Zuerst habe ich es so gelöst, dass ich allen Feldern einen Case geben habe und durch random(25), dann ein zufälliges Feld gewählt habe. Das ganze wurde aber noch umfangreicher, weil ich bei jeder neuen Label Eingabe auch alle Felder wieder grau färben muss.
Um das ganze kompakter zu gestalten habe ich versucht ein Array oder eine Objektliste vom typ TRectangle zu erstellen, daran bin ich aber bis jetzt leider gescheitert.

Wäre schön, wenn ihr mir da weiter helfen könnt.

Incocnito 19. Jul 2019 15:36

AW: Array oder Objectlist für Component
 
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
Delphi-Quellcode:
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
Delphi-Quellcode:
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 := 'o' else 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


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:08 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