AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Problem mit property

Ein Thema von Jacob · begonnen am 15. Apr 2020 · letzter Beitrag vom 15. Apr 2020
Antwort Antwort
Jacob

Registriert seit: 14. Apr 2020
Ort: Dresden
4 Beiträge
 
Delphi 10.3 Rio
 
#1

Problem mit property

  Alt 15. Apr 2020, 10:38
Delphi-Version: 10.3 Rio
Hallo, ich bin neu hier im Forum und hoffe mit meiner Frage am richtigen Ort zu sein.

Hintergrund:
Sinn der Anwendung soll sein, eine definierbare Anzahl von zufälligen Zahlen zu generieren und diese in einem StringGrid auszugeben.
Da ich noch nie mit Klassen gearbeitet habe, wollte ich solche in mein Programm einbauen.

Als erstes habe ich einen dynamischen Array definiert, in dem die Zahlen eingetragen werden sollen:
Code:
   TArray = array of Integer;
Dann habe ich eine Klasse TLotto erstellt:
Code:
  TLotto = class
  private
    fArray: TArray;
    fLength: Integer;
    function GetArray(): TArray;
    procedure SetArray(Value: TArray);
    function GetLänge(): Integer;
    procedure SetLänge(Value: Integer);
  published
    constructor Create;
  public
    property LottoZahlen: TArray read GetArray write SetArray;
    property Länge: Integer read GetLänge write SetLänge;
  end;
Hier die dazugehörigen Module:
Code:
constructor TLotto.Create;
begin
  inherited;

  Self.Länge := 1;

end;

function TLotto.GetArray;
begin
  Result := fArray;
end;

procedure TLotto.SetArray(Value: TArray);
var
  i: Integer;
begin
  Randomize;

  SetLength(Value, fLength);

  for i := 0 to fLength - 1 do
  begin

    Value[i] := Random(49) + 1;

  end;

  fArray := Value;

end;

function TLotto.GetLänge;
begin
  Result := fLength;
end;

procedure TLotto.SetLänge(Value: Integer);
begin
  fLength := Value;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyLotto: TLotto;
begin

  MyLotto := TLotto.Create;
  try
    MyLotto.Länge := 6;
    FillStrg(MyLotto.LottoZahlen, StringGrid1);

  finally
    MyLotto.Free;
  end;

end;

procedure TForm1.FillStrg(_array: TArray; _object: TStringGrid);
var
  i: Integer;
begin

  for i := 0 to Length(_array) - 1 do
  begin
    _object.Cells[i, 0] := IntToStr(_array[i]);
  end;

end;
Jetzt zum Problem:
Die Property Länge mit Get- und SetLänge funktioniert einwandfrei, habe ich überprüft.
Allerdings scheint es regelrecht so, als würde die Prozedur SetLänge nicht aufgerufen.
Selbst, wenn ich an Stelle des dynamischen einen statischen Array verwende, wird in meinem StringGrid nicht mehr als eine Hand voll Nullen ausgegeben. Warum das?
Kann es sein, dass ich den Array innerhalb einer Klasse völlig falsch verwende, vielleicht gibt es auch einen kleinen Fehler, der mir nicht aufgefallen ist?
Der Compiler bringt auf jeden Fall keinerlei Fehler.
Nur das Ausgeben funktioniert nicht.

Falls es etwas offensichtliches ist, bitte nicht spotten, ist wirklich meine erstes Mal mit Klassen

Was zudem noch super wäre, wenn mir jemand nochmal fix in anfängerfreundlicher Sprache erklären könnte, wann man Interfaces verwendet. Scheint mir bisher eher ein Mehraufwand zu, der sich für mich nicht wirklich lohnt. Interfaces arbeiten ja allem Anschein nach eng mit Klassen zusammen.

Vielen Dank, ich freue mich auf die Antworten!
Jacob
Jacob
  Mit Zitat antworten Zitat
bcvs

Registriert seit: 16. Jun 2011
668 Beiträge
 
Delphi 12 Athens
 
#2

AW: Problem mit property

  Alt 15. Apr 2020, 13:39
Dein TLotto.SetArray wird nirgends aufgerufen, deshalb bleibt das Array leer.

Ist auch nicht so sinnvoll, das in einem Setter der property zu machen, denn du willst ja dem Array kein zweites Array zuweisen, sondern es nur mit Zufallszahlen füllen.

Ich würde dafür eine zusätzliche Methode einbauen, unabhängig von irgendwelchen Properties und die dann vor deinem FillStrg aufrufen.
  Mit Zitat antworten Zitat
DieDolly

Registriert seit: 22. Jun 2018
2.175 Beiträge
 
#3

AW: Problem mit property

  Alt 15. Apr 2020, 13:43
property Länge: Integer read GetLänge write SetLänge; Diese Zeile kann man in etwa folgendermaßen interpretieren

Die nach außen hin sichtbare Property/Variable heißt Länge. Greifst du auf Länge zu (X := TDeinLotto.Länge; ) wird GetLänge aufgerufen. Weist du Länge einen Wert zu, wird SetLänge aufgerufen. Das funktioniert bei einfachen Datentypen und Enums gut. Aber mit Arrays ist das eher nicht zu gebrauchen. Im Setter sollte man auch keine Zufallszahlen in ein Array füllen.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 06:17 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