Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi XE2 U4 Bug Ja/Nein? (https://www.delphipraxis.net/169098-delphi-xe2-u4-bug-ja-nein.html)

Schlingel 28. Jun 2012 13:31

Delphi XE2 U4 Bug Ja/Nein?
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo

Ich habe unlängst mal in diesem Thread http://www.delphipraxis.net/168136-x...ml#post1165205 um Hilfe gebeten, da ich ein Programm auf D2007 zum Laufen brachte aber mit XE2 zwar kompilieren aber komische Speicherüberläufe nach dem starten der Exe bekam.

Ich bin nun der Sache nachgegangen und hab mich durch den Code gearbeitet.

Original:
Delphi-Quellcode:
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;
von mir für Testzwecke ergänzt:
Delphi-Quellcode:
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;
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?
- Ist das ein XE2 Bug?
- Könnt ihr dies auf verschiedenen Delphi Versionen nachvollziehen?

Danke Schlingel

Bummi 28. Jun 2012 13:35

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

BlackSeven 28. Jun 2012 13:37

AW: Delphi XE2 U4 Bug Ja/Nein?
 
siehe http://marc.durdin.net/2011/11/delph...with-with.html

himitsu 28. Jun 2012 13:55

AW: Delphi XE2 U4 Bug Ja/Nein?
 
Zitat:

Afaik kennt TRect neuerdings Width und Height
Und noch viel mehr. :thumb: (ich find das auch ein bissl OOP-mäßiger und vorallem praktischer, da diese Funktionen nun nicht mehr sonstwo losgelöst rumschwirren)

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 Delphi-Referenz durchsuchenRect-Funktion auch schon indirekt mit genannt.

jaenicke 28. Jun 2012 14:15

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.

Schlingel 29. Jun 2012 09:22

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)

Sir Rufo 29. Jun 2012 09:35

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:
with
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.

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;

jaenicke 29. Jun 2012 09:44

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.

Sir Rufo 29. Jun 2012 10:00

AW: Delphi XE2 U4 Bug Ja/Nein?
 
Wenn man das
Delphi-Quellcode:
with
innerhalb einer Methode benutzt, dann kann man auch dort für Eindeutigkeit sorgen:
Delphi-Quellcode:
function TFoo.Foo( aWidth : integer ) : TRect;
begin
  with Result do
  begin
    Left := Width + aWidth + Self.Width;
  end;
end;

jaenicke 29. Jun 2012 10:14

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:
function TFoo.Foo(const AWidth: Integer): TRect;
begin
  Result.Left := Result.Width + AWidth + Self.Width;
end;
Leichter lesbar und man kann es sogar gut debuggen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:01 Uhr.
Seite 1 von 2  1 2      

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