![]() |
Re: Integer erkennen der nicht initalisiert wurde
Wie verwende ich Variants? Was muss ich beim Umbau meines records zum Variant beachten?
|
Re: Integer erkennen der nicht initalisiert wurde
Hallo,
Zitat:
Gruß Hawkeye |
Re: Integer erkennen der nicht initalisiert wurde
Ich halte mich bei solchen Problemen gern an die Intel-Konventionen, die u.a. bei Integer-Typen einen Indefinite-Wert vorsehen.
Ein Indefinite ist ein Integerwert, bei dem nur das höchste Bit = 1 und alle anderen Bits = 0 sind. Wer das für unsinnig hält der versuche mal einen solchen Wert mit Abs(x) oder mit x:=-x in einen positiven Wert umzuwandeln. |
Re: Integer erkennen der nicht initalisiert wurde
Du kannst deinen Anwendern auch eine Funktion zur verfügung stellen, mit sovielen Parametern wie dein Record Felder enthält. Dann müssen dein Anwender alle Felder angeben und die nicht benötigten eben 0 übergeben.
Natürlich wirst du dadurch nicht verhindern können, dass trotzdem einer direkt auf den Record zugreift, und gewisse Felder nicht initialisiert. Um das zu vermeiden, mach aus deinem Record eine Klasse, deklarier die vorhandenen Felder in den Private Teil, stelle read-only public Eigenschaften zur Verfügung zum Auslesen der Werte. So kann keiner schreibend auf die Felde zugreifen. Wenn du dann wieder die besagte Mehtode in der Klasse implementierst, zum Setzen der Felder, so kann nichts mehr schief gehen, da immer alle Werte auf einen Ruck gesetzt werden... Ich kürz hier mal das Beispiel ab:
Delphi-Quellcode:
[edit=Admin] Mfg, Daniel[/edit]
type
TTrack = class private FTitle : string ; FTrackNum : integer ; public property Title : string read FTitle ; property TrackNum : integer read FTrackNum ; procedure SetValues (Title : string ; TrackNum : integer) ; end ; implementation procedure TTrack.SetValues (Title : string ; TrackNum : integer) ; begin Self.FTitle := Title ; Self.FTrackNum := TrackNum ; end ; |
Re: Integer erkennen der nicht initalisiert wurde
Zitat:
2. Alle betreffenden Record-Felder als 'Variant' deklarieren. 3. Alle betreffenden Felder mit 'UnAssigned' initialisieren. 4. Fertig Schau Dir mal die Delphi-Hilfe bezüglich 'Variants' an. [edit=Admin] Mfg, Daniel[/edit] |
Re: Integer erkennen der nicht initalisiert wurde
Über Variants gibt meine Delphi-Hilfe nicht viel her. Hab es jetzt so ähnlich wie von Jelly vorgeschlagen gemacht:
Delphi-Quellcode:
Denkt ihr das ist eine gute Lösung? Funktionieren tuts ;-)
type
TTrack = class(TComponent) public Location: String; //filename (also relative) or url, see TOptions Identifier: String; //file hash, etc... Title: String; Creator: String; //artist Annotation: String; //comment Info: String; //homepage for more informations Image: String; //e. g. a cover. URL or filename required Album: String; TrackNum: Integer; //track number/position in the playlist or on the cd Duration: Integer; //length in miliseconds Link: String; //link to some rdf code... see specs. published constructor Create(AOwner: TComponent); override; end; ... ... constructor TTrack.Create(AOwner: TComponent); begin inherited Create(AOwner); Duration := 0; //initalisieren TrackNum := 0; //" " " end; ... //Aufruf: procedure TForm1.Button1Click(Sender: TObject); var tr: TTrack; begin tr := TTrack.Create(Self); tr.Location := 'sdfsdfdff'; tr.Creator := 'sdfgdsfds'; XSPF1.Tracks.Add(tr); end; |
Re: Integer erkennen der nicht initalisiert wurde
Delphi-Quellcode:
Uses Variants;
Type TTrack = record Location: Variant; //filename (also relative) or url, see TOptions Identifier: Variant; //file hash, etc... Title: Variant; Creator: Variant; //artist Annotation: Variant; //comment Info: Variant; //homepage for more informations Image: Variant; //e. g. a cover. URL or filename required Album: Variant; TrackNum: Variant; //track number/position in the playlist or on the cd Duration: Variant; //length in miliseconds Link: Variant; //link to some rdf code... see specs. Procedure InitializeData; end; Procedure TTrack.InitializeData; Begin Location := UnAssigned; Identifier := UnAssigned; Title := UnAssigned; Creator := UnAssigned; Annotation := UnAssigned; Info := UnAssigned; Image := UnAssigned; Album := UnAssigned; TrackNum := UnAssigned; Duration := UnAssigned; Link := UnAssigned; End; ... Var myTrack : TTrack; Begin myTRack.InitializeData; ... If myTrack.Location = UnAssigned Then Showmessage('Dem Feld <Location> wurde noch nie etwas zugewiesen'); Zitat:
|
Re: Integer erkennen der nicht initalisiert wurde
Zitat:
Steht so in allen Lehrbüchern und in der Delphihilfe, und alle Compiler arbeiten auch so, in jeder Programmiersprache, die je erfunden wurde. Wahrscheinlich hast du das mit einer Real-Darstellung verwechselt, da gibt es tatsächlich NaNs (Not a Number). Gruss Reinhard |
Re: Integer erkennen der nicht initalisiert wurde
Hallo!
Wollte nur kurz daraufhinweisen, daß in Klassen alle Felder bereits mit 0 bwz '' initialisiert sind. Da fällt das Initialisieren also meist flach... ;-) Cu, Udontknow |
Re: Integer erkennen der nicht initalisiert wurde
nur so eine Idee - kann man mit überladen von Operatoren da nichts machen. Eine Zuweisung, Addition etc. kann man ja damit regeln. Gibt es da eventuell auch Initialisation?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:54 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