AGB  ·  Datenschutz  ·  Impressum  







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

Delphi XE2 U4 Bug Ja/Nein?

Ein Thema von Schlingel · begonnen am 28. Jun 2012 · letzter Beitrag vom 29. Jun 2012
Antwort Antwort
Seite 1 von 2  1 2      
Schlingel

Registriert seit: 15. Feb 2003
Ort: Österreich
67 Beiträge
 
Delphi XE2 Professional
 
#1

Delphi XE2 U4 Bug Ja/Nein?

  Alt 28. Jun 2012, 13:31
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
Miniaturansicht angehängter Grafiken
first.jpg   next.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

AW: Delphi XE2 U4 Bug Ja/Nein?

  Alt 28. Jun 2012, 13:35
Afaik kennt TRect neuerdings Width und Height

wieder ein schönes Beispiel dafür warum "with" böse ist
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
BlackSeven

Registriert seit: 25. Sep 2004
79 Beiträge
 
Delphi XE7 Professional
 
#3

AW: Delphi XE2 U4 Bug Ja/Nein?

  Alt 28. Jun 2012, 13:37
siehe http://marc.durdin.net/2011/11/delph...with-with.html
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Delphi XE2 U4 Bug Ja/Nein?

  Alt 28. Jun 2012, 13:55
Zitat:
Afaik kennt TRect neuerdings Width und Height
Und noch viel mehr. (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.
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.
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (28. Jun 2012 um 14:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.331 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Delphi XE2 U4 Bug Ja/Nein?

  Alt 28. Jun 2012, 14:15
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Schlingel

Registriert seit: 15. Feb 2003
Ort: Österreich
67 Beiträge
 
Delphi XE2 Professional
 
#6

AW: Delphi XE2 U4 Bug Ja/Nein?

  Alt 29. Jun 2012, 09:22
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 Was bisher erfolgreich funktionierte, kann z.B. gegen Italien kräftig in die Hose gehen.

Schlingel (Österreicher mit italienischen Wurzeln)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Delphi XE2 U4 Bug Ja/Nein?

  Alt 29. Jun 2012, 09:35
Es ist wohl eher so, dass man mit dieser Funktion bisher Das Glück hatte, dass diese funktioniert hat.

Ich halte das 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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.331 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Delphi XE2 U4 Bug Ja/Nein?

  Alt 29. Jun 2012, 09:44
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 ), sehe ich schlicht den Sinn darin nicht, den Code damit mutwillig schlechter wartbar, schlechter debugbar, unübersichtlicher und fehleranfälliger zu machen.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Delphi XE2 U4 Bug Ja/Nein?

  Alt 29. Jun 2012, 10:00
Wenn man das 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;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.331 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Delphi XE2 U4 Bug Ja/Nein?

  Alt 29. Jun 2012, 10:14
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 07:23 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