![]() |
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:
Dann habe ich eine Klasse TLotto erstellt:
TArray = array of Integer;
Code:
Hier die dazugehörigen Module:
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;
Code:
Jetzt zum Problem:
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; 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 |
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. |
AW: Problem mit property
Delphi-Quellcode:
Diese Zeile kann man in etwa folgendermaßen interpretieren
property Länge: Integer read GetLänge write SetLänge;
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:
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.
GetLänge
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz