AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Null als Property

Ein Thema von IntelliSoft · begonnen am 8. Apr 2021 · letzter Beitrag vom 9. Apr 2021
Antwort Antwort
Seite 1 von 2  1 2   
IntelliSoft

Registriert seit: 8. Apr 2021
9 Beiträge
 
Delphi 10.3 Rio
 
#1

Null als Property

  Alt 8. Apr 2021, 10:51
Delphi-Version: 5
Hallo
Zu aller erst, möchte ich HALLO sagen!
Ich bin neu in eurer Gemeinde & bin voller Vorfreude.

Eine kurze Vorstellung, vor der Frage, finde ich als angebracht.
Ich komme von Visual Basic. NET zu Delphi. Grund dafür ist, dass MS, Visual Basic fallen gelassen hat & nicht dieses umständliche C# lernen möchte...
Ich arbeite in VB.Net seit der ersten .NET Generation (also 2001) und davor auch schon mit einigen anderen Basic Sprachen.
Jetzt bin ich hier, bei Delphi angekommen & versuche die Handhabung so gut es geht im Selbststudium zu meistern.
Doch leider gibt es nicht auf alles eine schnelle & einfache Antwort - Deshalb hier zu meiner Frage:

In der .NET Welt gibt es Nullable(of ...).
Damit kann man Datentypen deklarieren, die keinen Wert aufweisen sollen.
Soweit ich das verstanden habe, kennt Delphi (im Moment) dieses Konzept nicht. Deshalb die Frage: Wie geht man in Delphi damit um?

Als kleines, praxisorientiertes Beispiel:


Ich habe 3 Properties:
Staerke1: Float
Staerke2: Float
Achse: 0..180

Jetzt ist es so, dass die Property Achse nur dann einen Wert haben darf, wenn Staerke2 <> 0 ist, wobei es "0" als Staerke2 gar nicht gibt...
Das heißt, die Rückgabe von Achse darf nur dann einen Wert haben (zwischen 0 und 180) wenn Staerke2 nicht "0" ist.
Wenn Staerke2 "0" wäre, dann darf die Achse keinen Rückgabewert haben & auch Staerke2 müsste "NIL" sein

Ich hoffe, das war logisch...

DANKE für Tips!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Null als Property

  Alt 8. Apr 2021, 10:58
Mit Delphi 5 wirst Du da Probleme haben. In neueren Delphiversionen gibt es die Möglichkeit per generics:

Delphi-Quellcode:
unit Nullable;

interface

uses
  Classes, SysUtils;

type
  TNullable<T> = record
  private
    FHasValue: Boolean;
    FValue: T;
    function GetValue: T;
    procedure SetValue(AValue: T);
  public
    procedure Clear;
    property HasValue: Boolean read FHasValue;
    property Value: T read GetValue write SetValue;
    class operator Implicit(A: T): TNullable<T>;
    class operator Implicit(A: Pointer): TNullable<T>;
  end;

implementation

{ TNullable }

function TNullable<T>.GetValue: T;
begin
  if FHasValue then
     Result := FValue
  else
    raise Exception.Create('Variable has no value');
end;

procedure TNullable<T>.SetValue(AValue: T);
begin
  FValue := AValue;
  FHasValue := True;
end;

procedure TNullable<T>.Clear;
begin
  FHasValue := False;
end;

class operator TNullable<T>.Implicit(A: T): TNullable<T>;
begin
  Result.Value := A;
end;

class operator TNullable<T>.Implicit(A: Pointer): TNullable<T>;
begin
  if A = nil then Result.Clear
  else raise Exception.Create('Pointer value not allowed');
end;

end.
Markus Kinzler
  Mit Zitat antworten Zitat
IntelliSoft

Registriert seit: 8. Apr 2021
9 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Null als Property

  Alt 8. Apr 2021, 11:01
Hallo

1) Danke für die schnelle Antwort
2) Das mit Version 5 von Delphi hatte ich gar nicht eingestellt... -> Habe es aber geändert: Ich arbeite mit 10.3 Communitiy Edition
3) Das von Dir gezeigt Beispiel funktioniert aber erst ab 10.4, soweit ich da gelesen habe!?

DANKE
  Mit Zitat antworten Zitat
IntelliSoft

Registriert seit: 8. Apr 2021
9 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Null als Property

  Alt 8. Apr 2021, 11:04
OH
Hab es gerade getestet, scheint auch super in der Version 10.3 zu funktionieren!

DANKE - Ich werde das mal testen!!!!

SUPER!
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Null als Property

  Alt 8. Apr 2021, 11:06
Sollte eigentlich mit allen Versionen mit Generics funktionieren. (ab D2009)
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.102 Beiträge
 
Delphi 12 Athens
 
#6

AW: Null als Property

  Alt 8. Apr 2021, 11:49
Wollte Delphi nicht auch nativ Nullable-Typen demnächst eingebaut haben? (dachte da war mal was in 10.2/3/4 geplant)


Jetzt ab 10.4 würde die Initialisation des Managed-Records sich gut machen, um den Wert automatisch "sauber" zu haben.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

Geändert von himitsu ( 8. Apr 2021 um 11:51 Uhr)
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Null als Property

  Alt 8. Apr 2021, 11:50
Geplant war/ist viel ...
Markus Kinzler
  Mit Zitat antworten Zitat
Rolf Frei

Registriert seit: 19. Jun 2006
647 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Null als Property

  Alt 8. Apr 2021, 13:24
Ja da habe ich mich auch schon gefragt was daraus geworden ist. Das sollte doch glaube ich in 10.3 (oder sogar schon in 10.2.x) eingeführt werden und wurde dann kurzfristig wieder rausgenommen. Leider hat man seit da nichts mehr dazu gelesen. Mich würde schon auch interessieren wie es damit weiter geht oder ob das komplett gestorben ist. Hatte aber selber auch noch garnie den Bedarf dafür, weil man das auch anders lösen kann.

An den OP: Wieso definierst du denn nicht einfach, dass 0 kein gültiger Wert ist, also genau das was du ja schreibst. Wenn Stärke2 = 0 ist entspricht das deinem Null. Beim setzen des Property Achse prüfst du den Wert von Stärke2 und änderst den Wert von Achse (das Klassenfeld FAchse) nur wenn Stärke2 <> 0 ist. Mit einem SetAchse/GetAchse des Proberties kannst du das problemlos umsetzen. Die Achse initialiserst du natürlcih mit ienem ungültigen Wert wie z.B. -1, was dann für die Achse dem Null entsprechen würde.

Delphi-Quellcode:
type
  TMyObject = class
  private
    FAchse: Integer;
    FStaerke1,
    FStaerke2: Double;
    procedure SetAchse(AValue: Double);
    function GetAchse: Double;
  public
    constructor Create; virtual;
    property Achse: Double read GetAchse write SetAchse;
    property Staerke1: Double read FStaerke1 write FStaerke1;
    property Staerke2: Double read FStaerke2 write FStaerke2;
  end;

constructor TMyObject.Create;
begin
  FAchse := -1;
  // Staerke1 + 2 werden vom Compiler mit 0 initialisiert
end;

function TMyObject.GetAchse: Double;
begin
  if FStaerke2 <> 0 then
    Result := .... // deine Achsenberechnung
  else
    Result = -1; // oder eine Exception auslösen je nach Bedarf
end;

procedure TMyObject.SetAchse(AValue: Double);
begin
  // hier kanns du irgendwas machen, was beim setzen des Achse Properties passieren soll.
  // z.B. überprüfen ob der Wert einem gültigen Wert für Achse entspricht.
end;

Geändert von Rolf Frei ( 8. Apr 2021 um 14:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.102 Beiträge
 
Delphi 12 Athens
 
#9

AW: Null als Property

  Alt 8. Apr 2021, 14:02
Single/Double/Float kennen als "Werte" auch NaN, Infinity und NegInfinity.

Delphi-Referenz durchsuchenNaN (not a number) kann man hier als "NULL" (kein Wert / keine Zahl) verwenden.


Über die Fehlerbehandlung der FPU auch steuern, wie bei Berechnungen mit NaN umgegangen werden soll,
ansonsten vorher eben mit Delphi-Referenz durchsuchenIsNan prüfen.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.020 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#10

AW: Null als Property

  Alt 9. Apr 2021, 00:17
Das Feature Nullables in Delphi sollte mehr umfassen, als das was oben skizziert und auch in unzähligen Bibliotheken seit vielen Jahren vorhanden ist.
Nämlich das, was man nicht mit so nem Record abbilden kann: operator hoisting (also ich kann die Operatoren darauf anwenden, die ich auch auf den typen in T anwenden kann), nullable propagation (ggf auch sowas wie den "Elvis" Operator aus C#).
Besser, sie nehmen sich dafür Zeit, wo sie ja so "viele" Compiler-Entwickler haben, gell?
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  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 09:37 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