Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Integer erkennen der nicht initalisiert wurde (https://www.delphipraxis.net/92651-integer-erkennen-der-nicht-initalisiert-wurde.html)

Andreas L. 23. Mai 2007 22:14

Re: Integer erkennen der nicht initalisiert wurde
 
Wie verwende ich Variants? Was muss ich beim Umbau meines records zum Variant beachten?

Hawkeye219 23. Mai 2007 22:45

Re: Integer erkennen der nicht initalisiert wurde
 
Hallo,
Zitat:

Zitat von 3_of_8
...oder einfach mit ZeroMemory den ganzen Record mit 0en überschreiben.

Aber bitte nicht bei Records mit dynamischen Daten (z.B. AnsiStrings), das führt unter Umständen zu hässlichen Speicherlecks.

Gruß Hawkeye

Amateurprofi 23. Mai 2007 23:29

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.

Jelly 24. Mai 2007 06:01

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:
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 ;
[edit=Admin] Mfg, Daniel[/edit]

alzaimar 24. Mai 2007 06:05

Re: Integer erkennen der nicht initalisiert wurde
 
Zitat:

Zitat von Andreas L.
Wie verwende ich Variants? Was muss ich beim Umbau meines records zum Variant beachten?

1. Die Unit 'Variants' einbinden
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]

Andreas L. 24. Mai 2007 08:54

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:
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;
Denkt ihr das ist eine gute Lösung? Funktionieren tuts ;-)

alzaimar 24. Mai 2007 09:21

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:

Zitat von Andreas L.
Über Variants gibt meine Delphi-Hilfe nicht viel her....

Oh ja, das stimmt. Haufenweise Müll...

Reinhard Kern 24. Mai 2007 17:22

Re: Integer erkennen der nicht initalisiert wurde
 
Zitat:

Zitat von Amateurprofi
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.

Das IST Unsinn. Z.B. 16bit-Integer ist definiert als -32768 ... 32767 (mit Vorzeichen) oder 0 ... 65535 (ohne), bei Integern sind alle möglichen Bitmuster gültig. Nach deiner Definition hätte ein 16bit unsigned int mitten im Zahlenraum ein Loch bei 32768!!!

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

Udontknow 24. Mai 2007 17:29

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

SirThornberry 25. Mai 2007 16:04

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 16:26 Uhr.
Seite 2 von 3     12 3      

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