Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Warum wird die variable nicht befüllt?


Krischa - Mi 27.05.09 11:30
Titel: Warum wird die variable nicht befüllt?

Delphi-Quelltext
1:
2:
3:
showmessage(query1.FieldByName('Vp').value);
netto2:=netto2+query1.fieldbyname('vp').Value;
netto:=netto+query1.fieldbyname('vp').value;


hallo,
warum wird netto(lokale variable) befüllt aber netto2(gloale variable) nicht?

kann es sein das es eine beschränkung der anzahl an variablen in delphi gibt?


freedy - Mi 27.05.09 11:35

Hallo Krischa,

dein bisheriger Code sieht eigentlich gut aus. Da sollte nicht das Problem liegen. Hast du evtl. noch mehr?

Grüße,
Michael


Krischa - Mi 27.05.09 11:38

Welchen Teil soll ich noch reinstellen? Er befüllt halt Netto und Netto2 nicht.
Der Code war Ursprünglich ohne netto2 und hat funktioniert. Später ist mir Aufgefallen das ich die Werte noch brauche und wollte sie in einer globalen Variable speichern.


Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
var rle,dmin,dmax,Name1,Name2,datensatz:string;
    rechn:Tstringlist;
    betrag,netto,mwsteuer,pfand:double;




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
implementation

{$R *.dfm}
var //Variablen allgemein
    hpfad,abe,kun,kun_s,art,mws,sko,mze,firma,pfad2,fma:string;
    pfad1,kun1,abe1,kun_s1,art1,mws1,sko1,mze1,firma1:string;
    sre,mwss:Tstringlist;
    ebetrag1,ebetrag2,ebetrag3,ebetrag4:double;
    netto0,netto1,netto2:double;


freedy - Mi 27.05.09 11:42

Was passiert denn, wenn du Netto2 := Netto; setzt?


Nersgatt - Mi 27.05.09 11:45

Was heißt, Netto2 wird nicht befüllt? :gruebel:
Was steht vorher drin, was steht nachher drin und was steht in den Value von Deinen Field?


Krischa - Mi 27.05.09 11:47

Also habe jetzt folgendes gemacht:

Delphi-Quelltext
1:
netto2:=netto2+netto;                    

aber es kommt immernoch 0 bei netto2 raus :cry:

Irgendwie bekomme ich das gefühl er gibt netto2 keinen Speicherplatz

@[quote]nersgatt Er weißt der variablen den Wert nicht zu und bei der Ausgabe ist sie dann halt 0. und in den Feldern der DB sind auch zahlen drinsonst hätte er ja netto nichts zuweisen können.


Delete - Mi 27.05.09 11:49

Hast Du schon durchgesteppt und Dir den Variableninhalt mal angeschaut?


jaenicke - Mi 27.05.09 11:52

Außerdem solltest du bei derart vielen globalen Variablen mal dein Konzept überdenken, ist ja kein Wunder, dass es da Probleme gibt. Das kann man ja kaum noch überblicken (zumindest später) auf was von wo zugegriffen wird...


Krischa - Mi 27.05.09 11:56

Bei durchstepen ist netto2 immer 0.

und zum überblick mit den Variablen. Ich arbeite an einem größeren Projekt und habe auch Listen mit Variablen und deren Eigenschaften(wo deklariert, wo befüllt,...). Den überblick verliert man nicht sooo schnell :D


jaenicke - Mi 27.05.09 12:10

user profile iconKrischa hat folgendes geschrieben Zum zitierten Posting springen:
Bei durchstepen ist netto2 immer 0.
Und du bist sicher, dass du nirgends eine gleichnamige Variable oder Eigenschaft hast?

user profile iconKrischa hat folgendes geschrieben Zum zitierten Posting springen:
Ich arbeite an einem größeren Projekt und habe auch Listen mit Variablen und deren Eigenschaften(wo deklariert, wo befüllt,...).
Sowas brauche ich erst gar nicht, globale Variablen benutze ich praktisch nicht und die Namen der Eigenschaften sind so gewählt, dass man ohnehin direkt sieht was drin steht.


Delete - Mi 27.05.09 12:18

Ich würde nach Möglichkeit auch auf globale Variablen verzichten und stattdessen Properties definieren. Diese haben u.a. den Vorteil, dass sie an eine Instanz gebunden sind, d.h. wenn Du 2 Instanzen derselben Klasse erzeugst, greifen beide auf Ihre eigenen Properties zurück, wobei sie sich globale Variablen im worst case gegenseitig überschreiben.


Krischa - Mi 27.05.09 12:20

Also beim Durchsteppen zeigt er nun doch die korrekten Werte an. Aber wenn ich dann darauf zugreifen will sind sie wieder 0. Die variable wird aber nicht auf 0 zurückgesetzt. Und nein es gibt keine zweite Variable von dem Namen. Sobald er mit der Schleife fertig ist sind die Werte wieder 0.


Nersgatt - Mi 27.05.09 12:34

Dann zeigt man die ganze Schleife.


Krischa - Mi 27.05.09 12:46

Habe das Problem gelöst, aber weiß nicht warum.
Ich habe nach jedem Schleifendurchlauf ein showmessage(floattostr(netto2)); gemacht und auf einmal konnte er sich den wert merken.

:shock:


jaenicke - Mi 27.05.09 12:48

Also das hört sich dann fast nach einem Speicherproblem aus...
Warum solche Fehler zufällig irgendwo andere unerklärliche Fehler verursachen habe ich hier mal (nicht auf den PC bezogen) erklärt:
http://www.delphi-forum.de/viewtopic.php?p=527022#527022
(Und auch warum ein simples ShowMessage das beheben kann.)

Wenn das eine lokale danach nicht mehr verwendete Variable wäre, würde die einfach wegoptimiert, aber bei einer globalen sollte das nicht passieren. Im Debugger kann das aber schon trotzdem so sein, wenn die Optimierung eingeschaltet ist (sollte sie beim Debuggen ja nicht sein).


Krischa - Mi 27.05.09 12:52

Sehr interessanter Beitrag. Also hat mein showmessage den SPeicher für die Variable verändert? Und warum tauchen solche Probleme auf? Und nun habe ich das showmessage wieder gelöscht und es geht immernoch! :lol:


jaenicke - Mi 27.05.09 12:55

Sehr oft passiert so etwas bei dynamischen Arrays, wo man aus Versehen den Bereich überschritten hat und auf nicht existierende Indizes schreibt.
Die Bereichsüberprüfung sollte das in den meisten Fällen dann melden, diese lässt sich hier einschalten:
Projekt --> Optionen... --> Compiler --> Laufzeitfehler --> Bereichsüberprüfung
oder in neuen Versionen:
Projekt --> Optionen... --> Delphi-Compiler --> Compilieren --> Laufzeitfehler --> Bereichsüberprüfung
Das deckt in den meisten Fällen auf, wenn du z.B. einen Index größer als der maximale Index in einem dynamischen Arrays benutzt.