Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Variable wird kein Wert zugewiesen
Bergmann89 - Di 23.09.08 14:08
Titel: Variable wird kein Wert zugewiesen
HI,
ich hab seit gestern Nacht n ganz seltsames Problem. Ich erstell grad n 3D-Chat und hab Probleme bei meiner Sprechblase. Wenn ich die so erstell:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38:
| constructor TSpeechBubble.Create(FontContextID: tsContextID; FontFileName: String; FontWidth: Integer; TextColor: TVector4f; Texture: TglBitmap2D); var i: Integer; begin inherited Create;
fFontFileName := FontFileName; fFontWidth := FontWidth; fSpeechBubble := Texture;
fH := 0; fW := 0; fMaxWidth := 3; fMaxHeight := 5; fShowTime := 10000; fTime := 10000; fFirstRun := True;
for i := 0 to 3 do fTextColor[i] := TextColor[i];
tsContextBind(FontContextID);
tsSetParameteri(TS_RENDERER, TS_RENDERER_OPENGL); CheckError; tsSetParameteri(TS_CREATOR, TS_CREATOR_GDI); CheckError; tsFontCreateCreator(pAnsiChar(fFontFileName), fFontWidth, TS_STYLE_BOLD, TS_DEFAULT, TS_DEFAULT, @fFontID); CheckError; tsPostAddShadow4f(1,0,0,1,1,1,0);
TexRect[0].Top := 1; TexRect[0].Bottom := 0.75; TexRect[0].Left := 0; TexRect[0].Right := 0.25; TexRect[1].Top := 1; TexRect[1].Bottom := 0.75; TexRect[1].Left := 0.25; TexRect[1].Right := 0.75; TexRect[2].Top := 1; TexRect[2].Bottom := 0.75; TexRect[2].Left := 0.75; TexRect[2].Right := 1;
TexRect[3].Top := 0.75; TexRect[3].Bottom := 0.5625; TexRect[3].Left := 0; TexRect[3].Right := 0.25; TexRect[4].Top := 0.5; TexRect[4].Bottom := 0.5; TexRect[4].Left := 0.5; TexRect[4].Right := 0.5; TexRect[5].Top := 0.75; TexRect[5].Bottom := 0.5625; TexRect[5].Left := 0.75; TexRect[5].Right := 1;
TexRect[6].Top := 0.5625; TexRect[6].Bottom := 0; TexRect[6].Left := 0; TexRect[6].Right := 0.25; TexRect[7].Top := 0.5625; TexRect[7].Bottom := 0; TexRect[7].Left := 0.25; TexRect[7].Right := 0.3515625; TexRect[8].Top := 0.5625; TexRect[8].Bottom := 0; TexRect[8].Left := 0.3515625; TexRect[8].Right := 1; end; |
dann ist fShowTime = 1065353216.
Wenn ich die Zuweisung ganz ans ende des Constructors schreibe, dann gehts?!
Und ich hab nochwas seltsames entdeckt:
Um den Text mit meiner Sprechblase ausgeben zu lassen hab ich ne eigene Prozedur geschrieben, in der weder fTime, noch fShowTime benutz werden. So ruf ich die Prozedur auf:
Delphi-Quelltext
1:
| if fTime < fShowTime then TextOut(fText); |
Und trotzdem wird kein Text (nur die leer Sprechblase) ausgegeben, wenn die Zuweisung in Create korrekt ist, also wenn fShowTime = 10000 ist, funktioniert zwar die ausgabe, aber der Text wird nich angezeigt. Und wenn fShowTime nich 10000 is, dann wird alles korrekt ausgegeben, aber die Sprechblase wird nich wieder ausgeblendet.
Könnt ihr mein Problem erkennen, oder hab ich das zu verwirrent geschrieben? (bin grad tot müde^^)
Wäre nett wenn jmd n Vorschlag hat, bin am Ende mit meinem Latein.
MfG Bergmann
Delete - Di 23.09.08 14:17
<Kristallkugel anwirf> scheint, dass Du ein paar grobe Initialisierungprobleme hast oder Du deine Variablen übschreibst, ach ja, zeile 382, spalte 18
Bergmann89 - Di 23.09.08 14:27
HI,
ich weiß das ich Initialisierungsprobleme hab, deshalb hab ich ja das Thema geschrieben! Ich versteh bloß nich, dass die Variable die richtigen Werte enthält, wenn ich sie ans ende des Creators schreib. Und ich hab auch schon durchdebuggt und die Zeile fTime := 10000 und fShowTime := 10000 wird auf alle fälle abgearbeitet!
MfG Bergmann.
Wolle92 - Di 23.09.08 14:39
was sagt dir denn der Debugger, was in der Variable drin steht, wenn die Zeile ausgeführt wird?
Und in welcher Zeile ändert sich der Wert wieder?
Hm, ich weiß nicht genau, ob man das direkt zu sehen bekommen kann bei D7...
Bergmann89 - Di 23.09.08 14:47
Also ich wüsst jetzt auch ncih wie das gehen soll^^
aber ich hab mir die Variablen nach der zuweisung mal als MessageBox ausgeben lassen.
direkt danach haben sie die korrekten erte, und am ende wieder falsch...
ich guck dann nochma durch. muss erstma los...
danke schonma für die hilfe!
matze - Di 23.09.08 15:38
doch das geht auch in Delphi 7 im Debugger, da bin ich mir relativ sicher.
Man kann so einen Watch-Ausdruck auf die Variable legen.
Aber im Debugger müsstest du doch eigentlich sehen, wann sich der Inhalt ändert, wenn du den Code zeilenweise durchgehst...
Bergmann89 - Di 23.09.08 16:39
HI,
hab mal durchprobiert: nach for i := 0 to 3 do fTextColor[i] := TextColor[i]; is fShowTime nich mehr 10000.
Und nochwas neben bei: wo find ich den richtigen debuger, hab das bis jetzt immer nur mit "Einzellne Anweisung" durchdebuggt, und mir die Variablen als Message ausgeben lassen :oops:
MfG Bergmann.
Boldar - Di 23.09.08 17:40
Ansicht-->Debug-Fenster-->Lokale Variablen
oder (bei mir) STRG+ALT+L
Delete - Di 23.09.08 17:52
alternativ z.b. debug informationen in datei oder, memo, oder... ausgeben lassen.
wenn ich mich recht erinnere, läuft das mit den watchpoints seit TP4
da ich immer noch meiner kristallkugel verlegt hab, musst schon selbst den debugger quälen...
Bergmann89 - Di 23.09.08 21:08
Boldar hat folgendes geschrieben: |
| Ansicht-->Debug-Fenster-->Lokale Variablen |
gibts bei mir net...
SvenAbeln - Mi 24.09.08 00:21
Bergmann89 hat folgendes geschrieben: |
Boldar hat folgendes geschrieben: | | Ansicht-->Debug-Fenster-->Lokale Variablen |
gibts bei mir net... |
Die Delphi 7 Personal war gerade beim Debugger etwas eingeschränkt.
Aber Delphi bietet noch weitere Möglichkeiten den Wert einer Variabel anzuzeigen.
1. Mauszeiger über die Variable, es öffnet sich ein Hint mit dem Wert. (Fehlt glaube ich auch in D7 Personal)
2. Cursor über Variable und Strg + F5, Variable wird ins Fenster "Überwachte Ausdrücke" eingetragen.
3. Cursor über Variable und Strg + F7, "Auswerten/Ändern". Wert wird angezeigt und kann verändert werden.
Hiermit kann man beim schrittweise debuggen immer die Werte überprüfen, ohne exta Messages auszugeben.
Also mal Haltepunkte setzten und dann Schritt für Schritt nachvollziehen wann der Wert wieder geändert wird.
jaenicke - Mi 24.09.08 02:01
Bergmann89 hat folgendes geschrieben: |
| hab mal durchprobiert: nach for i := 0 to 3 do fTextColor[i] := TextColor[i]; is fShowTime nich mehr 10000. |
Das sieht dann doch sehr danach aus als würdest du da irgendwo Speicher überschreiben, der gar nicht der richtige ist. Zum Beispiel passiert sowas, wenn du auf ein Element eines dynamischen Arrays zugreifst, dass es gar nicht gibt, weil der benutzte Index zu groß ist.
Bergmann89 - Mi 24.09.08 15:46
hm,
das einzige was mir jetzt dazu einfällt is: ich hab ein dyn. Array (wo die Player "abgelegt" sind), und das is z.B. 5 Elemente lang. und Element 1 und 2 sind aber nil. Aber vor jedem zugriff auf das Array frag ich mit Assigned(fPlayerList.Player[X]); ab, ob das Element vorhanden is? Könnte dass das Problem verursachen?
Ich hab jetzt mal die Unit die sich mit den Sprechblasen beschäftigt neu geschrieben (war nich viel, ne halbe Stunde Arbeit) und seit dem hab ich keine Probleme mehr gehabt.
MfG Bergmann.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!