Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit property (https://www.delphipraxis.net/204013-problem-mit-property.html)

Jacob 15. Apr 2020 10:38

Delphi-Version: 10.3 Rio

Problem mit property
 
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

bcvs 15. Apr 2020 13:39

AW: Problem mit property
 
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.

DieDolly 15. Apr 2020 13:43

AW: Problem mit property
 
Delphi-Quellcode:
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
Delphi-Quellcode:
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.


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