![]() |
Delphi XE2 U4 Bug Ja/Nein?
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo
Ich habe unlängst mal in diesem Thread ![]() Ich bin nun der Sache nachgegangen und hab mich durch den Code gearbeitet. Original:
Delphi-Quellcode:
von mir für Testzwecke ergänzt:
function RectFromSize(X, Y, Width, Height: integer): TRect;
begin with Result do begin Left := X; Top := Y; Right := (Left + Width); Bottom := (Top + Height); end; end;
Delphi-Quellcode:
Ich habe zwei Screenshots angehängt mit den Ergebnissen... Was sagt ihr dazu? Warum ist die erste Variante("with"), die auf D2007 einwandfrei funktioniert im Ergebniss nicht korrekt?
function RectFromSize(X, Y, Width, Height: integer): TRect;
begin with Result do begin Left := X; Top := Y; Right := (Left + Width); Bottom := (Top + Height); end; sleep(0); // MIL Result.Left := X; Result.Top := Y; Result.Right := Result.Left + Width; Result.Bottom := Result.Top + Height; Result.Left := X + Y; //nur damit ich einen Haltepunkt erhalte und nicht X/Y wegoptimiert wird.. end; - Ist das ein XE2 Bug? - Könnt ihr dies auf verschiedenen Delphi Versionen nachvollziehen? Danke Schlingel |
AW: Delphi XE2 U4 Bug Ja/Nein?
Afaik kennt TRect neuerdings Width und Height
wieder ein schönes Beispiel dafür warum "with" böse ist |
AW: Delphi XE2 U4 Bug Ja/Nein?
|
AW: Delphi XE2 U4 Bug Ja/Nein?
Zitat:
Tja, wobei der CodeEditor und die OH einem das auch hätte verraten können. Die OH erwähnt ja das Width und die anderen praktischen Record-Methoden und der Codeeditor zeigt dir als Hint an, von wo das Width kommt, bzw. man kann ihn sagen "bring mich zur Deklaration". Auch das Debuggen ist soeine schöne Sache, falls man es mal benutzt. :stupid: PS: Es schadet auch niemal ein Blick in die Codevervollständigung. (da entdeckt man auch ganz schnell die neuen Funktionen ... OK, nicht innerhalb des WITHs, aber selbst Schuld) Obwohl das seit Jahren auch ohne das böse WITH geht und das auch noch mit wesentlich kürzerem Code. :angle2:
Delphi-Quellcode:
Result := Rect(X, Y, Left + Width, Bottom + Height);
[edit] Ich seh grad, der verlinkte Marc hat die ![]() |
AW: Delphi XE2 U4 Bug Ja/Nein?
Das gleiche passierte auch bei der VirtualTreeView, da hatte die alte Version das gleiche Problem beim Update auf XE2. Dort war das Glück, dass es einen Fehler beim Kompilieren gab. An anderer Stelle, gibt es eben nur schwer nachvollziehbare Fehler.
Typisch with eben, wie schon geschrieben wurde. Unsauber bis zum geht nicht mehr. ;-) Wir werfen das nach und nach aus unserem Code überall heraus, damit der besser wartbar und übersichtlicher ist. |
AW: Delphi XE2 U4 Bug Ja/Nein?
Danke für's Feedback...
Nun es ist schon blöd, wenn eine fremde Komponente/Demo-Anwendung unter D2005/D2007 und XE einwandfrei funktioniert. Die Steigerung war eben auch, daß sich unter XE2 das Projekt anstandslos kompilieren und sogar gestartet werden konnte. Die nach wenigen Sekunden aber auftretende Exception ".. nicht genügend Speicher etc.." konnte ich aber nicht zuordnen. Daher die aufwendige Suche in einer nicht selbst erstellten Anwendung. PS: ... ist so wie im Fußball :lol: Was bisher erfolgreich funktionierte, kann z.B. gegen Italien kräftig in die Hose gehen. Schlingel (Österreicher mit italienischen Wurzeln) |
AW: Delphi XE2 U4 Bug Ja/Nein?
Es ist wohl eher so, dass man mit dieser Funktion bisher Das Glück hatte, dass diese funktioniert hat.
Ich halte das
Delphi-Quellcode:
auch nicht für grundböse, man muss nur den Einsatz sehr genau planen und die äußeren Variablen, Methoden, etc. möglichst eindeutig halten.
with
Es gab hier auch schon mal eine Diskussion bzgl. Styleguide und die Benennung von Parametern, lokalen Variablen, etc. Mit dieser Erkenntnis würde man auf folgendes kommen:
Delphi-Quellcode:
function RectFromSize(aX, aY, aWidth, aHeight: integer): TRect;
begin with Result do begin Left := aX; Top := aY; Right := (Left + aWidth); Bottom := (Top + aHeight); end; end; |
AW: Delphi XE2 U4 Bug Ja/Nein?
Ja, natürlich, was Parameter angeht ist es natürlich sowieso äußerst unsauber da Standard-Bezeichner wie Width oder Height zu verwenden.
Nichtsdestotrotz hättest du das Problem aber immer noch gehabt, wenn das ganze in einer Methode eines Formulars stünde, in der du mit Width und Height auf das Formular zugegriffen hättest. Dann würde sich das bei XE2 plötzlich auf das TRect in der with-Klausel beziehen. Und von daher wirst du bei Verwendung von with niemals solche schwer zu findenden Probleme gänzlich ausschließen können, weshalb ich es nach wie vor für sehr gefährlich halte. Und da es auch keine echten Vorteile bietet (abgesehen von ein paar Zeichen weniger zu tippen :roll:), sehe ich schlicht den Sinn darin nicht, den Code damit mutwillig schlechter wartbar, schlechter debugbar, unübersichtlicher und fehleranfälliger zu machen. |
AW: Delphi XE2 U4 Bug Ja/Nein?
Wenn man das
Delphi-Quellcode:
innerhalb einer Methode benutzt, dann kann man auch dort für Eindeutigkeit sorgen:
with
Delphi-Quellcode:
function TFoo.Foo( aWidth : integer ) : TRect;
begin with Result do begin Left := Width + aWidth + Self.Width; end; end; |
AW: Delphi XE2 U4 Bug Ja/Nein?
Und man kann es auch gleich ordentlich schreiben, dann sieht man sogar gleich was da passiert.
Delphi-Quellcode:
Leichter lesbar und man kann es sogar gut debuggen.
function TFoo.Foo(const AWidth: Integer): TRect;
begin Result.Left := Result.Width + AWidth + Self.Width; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 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