![]() |
Records
Hallo,
letzte Zeit bemerke ich immer öfter das Records nicht korrekt initialisiert sind. In unserem gigantischem Projekt sind Records eigentlich nie initialisiert. Deswegen kommt es immer wieder vor das unsere Kunden ein Fehler melden der bei uns aber nicht auftritt. Oder ein Fehler nur auf einem von zehn identischen Arbeitsplätzen auftritt. Ich habe das Gefühl das es häufiger geworden ist seit wir auf 64 Bit umgestellt haben. Aktuell suche ich stunden lang nach genau dieser Stelle und initialisiere diesen einen Record. Wie macht ihr das? Gibt es da eine Lösung die mir nicht bekannt ist? Beispiel:
Delphi-Quellcode:
unit Unit1;
interface type TRQRec = record isActiv: Boolean; end; implementation procedure Test1; var RQRec: TRQRec; begin //RQRec := Default(TRQRec); // zur Sicherheit initialisieren if RQRec.isActiv then // es ist manchmal true begin // do amasing things end; end; end. |
AW: Records
Records werden dort durch Delphi nicht automatisch initialisiert. Die Werte sind bis zum Setzen eines Wertes pseudo-zufällig.
Anders sieht es bei referenzgezählten Felder in einem Record aus. Die werden initialisiert. |
AW: Records
Zitat:
Zitat:
Delphi-Quellcode:
Die mit neueren Delphi-Versionen verfügbaren Managed Records bieten da noch weitere Möglichkeiten:
type
TRQRec = record isActiv: Boolean; public constructor Create(AisActiv: Boolean); end; constructor TRQRec.Create(AisActiv: Boolean); begin isActiv := AisActiv; end; procedure Test1; var RQRec: TRQRec; begin RQRec := TRQRec.Create(False); if RQRec.isActiv then begin // do amazing things end; end;
Delphi-Quellcode:
type
TRQRec = record isActiv: Boolean; public class operator Initialize(out Dest: TRQRec); end; class operator TRQRec.Initialize(out Dest: TRQRec); begin Dest.isActiv := False; end; procedure Test1; var RQRec: TRQRec; begin if RQRec.isActiv then // ist immer False begin // do amazing things end; end; |
AW: Records
Zitat:
|
AW: Records
Ich bin kein gelernter Delphi Programmierer. Versuche mir alles selbst bei zu bringen.
Haptsächlich versuche ich durch bestehenden Code zu lernen. Es wird aber schwieriger wenn meine Vorgänger mir keinen korekten Code überlassen haben. Sehe ich das richtig das "Records" hauptsächlich oder ausschließlich ein Delphi Ding sind? Auf jeden Fall schwinden die Vorteile eines Records beim Vergleich: Record vs. Class Die einzige Zeile die ich einsparre ist die Freigabe des Records. |
AW: Records
Zitat:
Klassen und Records haben beide legitime Anwendungsfälle, das eine ist nicht per se "besser" als das andere. |
AW: Records
Zitat:
Records sind bei mir nur noch selten im Einsatz. Zur Initialisierung benutze ich den Fällen meistens:
Delphi-Quellcode:
type
TMyRec = Record ... end; var MyRec : TMyRec; begin MyRec := Default(TMyRec); end; |
AW: Records
Ich habe in Records immer eine Methode "Init", die den Record genau so initialisiert, wie ich das jeweils gerne hätte:
Delphi-Quellcode:
P.S.: für "Managed Records" haben wir eine zu alte Delphi-Version.
type
TMyRec = Record ... procedure Init; end; procedure TMyRec.Init; begin ... end; var MyRec : TMyRec; begin MyRec.Init; ... end; |
AW: Records
Zitat:
|
AW: Records
Das Problem ist dabei aber z.B., dass ein Record ja wiederum weitere strukturierte Typen enthalten kann. Dazu kommt dann mittlerweile, dass ein Record auch Initialisierungsroutinen haben kann, deren Funktion der Compiler nicht kennen kann.
Solche Intelligenz ist daher vorerst Wunschdenken. Möglich wäre so etwas nur, wenn man den gesamten Quelltext an eine KI verfüttert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 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 by Thomas Breitkreuz