Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Debuggen in "with" (https://www.delphipraxis.net/175532-debuggen.html)

Aviator 28. Jun 2013 21:50

Debuggen in "with"
 
Hi Leute,

mal eine (vielleicht) blöde Frage an alle Spezialisten hier. Ich programmiere nun auch schon länger mit Delphi und nutze auch den Debugger ziemlich oft. Bisher hatte ich auch nie Probleme damit bzw. konnte mir immer irgendwie weiterhelfen. Mich stört nur eine Sache relativ stark, bei der ich hoffe, dass man die irgendwie umgehen kann.

Das Problem liegt hier:
Delphi-Quellcode:
with Label1 do begin
  Canvas.Font.Size := 12;
  Canvas.Font.Name := 'Calibri';
  ...
end;
Das mal nur als Beispiel. Wenn ich jetzt die Maus auf Size halte, wird mir natürlich immer die Canvas.Font.Size der Form angezeigt und nicht auf das sich eigentlich beziehende Label. Meine Frage ist jetzt: Ist es irgendwie möglich, dem Debugger beizubringen, dass er mir den Wert des Labels zurückgibt wenn ich die Maus darauf halte und nicht den der Form ohne ihn in die Liste der überwachten Ausdrücke aufzunehmen?

Schonmal danke im Voraus für die Hilfe. Wenn noch Fragen dazu offen sind, einfach stellen.

Furtbichler 28. Jun 2013 22:03

AW: Debuggen in "with"
 
Einfach kein 'With' benutzen

p80286 28. Jun 2013 22:16

AW: Debuggen in "with"
 
Na klar, kein Problem:
Delphi-Quellcode:
Label1.Canvas.Font.Size := 12;
Label1.Canvas.Font.Name := 'Calibri';
Gruß
K-H

Aviator 28. Jun 2013 22:17

AW: Debuggen in "with"
 
Ja das es so geht ist mir klar. Gibt es aber keine Möglichkeit, das alles zu debuggen, ohne das "with" wegzulassen oder den Komponentennamen davor zu schreiben?

Sir Rufo 28. Jun 2013 22:41

AW: Debuggen in "with"
 
Zitat:

Zitat von Aviator (Beitrag 1219993)
Ja das es so geht ist mir klar. Gibt es aber keine Möglichkeit, das alles zu debuggen, ohne das "with" wegzulassen oder den Komponentennamen davor zu schreiben?

Nein

Aviator 28. Jun 2013 22:48

AW: Debuggen in "with"
 
Naja ok. Dann muss ich es weiterhin wie gewohnt machen. Danke für die Info.

Perlsau 29. Jun 2013 06:28

AW: Debuggen in "with"
 
Zitat:

Zitat von Aviator (Beitrag 1219996)
Naja ok. Dann muss ich es weiterhin wie gewohnt machen. Danke für die Info.

Die Verwendung von with ist generell problembehaftet und sollte daher grundsätzlich vermieden werden. Das Problem liegt darin, daß man in einem With-Block leicht einmal Befehle unterbringt, die sich gar nicht auf das With-Objekt beziehen sollen und damit Laufzeitfehler erzeugt, die dann nur sehr schwer zu finden sind. With ist im Prinzip nur eine scheinbare Erleichterung für Schreibfaule. Da ich auch dazu neige, eher weniger als mehr tippen zu müssen, kopiere ich mir in solchen Fällen das Objekt, dessen Properties und Methoden ich benötige, in den Zwischenspeicher und muß das dann auch nicht mehr tippen, in folgendem Fall die fett markierten Teile:

Label1.Canvas.Font.Size := 12;
Label1.Canvas.Font.Name := 'Calibri';
Label1.Canvas.Font.Color := clRed;
Label1.Canvas.Font.Style := [fsBold];

Das hat den zusätzlichen Vorteil, daß ich mittels Code-Vervollständigung die benötigten Properties ebenfalls nicht eintippen muß, sondern nach Eingabe des Punktes aus dem Kontextmenü auswählen kann, nachdem ich den ersten Buchstaben getippt habe.

jaenicke 29. Jun 2013 07:17

AW: Debuggen in "with"
 
Ein anderes Problem bei with ist, dass man z.B. darin Variablennamen benutzt, die dann z.B. durch ein Delphiupdate plötzlich auch in dem with Objekt verfügbar sind. Solche Probleme dann zu finden ist auch extrem aufwendig, da es keinerlei Compilerhinweise darauf gibt.

Zitat:

Zitat von Perlsau (Beitrag 1220004)
Da ich auch dazu neige, eher weniger als mehr tippen zu müssen, kopiere ich mir in solchen Fällen das Objekt, dessen Properties und Methoden ich benötige, in den Zwischenspeicher und muß das dann auch nicht mehr tippen, in folgendem Fall die fett markierten Teile:

Ich deklariere da schlicht eine Variable dafür und speichere das zwischen. So funktioniert intern with ja auch. Auf diese Weise ist der Quelltext übersichtlicher, aber nicht langsamer als mit with, ich kann ordentlich debuggen und es gibt keine möglichen Nebeneffekte.
Delphi-Quellcode:
var
  LabelFont: TFont;

LabelFont := Label1.Canvas.Font;
LabelFont.Size := 12;
LabelFont.Name := 'Calibri';
LabelFont.Color := clRed;
LabelFont.Style := [fsBold];

Perlsau 29. Jun 2013 07:27

AW: Debuggen in "with"
 
Zitat:

Zitat von jaenicke (Beitrag 1220007)
Ein anderes Problem bei with ist, dass man z.B. darin Variablennamen benutzt, die dann z.B. durch ein Delphiupdate plötzlich auch in dem with Objekt verfügbar sind. Solche Probleme dann zu finden ist auch extrem aufwendig, da es keinerlei Compilerhinweise darauf gibt.

Naja, das kann mir bei Delphi 2009 wohl eher nicht passieren :wink:
Ist aber dennoch ein gutes Argument :thumb:

Zitat:

Zitat von jaenicke (Beitrag 1220007)
Ich deklariere da schlicht eine Variable dafür und speichere das zwischen. So funktioniert intern with ja auch. Auf diese Weise ist der Quelltext übersichtlicher, aber nicht langsamer als mit with, ich kann ordentlich debuggen und es gibt keine möglichen Nebeneffekte.

Gute Idee! Du meinst, die wiederholte Qualifizierung macht den Code echt langsamer? Das muß ich mir merken ... :idea:

jaenicke 29. Jun 2013 10:22

AW: Debuggen in "with"
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Perlsau (Beitrag 1220009)
Du meinst, die wiederholte Qualifizierung macht den Code echt langsamer? Das muß ich mir merken ... :idea:

Es wird ja jedesmal der Getter der entsprechenden Eigenschaft aufgerufen. Je nachdem was dieser macht, kann das deutlich langsamer sein.
Und selbst wenn nur die entsprechende Position des Feldes in dem Objekt aufgelöst werden muss, weil es keinen Getter gibt, braucht das mindestens einen Assemblerbefehl pro Stufe mehr.
Dazu kommt, dass der Compiler beim einmaligen Abruf die Register besser optimieren kann, da er ermitteln kann von wo bis wo dieser konkrete Wert benötigt wird und diesen dann z.B. in einem Register halten kann.

Heißt: Langsamer ist es in jedem Fall, wie viel hängt vom konkreten Fall ab.

Im konkreten Fall werden bei jedem Aufruf nur 3 Assemblerbefehle eingespart, weil es keine Getter gibt. Den Unterschied siehst du hier:

Anhang 39501

Links siehst du wie die Kette von Label1 über Canvas und Font aufgelöst wird. Rechts wird der Wert im Stack an Adresse ebp-$08 gespeichert und dann jeweils nur daraus hervorgeholt um dann direkt für den Aufruf in eax gespeichert zu werden. (Das Objekt, auf das sich eine Methode bezieht, wird immer als erster Parameter in eax mitgegeben.)
Bei with kommt übrigens der gleiche Code heraus wie mit der Zwischenvariable, denn wie schon geschrieben macht with ja nichts anderes, nur eben schlechter.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:57 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