AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

typecast in neuen Delphi-Versionen

Ein Thema von BadenPower · begonnen am 13. Okt 2015 · letzter Beitrag vom 14. Okt 2015
Antwort Antwort
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#1

typecast in neuen Delphi-Versionen

  Alt 13. Okt 2015, 17:21
Delphi-Version: XE8
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:
http://www.lazarusforum.de/viewtopic.php?f=18&t=9105


Die Ausgangssituation mit einer erweiterten Komponente:
Delphi-Quellcode:
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;
und darauf folgenden Zugriff:

Delphi-Quellcode:
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
So ist es zum Beispiel auch bei mir mit Delphi2007 aus.

Wie sieht es in den aktuellen Delphi-Versionen aus?

Oder wird seit neuestem bei (MyEdit1 as TEdit).ReadOnly auch false zurückgegeben wie scheinbar bei Lazarus?

Den Original-Quellcode habe ich einmal ausgeborgt und angehängt.
Wäre nett, wenn dies jemand testen könnte.
Angehängte Dateien
Dateityp: zip TypeCastDelphi.zip (227,4 KB, 4x aufgerufen)
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#2

AW: typecast in neuen Delphi-Versionen

  Alt 13. Okt 2015, 18:17
Delphi-Quellcode:
lBoolean := TEdit(MyEdit1).ReadOnly //Result: false
lBoolean := (MyEdit1 as TEdit).ReadOnly //Result: true
Weia. Ist mir nie aufgefallen. Das ist ja daneben - Cast sollte in diesem Fall Cast sein.

Edit: In XE6 funktioniert's, wie es sollte - also anders, als du es gerne hättest.
Uli Gerhardt

Geändert von uligerhardt (13. Okt 2015 um 18:28 Uhr)
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#3

AW: typecast in neuen Delphi-Versionen

  Alt 13. Okt 2015, 18:28
Interessantes Problem.

In Delphi XE6:

Delphi-Quellcode:
lBoolean := MyEdit1.ReadOnly //Result: true
lBoolean := TEdit(MyEdit1).ReadOnly //Result: false
lBoolean := (MyEdit1 as TEdit).ReadOnly //Result: false
So, wie es meiner Meinung nach auch sein sollte. Es gibt keinen "Softcast" wie im Lazarusforum jemand annahm.

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
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#4

AW: typecast in neuen Delphi-Versionen

  Alt 13. Okt 2015, 19:07
In XE6 funktioniert's, wie es sollte - also anders, als du es gerne hättest.
Das ist so nicht richtig ausgedrückt.

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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#5

AW: typecast in neuen Delphi-Versionen

  Alt 14. Okt 2015, 09:48
In XE6 funktioniert's, wie es sollte - also anders, als du es gerne hättest.
Das ist so nicht richtig ausgedrückt.

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.

Also wenn ich auf "Deklaration suchen" gehe von:

(MyEdit1 as TEdit).ReadOnly Dann verweist Delphi XE8 korrekt auf Vcl.StdCtrls

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.

.
Phantasie ist etwas, was sich manche Leute gar nicht vorstellen können.

Geändert von stoxx (14. Okt 2015 um 09:50 Uhr)
  Mit Zitat antworten Zitat
BadenPower

Registriert seit: 17. Jun 2009
616 Beiträge
 
#6

AW: typecast in neuen Delphi-Versionen

  Alt 14. Okt 2015, 11:59
Schreib Deinen Code doch lieber um, so dass er logisch korrekt auch unter XE funktioniert.
Umschreiben ist immer mit Aufwand verbunden.

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.
Programmieren ist die Kunst aus Nullen und Einsen etwas sinnvollen zu gestalten.
Der bessere Künstler ist allerdings der Anwender, denn dieser findet Fehler, welche sich der Programmierer nicht vorstellen konnte.
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#7

AW: typecast in neuen Delphi-Versionen

  Alt 14. Okt 2015, 12:34
Wenn ich bei Delphi 2007..2010 (andere Versionen nicht getestet) folgendes formuliere:

Delphi-Quellcode:
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;
ergibt das folgende Ausgabe:
Code:
MyEdit1.ReadOnly            : True
TEdit(MyEdit1).ReadOnly     : False
(MyEdit1 as TEdit).ReadOnly : True
GetReadOnly(MyEdit1)        : False
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.746 Beiträge
 
Delphi 2007 Professional
 
#8

AW: typecast in neuen Delphi-Versionen

  Alt 14. Okt 2015, 13:20
Code:
MyEdit1.ReadOnly            : True
TEdit(MyEdit1).ReadOnly     : False
(MyEdit1 as TEdit).ReadOnly : True
GetReadOnly(MyEdit1)        : False
Ist doch klar:
  • Bei 1 ist die Variable vom statischen Typ TMyEdit, also kommt True. Passt.
  • Bei 2 und 4 ist der statische Typ TEdit, aber der dynamische TMyEdit. Wichtig ist aber der statische Typ, also False. Passt auch.
  • 3 sollte wie 2 laufen, wegen des Bugs kommt aber True.
Uli Gerhardt
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:47 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