![]() |
Delphi-Version: XE8
typecast in neuen Delphi-Versionen
Liste der Anhänge anzeigen (Anzahl: 1)
Da ich mich schon einige Zeit mit dem Gedanken beschäftige von Delphi eventuell auf Lazarus umzusteigen (anstelle einer Neuanschaffung von Delphi / bisher D2007) ist mir im Lazarus-Forum ein Beitrag aufgefallen, welcher für meine Überlegung sehr interessiert ist, da ich zum Teil exzessiv Typecasts einsetze.
Hier einmal der Link: ![]() Die Ausgangssituation mit einer erweiterten Komponente:
Delphi-Quellcode:
und darauf folgenden Zugriff:
type
TMyEdit = class(TEdit) private FEnhReadOnly: Boolean; function GetEnhReadOnly(): Boolean; virtual; procedure SetEnhReadOnly(AValue: Boolean); virtual; public constructor Create(AOwner: TComponent); override; published property ReadOnly: Boolean read GetEnhReadOnly write SetEnhReadOnly; end; implementation constructor TMyEdit.Create(AOwner: TComponent); begin inherited Create(AOwner); FEnhReadOnly := inherited ReadOnly; end; function TMyEdit.GetEnhReadOnly(): Boolean; begin Result := FEnhReadOnly; end; procedure TMyEdit.SetEnhReadOnly(AValue: Boolean); begin if (FEnhReadOnly <> AValue) then begin FEnhReadOnly := AValue; end; end;
Delphi-Quellcode:
So ist es zum Beispiel auch bei mir mit Delphi2007 aus.
MyEdit1 := TMyEdit.Create(Self);
MyEdit1.ReadOnly := true; lBoolean := MyEdit1.ReadOnly //Result: true lBoolean := TEdit(MyEdit1).ReadOnly //Result: false lBoolean := (MyEdit1 as TEdit).ReadOnly //Result: true Wie sieht es in den aktuellen Delphi-Versionen aus? Oder wird seit neuestem bei
Delphi-Quellcode:
auch false zurückgegeben wie scheinbar bei Lazarus?
(MyEdit1 as TEdit).ReadOnly
Den Original-Quellcode habe ich einmal ausgeborgt und angehängt. Wäre nett, wenn dies jemand testen könnte. |
AW: typecast in neuen Delphi-Versionen
Zitat:
Edit: In XE6 funktioniert's, wie es sollte - also anders, als du es gerne hättest. :mrgreen: |
AW: typecast in neuen Delphi-Versionen
Interessantes Problem.
In Delphi XE6:
Delphi-Quellcode:
So, wie es meiner Meinung nach auch sein sollte. Es gibt keinen "Softcast" wie im Lazarusforum jemand annahm.
lBoolean := MyEdit1.ReadOnly //Result: true
lBoolean := TEdit(MyEdit1).ReadOnly //Result: false lBoolean := (MyEdit1 as TEdit).ReadOnly //Result: false In obigem Beispiel generiert XE6 übrigens erst gar keinen Code, der die Klasse von MyEdit1 prüft, weil die ja schon zur Compilezeit ersichtlich ist. Man könnte den Test also noch so erweitern:
Delphi-Quellcode:
var Obj: TObject;
Obj := MyEdit1; lBoolean := MyEdit1.ReadOnly //Result: true lBoolean := TEdit(MyEdit1).ReadOnly //Result: false lBoolean := (MyEdit1 as TEdit).ReadOnly //Result: false lBoolean := (Obj as TEdit).ReadOnly //Result: false lBoolean := (Obj as TMyEdit).ReadOnly //Result: true |
AW: typecast in neuen Delphi-Versionen
Zitat:
Denn unter XE6 funktioniert es anderst, denn ich hatte bisher angenommen, dass es bislang so funktioniert wie es sollte. Dann bleib' ich doch bei Delphi2007, denn da funktioniert es so wie ich es brauche und seit je her gewohnt bin. Aber wenn ich mir so das Lazarus-Forum anschaue und mit hier vergleiche, dann wird es arbeitstechnisch egal sein, ob ich in nächster Zeit mit Lazarus anfange oder eine neue Delphi-Version erstehe. |
AW: typecast in neuen Delphi-Versionen
Zitat:
Also wenn ich auf "Deklaration suchen" gehe von:
Delphi-Quellcode:
Dann verweist Delphi XE8 korrekt auf Vcl.StdCtrls
(MyEdit1 as TEdit).ReadOnly
Unter Delphi 2007 geht die Deklaration (fehlerhaft) auf TMyEdit.ReadOnly Also ist es ein Bug von Delphi 2007, der irgendwann behoben wurde. Schreib Deinen Code doch lieber um, so dass er logisch korrekt auch unter XE funktioniert. . |
AW: typecast in neuen Delphi-Versionen
Zitat:
Klar könnte ich zum Beispiel GetPropValue einsetzen, was mir dann auch die richtigen Werte ausgeben würde. Allerdings müsste ich dann für die abzufragenden Properties feste Strings verwenden, worauf ich eigentlich verzichten wollte. 1. können Tippfehler entstehen 2. merkt man erst zur Laufzeit dass eine Property für dieses Objekt nicht exisiert. |
AW: typecast in neuen Delphi-Versionen
Wenn ich bei Delphi 2007..2010 (andere Versionen nicht getestet) folgendes formuliere:
Delphi-Quellcode:
ergibt das folgende Ausgabe:
function GetReadOnly(AEdit: TEdit): Boolean;
begin Result := AEdit.ReadOnly; end; procedure TForm1.Button2Click(Sender: TObject); begin Memo1.Lines.Clear; Memo1.Lines.Add('MyEdit1.ReadOnly : ' + BoolToStr(MyEdit1.ReadOnly, True)); Memo1.Lines.Add('TEdit(MyEdit1).ReadOnly : ' + BoolToStr(TEdit(MyEdit1).ReadOnly, True)); Memo1.Lines.Add('(MyEdit1 as TEdit).ReadOnly : ' + BoolToStr((MyEdit1 as TEdit).ReadOnly, True)); Memo1.Lines.Add('GetReadOnly(MyEdit1) : ' + BoolToStr(GetReadOnly(MyEdit1), True)); Memo1.Lines.Add(''); end;
Code:
:shock:
MyEdit1.ReadOnly : True
TEdit(MyEdit1).ReadOnly : False (MyEdit1 as TEdit).ReadOnly : True GetReadOnly(MyEdit1) : False |
AW: typecast in neuen Delphi-Versionen
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:28 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