AGB  ·  Datenschutz  ·  Impressum  







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

With - Variablen - Problem

Ein Thema von stahli · begonnen am 15. Mär 2010 · letzter Beitrag vom 17. Mär 2010
Antwort Antwort
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#1

With - Variablen - Problem

  Alt 15. Mär 2010, 11:20
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]
Miniaturansicht angehängter Grafiken
withvar_134.png  
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: With - Variablem - Problem

  Alt 15. Mär 2010, 11:27
Wäre es nicht einfacher den Quelltext einfach hier reinzukopieren?

Lass mal das with weg. Das macht mehr Probleme als das es nützt.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

Re: With - Variablem - Problem

  Alt 15. Mär 2010, 11:27
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.
Uwe Raabe
  Mit Zitat antworten Zitat
Panthrax

Registriert seit: 18. Feb 2005
286 Beiträge
 
Delphi 2010 Enterprise
 
#4

Re: With - Variablem - Problem

  Alt 15. Mär 2010, 11:50
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?
"Es gibt keine schlimmere Lüge als die Wahrheit, die von denen, die sie hören, missverstanden wird."
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: With - Variablem - Problem

  Alt 15. Mär 2010, 12:34
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:
begin
  NextVPEPageOrientation(VPE, VORIENT_LANDSCAPE);
// outputdebugstring(pchar(inttostr(nbottom))); // Compiler meckert
// outputdebugstring(pchar(floattostr(nbottom))); // Compiler meckert
  outputdebugstring(pchar(floattostr(vpe.nbottom)));
  outputdebugstring('-----------');
end;
Die ersten zwei Zeilen akzeptiert der Compiler nicht mit der Meldung:
[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
Miniaturansicht angehängter Grafiken
nbottomadress_357.png   nbottom_902.png  
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: With - Variablem - Problem

  Alt 16. Mär 2010, 20:07
"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)?



Delphi-Quellcode:
outputdebugstring(pchar(floattostr(vpe.nbottom))); // = 1.81
with vpe do
  outputdebugstring(pchar(floattostr(nbottom))); // = 1.81
...hat gezeigt, dass das With-Problem in der Form gar nicht besteht.

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
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#7

Re: With - Variablem - Problem

  Alt 17. Mär 2010, 10:51
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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:42 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