![]() |
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; ![]() |
AW: Werte unter Delphi XE2 zuweisen !?
Zitat:
Delphi-Quellcode:
excesiv. Manchmal ertappe ich mich dabei, dass ich mich selbst über mich ärgere, denn manchmal gehe auch ich für mich zu weit. Kaum kann ich zwei Bezeichner abkürzen, schon steht ein
with
Delphi-Quellcode:
dort. Manchmal sind
with
Delphi-Quellcode:
mehr Schreibarbeit als was ich mir mit with spare. So sehr liegt mir das inzwischen im Blut. Was ich damit sagen will ist - ich verwende es nicht gelegentlich, sondern extrem viel. Deshalb kann ich gut überblicken ob die Vor- oder Nachteile überwiegen.
with do begin end;
Wenn man meine ganzen Probleme mit with in den Jahren hoch rechnet, dann kann ich sie im wahrsten Sinne an einer Hand abzählen. Das mit dem Debuger ist eine andere Sache, aber auch hier ist es nur eine Frage der Technik und schon klappt es wieder. Ok, wer with nur gelegentlich anwendet, für den überwiegen die Nachteile wahrscheinlich. Aber nicht für den der sehr viel damit arbeitet. Allerdings gebe ich zu, dass das mit Rect und Left tatsächlich unglücklich ist. |
AW: Werte unter Delphi XE2 zuweisen !?
Die Ursache war einfach die neue und auch sinnvolle Erweiterung des TRect um Width und Height, die gab es halt zum Zeitpunkt der Erstellung noch nicht. Mal sehen, was die weitere Umstellung auf XE2 noch an Überraschungen bringt, die meisten Sachen laufen aber ohne Probleme. Anders sieht es bei Fremdkomponenten aus wie z.B. die DLLLoader.pas (BASS), die ich in älteren Spielen für die mp3-Wiedergabe nutze. Hier schmiert das Programm direkt beim Start ab, bleibt aber noch im Task-Manager drin.
Delphi-Quellcode:
Hier die entsprechende Function:
IF ASSIGNED(Stream) THEN BEGIN
Stream.Seek(0, soFromBeginning); IF Stream.Size>0 THEN BEGIN IF ReadImageHeaders THEN BEGIN IF InitializeImage THEN BEGIN IF ReadSections THEN BEGIN IF ProcessRelocations THEN BEGIN IF ProcessImports THEN BEGIN IF ProtectSections THEN BEGIN IF InitializeLibrary THEN BEGIN // Exception IF ProcessExports THEN BEGIN RESULT:=TRUE; END; END; END; ...
Delphi-Quellcode:
Aber das wäre nicht ganz so gravierend, da die Spiele nicht weiterentwickelt werden.
FUNCTION InitializeLibrary:BOOLEAN;
BEGIN RESULT:=FALSE; @DLLProc:=ConvertPointer(ImageNTHeaders.OptionalHeader.AddressOfEntryPoint); IF DLLProc(CARDINAL(ImageBase),DLL_PROCESS_ATTACH,NIL) THEN BEGIN RESULT:=TRUE; END; END; |
AW: Werte unter Delphi XE2 zuweisen !?
Die Frage ist eher, warum dort jemand versucht die DLL manuell zu laden und nicht die vorhandenen APIs nutzt?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:22 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