![]() |
With - Variablen - Problem
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich habe ein Problem, das ich überhaupt nicht einordnen kann (siehe Bild, der Quelltext sieht durch meine Tests etwas durcheinander aus). Folgendes Problem: Ich nutze Eigenschaften der VirtualPrinbtEngine (VPE). Durch NextVPEPageOrientation wird u.a. VPE.nBottom auf 1,81 gesetzt. Diesen Wert kann ich nach der Prozedurausführung auch abfragen. Der weitere Programmverlauf hat jedoch im Bereich "with VPE..." immer mit 0 gearbeitet. Obwohl ich mir keiner Schuld bewusst war, bin ich davon ausgegangen, dass ich wohl eine lokale Variable nBottom definiert habe. Ich habe aber nichts gefunden. Also habe ich nBottom außerhalb der With-Klausel verwendet. Das bemeckert der Compiler und findet keine Definition für nBottom. Es dürfte demnach auch in keiner Unit (von Dritten) eine entsprechende Variable oder Konstante definiert sein. Die überwachten Ausdrücke akzeptieren jedoch nBottom zur Laufzeit... und geben 0 an!? Hat jemand eine Erklärung und Lösung dafür? Danke Stahli [edit=SirThornberry]Titel korrigiert - Mfg, SirThornberry[/edit] |
Re: With - Variablem - Problem
Wäre es nicht einfacher den Quelltext einfach hier reinzukopieren? :?
Lass mal das with weg. Das macht mehr Probleme als das es nützt. |
Re: With - Variablem - Problem
Obwohl ich kein radikaler Genger der with-Anweisung bin, halte ich den Gebrauch in diesem großen Bereich für bedenklich und unübersichtlich. Ich empfehle daher, auf den Gebrauch in diesem Fall zu verzichten - zumal der Name vpe auch recht kurz ist.
|
Re: With - Variablem - Problem
Ist VPE ein Record? Die With-Anweisung fixiert die Variable(n). Das ist auch bei 2009 schon so, oder? Passiert etwas hinter den Kulissen mit dem VPE, das man nicht erkennen kann?
|
Re: With - Variablem - Problem
Liste der Anhänge anzeigen (Anzahl: 2)
Danke schon mal für die Antworten. VPE ist eine Komponente.
Das Problem liegt offenbar gar nicht direkt beim "with". Ich habe das ganze mal noch etwas verkürzt und den with-Abschnitt komplett auskommentiert:
Delphi-Quellcode:
Die ersten zwei Zeilen akzeptiert der Compiler nicht mit der Meldung:
begin
NextVPEPageOrientation(VPE, VORIENT_LANDSCAPE); // outputdebugstring(pchar(inttostr(nbottom))); // Compiler meckert // outputdebugstring(pchar(floattostr(nbottom))); // Compiler meckert outputdebugstring(pchar(floattostr(vpe.nbottom))); outputdebugstring('-----------'); end; [DCC Fehler] frSystemMelee.pas(1423): E2003 Undeklarierter Bezeichner: 'nbottom' Ist ja auch i.O. Zur Laufzeit zeigen die überwachten Ausdrücke jedoch nbottom=0 an!? Im Kontextmenü der überwachten Ausdrücke sehe ich ungeführ, worauf sich die Ausdrücke beziehen (dazu doch nochmal ein Bild). Zur Laufzeit kann also offenbar auf eine "Integervariable nBottom" zugegriffen werden, die für den Compiler unbekannt ist. Die Eigenschaft VPE.nBottom ist dagegen vom Typ Double. Eine Deklaration nBottom finde ich nirgends. Ich hatte dann vermutet, dass das vielleicht mit FastMM zusammenhängt, da diese im Projektquelltext eingebunden wird und habe den ausgeklammert. Brachte aber nichts. Wenn ich nach der Speicheradresse suche finde ich eine entsprechende Deklaration. Ich kann aber noch nicht erkennen, in welcher Unit diese erfolgt. Wenn ich das Projekt mit F7 starte ist die Variable bereits vorhanden (wird also nicht später erst irgendwo eingebunden). Bin ziemlich ratlos, wie so etwas sein kann. Vielleicht ist die Variable in einer DCU deklariert, von der mir kein Quelltext vorliegt? Wie finde ich die dann heraus? Ein schnell angelegtes Testprojekt mit der VPE konnte das Problem nicht reproduzieren. Stahli |
Re: With - Variablem - Problem
"Schuld" sind die AlphaControls.
Mehr oder weniger auf Verdacht habe ich die AlphaControls (Alpha Skins) einmal aus meinem Projekt entfernt und damit das Problem behoben. Es stellen sich mir in dem Zusammenhang zwei Fragen: 1) Wie kann es sein, dass der Compiler die Variable nicht kennt, diese aber beim Start mit F7 sofort in den überwachten Ausdrücken verfügbar ist? 2) Warum greift die Regel nicht, dass Bezeichner innerhalb einer With-Anweisung vorrangig dem "With-Objekt" zugeordnet werden. Aus der Hilfe: "Jede Variablenreferenz und jeder Methodenname in einer with-Anweisung wird, wenn möglich, als Element des angegebenen Objekts bzw. Records interpretiert. Wenn in der with-Anweisung auf eine andere Variable oder Methode mit demselben Namen zugegriffen werden soll, ist ein Qualifizierer erforderlich:" PS: Klar kann ich an der Stelle auf "with" verzichten, mich würde aber auch das grundsätzliche Problem interessieren. Ist das Problem nachvollziehbar oder völlig unerklärlich (dann bestünde ja IMMER die Gefahr, dass das Programm zur Laufzeit auf irgendeine Variable zugreift, die dem Compiler noch unbekannt war)? :wall: :wall: :wall:
Delphi-Quellcode:
...hat gezeigt, dass das With-Problem in der Form gar nicht besteht.
outputdebugstring(pchar(floattostr(vpe.nbottom))); // = 1.81
with vpe do outputdebugstring(pchar(floattostr(nbottom))); // = 1.81 Lediglich beim "Einsehen" der Daten wird vom Debuger auf die falsche (nicht gemeinte) Variable zurückgegriffen. Es wäre in dem Zusammenhang sicher wünschenswert, wenn dieser im Hint bei MouseOver den With-Bezug erkennen würde. Die erste Frage bleibt aber m.E. durchaus berechtigt bestehen... So :!: Stahli |
Re: With - Variablem - Problem
Der Compiler kennt an der jeweiligen Position natürlich nur die Bezeichner, die auf Grund der eingebundenen Units gültig sind.
Der Debugger kennt alle globalen Bezeichner, sonst könnte man diese nicht sinnvoll überwachen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz