AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Array oder Objectlist für Component
Thema durchsuchen
Ansicht
Themen-Optionen

Array oder Objectlist für Component

Ein Thema von MelCode · begonnen am 15. Jul 2019 · letzter Beitrag vom 19. Jul 2019
Antwort Antwort
MelCode

Registriert seit: 15. Jul 2019
1 Beiträge
 
#1

Array oder Objectlist für Component

  Alt 15. Jul 2019, 17:48
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.
  Mit Zitat antworten Zitat
Incocnito

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

AW: Array oder Objectlist für Component

  Alt 19. Jul 2019, 16: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
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 20:20 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