AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language ICH habe den ältesten OOP-Bug entdeckt :firejump: , leider.
Thema durchsuchen
Ansicht
Themen-Optionen

ICH habe den ältesten OOP-Bug entdeckt :firejump: , leider.

Ein Thema von himitsu · begonnen am 6. Nov 2017 · letzter Beitrag vom 6. Nov 2017
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#1

ICH habe den ältesten OOP-Bug entdeckt :firejump: , leider.

  Alt 6. Nov 2017, 16:06
Delphi-Version: XE
Gegeben sei
Delphi-Quellcode:
type
  TFirstComp = class
  protected
    FTest: string;
    procedure SetTest(Value: string);
  published
    property TestProp: string read FTest write SetTest;
  end;
Da kann man nun die Property-Deklaration überschreiben/ändern:
Delphi-Quellcode:
type
  TSecondComp = class(TFirstComp)
  protected
    function StoredTest(Index: Integer): Boolean;
  published
    property TestProp index 1 stored StoredTest;
  end;
Viele nutzen dass, um den Getter/Setter zu ändern, wenn sich keine Getter/Setter-Methode überschreiben (override) lässt.
Sehr bekannt ist sowas auch für das Ändern des Defaultwertes. Oder zum Verschieben der Sichtbarkeit.

Nur knallt das jetzt, wenn z.B. das Property aus der DFM gelesen wird,
denn Delphi ruft SetTest nun freudig mit zwei Parametern auf, obwohl es nur einen Parameter gibt.


Schon, bissl blöd, dass TReader den "INDEX" aus der aktuellen Implementation verwendet, obwohl es in der Basisklasse garkeinen Index gibt.
Aber OK, dann wäre es zumindestens gut, wenn der Compiler hier wenigstens einen Hinweis oder besser noch einen Fehler mir entgegen werfen täte. (fast 2 Tage lang gesucht)

Eine Lösung wäre jetzt auch den Setter zu überschreiben:
Delphi-Quellcode:
type
  TSecondBugfixComp = class(TFirstComp)
  protected
    procedure SetTest(Index: Integer; Value: string);
    function StoredTest(Index: Integer): Boolean;
  published
    property TestProp index 1 write SetTest stored StoredTest;
  end;
So geht es erstmal, bis irgendwann TFirstComp auch einen Getter bekommt und es wieder knallt.

Alles überschreiben oder besser noch gleich das alte Property verdecken und durch eine Neudeklaration ersetzen:
Delphi-Quellcode:
type
  TSecondBugfix2Comp = class(TFirstComp)
  protected
    function GetTest(Index: Integer): string;
    procedure SetTest(Index: Integer; Value: string);
    function StoredTest(Index: Integer): Boolean;
  published
    property TestProp: string index 1 read GetTest write SetTest stored StoredTest;
  end;
Eigentlich wollte ich mir Arbeit ersparen und den Code kürzer/übersichtlicher halten, indem ich für mehrere Property nur eine StoredProc verwende, anstatt jeweils eine Eigene.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: ICH habe den ältesten OOP-Bug entdeckt :firejump: , leider.

  Alt 6. Nov 2017, 16:16
Der Bug ist, dass die Property Deklaration mit index aber ohne explizite Angabe von Getter und/oder Setter möglich ist - der Compiler müsste das verhindern, und/oder nicht einfach einen Getter/Setter mit falscher Signatur aufrufen.

Denn das knallt nicht nur beim Lesen aus der dfm sondern auch beim manuellen Setzen:

Delphi-Quellcode:
var
  s: TSecondComp;
begin
  s := TSecondComp.Create;
  s.TestProp := ''; // peng!
Delphi-Quellcode:
Project1.dpr.44: s.TestProp := '';
0041D567 33C9 xor ecx,ecx
0041D569 BA01000000 mov edx,$00000001 // <- index
0041D56E A1A4584200 mov eax,[$004258a4]
0041D573 E86CD2FFFF call TFirstComp.SetTest
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  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 04:13 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