![]() |
Werte unter Delphi XE2 zuweisen !?
Ich wünsche euch allen FROHE OSTERN und recht fleißige Osterhasen und -häsinnen :-D
Bei der Umstellung auf Delphi XE2 treten in meinen Komponenten immer wieder Probleme bei Zuweisungen auf, die es unter Delphi 2007 nicht gab. Beispiel:
Delphi-Quellcode:
Auch bei Zeichenaktionen vergisst Delphi XE2 irgenwann die Beziehung zum Canvas, obwohl nirgends eine Ableitung erfolgte.
// unter Delphi 2007
with ARect do begin Left := 4; Right := Width - 4; Top := Height - 20; Bottom := Height; end; // NUR so klappt es unter XE2 ARect.Left := 4; ARect.Right := Width - 4; ARect.Top := Height - 20; ARect.Bottom := Height;
Delphi-Quellcode:
Liegt der Fehler nun an Embarcadero oder muss ich zukünftig die umständlichere Variante anwenden?
with Canvas do
begin ... end; Viel Spaß beim Ostereier suchen roga |
AW: Werte unter Delphi XE2 zuweisen !?
Was sind das für Probleme?
|
AW: Werte unter Delphi XE2 zuweisen !?
Das ist kein Fehler, sondern ist typisch für die Verwendung von with.
Mit XE2 hat TRect diverse Erweiterungen bekommen, unter anderem Width und Height als Eigenschaften. Deshalb bezieht sich das eben nicht mehr auf das Formular außen, sondern auf das Rechteck. In der VirtualTreeView war ähnlicher Code, nur mit Offset (das es nun auch in TRect gibt). Ohne with hätte sich auch der problemlos unter XE2 einfach wieder kompilieren lassen. :roll: Deshalb verwende ich selbst with nie. Es gibt damit immer nur unnötige Probleme, schwer zu findende Fehler und debuggen ist damit auch nicht sinnvoll möglich (weil man bei Auswertungen mit Strg + F7 usw. immer erst manuell den Inhalt des with dazuschreiben muss und andere Sachen gleich gar nicht gehen). Refactoring funktioniert auch nicht wirklich. Und übersichtlich ist das ganze auch nicht, weil man ständig rätseln muss worauf sich denn nun was bezieht. Eben weil die dann viel kürzeren Bezeichner oft nicht eindeutig sind. Wie du ja hier gerade selbst feststellen musstest. Deshalb verstehe ich immer nicht weshalb man sich das alles zumutet nur um ein paar Zeichen zu tippen zu sparen... :wall: |
AW: Werte unter Delphi XE2 zuweisen !?
Zitat:
roga |
AW: Werte unter Delphi XE2 zuweisen !?
@roga
Die Nachteile überwiegen definitiv, nicht nur wegen der Probleme beim Umstieg auf neuere Versionen, der häufig mühsamen Fehlersuche bei komplexeren Passagen mit derartigem Code, sondern auch weil so etwas einfach nicht "debugbar" ist. |
AW: Werte unter Delphi XE2 zuweisen !?
Es ist für die Abwärtskompatibilität nicht unbedingt optimal, aber es betrifft auch ausschließlich die Verwendung von WITH.
PS: Ich hab bisher zufällig intuitiv vorwiegend immer nur eine Seite über das With geregelt und die andere Seite nicht, womit es damit nun auch fast keine Probleme durch derartige Erweiterungen gibt. Nicht unbedinbt bei TRect, TPoint und Co., aber vorallem bei Objekten war es absehbar, daß diese irgendwann auch mal erweitert werden. Wer das WITH gedankenlos nutzt, ist MBMN selbst dran Schuld. Für neue Projekte ist es definitiv eine Vereinfachung des Codes und beim Suchen nach Funktionen, denn die gammeln nun nicht mehr unbekannt irgendwo rum, sondern hängen direkt dran. Und was die Abwärtskompatibilität angeht: Bis D2006/TDE hinunter kann man das neue XE2-Verhalten nachrüsten. |
AW: Werte unter Delphi XE2 zuweisen !?
Zitat:
|
AW: Werte unter Delphi XE2 zuweisen !?
Zitat:
Jedenfalls hat der Debugger das WITH meistens gut auflösen können. (wenn der Debugger nicht durch andere Dinge behindert wurde, wie BPLs, DLL/EXE-Modulgrenzen, Generics und andere Debugger-/Compilerfehler) |
AW: Werte unter Delphi XE2 zuweisen !?
@himitsu
Ich habe die gegenteilige Erfahrung gemacht, ein Kollege von mir setzt exzessiv With Statements ein, auch mehrfach verschachtelt, in der Art
Delphi-Quellcode:
Wenn man hier etwas debuggen will muss man immer den wieder zusammengesetzten Ausdruck in die Überwachung nehmen, bei einem Mouseover läuft gar nichts, außer dass sich der Debugger bisweilen aufhängt und die ganze IDE mitnimmt
With MyAdodatset do
begin For .... Fields[i].irendwas .... With aCanvas do ... end; |
AW: Werte unter Delphi XE2 zuweisen !?
Wenn man unbedingt
Delphi-Quellcode:
benutzen möchte, dann sollte man sich entweder ausschließlich auf dieses Objekt beschränken oder eben alles direkt referenzieren.
with
Das genannte Beispiel sollte so reibungslos funktionieren:
Delphi-Quellcode:
Allerdings habe ich so den Verdacht, dass hier von einer Form der innere Bereich ohne den Rand ermittelt werden soll, und das geht natürlich erheblich einfacher (und vor allem funktioniert das bei jedem Theme und jeder Darstellungsart) mit
// unter Delphi 2007 und XE2
with ARect do begin Left := 4; Right := Self.Width - 4; Top := Self.Height - 20; Bottom := Self.Height; end; ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 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