Page 2 of 3
RedimDataWindow
Posted: Thu Feb 06, 2020 7:45 am
by lagraf
Hallo Karl-Heinz,
die Klasse RedimDataWindow ist nicht von mir, habe ich vor langer Zeit irgendwo mal bekommen. Das Array _aControls wird in RedimDataWindow:PostInit() befüllt:
Code: Select all
SELF:_aC := SELF:GetControls( ) // Alle Textcontrols nach SELF:_aC laden
nLen := ALen( SELF:_aC )
IF nLen == 0
ErrorBox{SELF, "Keine Controls gefunden"}:Show()
RETURN NIL
ENDIF
_aControls := ArrayNew( nLen )
FOR nI := 1 UPTO nLen
_aControls[nI] := { SELF:_aC[nI]:NameSym,;
Point{ SELF:_aC[nI]:Origin:X, SELF:_aC[nI]:Origin:Y }, ;
Dimension{ SELF:_aC[nI]:Size:Width, SELF:_aC[nI]:Size:Height } }
NEXT
RedimDataWindow
Posted: Thu Feb 06, 2020 8:12 am
by Karl-Heinz
Hallo Franz,
Ich habe einem MultiHB mal einen Font zugewiesen. Danach knallt es mal, mal nicht.
Anhand der exception ( siehe Anhang ) sieht man aber klar wo das Problem liegt, und zwar im HoverButton Dispatch():
Code: Select all
CASE oE:Message == WM_SETFONT
DeleteObject(SELF:lpHBInfo.hFont)
SELF:lpHBInfo.hFont := PTR(_CAST, oE:wParam) // <------------
Offenbar kommt da ab und an ein Float an, was dann zu dem "Conversion Error USUAL (FLOAT) to PTR" führt.
Da stellt sich die Frage wie so etwas zustande kommt ...
Gruß
Karl-Heinz
RedimDataWindow
Posted: Thu Feb 06, 2020 8:22 am
by Karl-Heinz
Hallo Franz,
Probier es mal mit diesen 3 Änderungen in der HoverButton Dispatch()
Code: Select all
METHOD Dispatch( oEvent ) // <------------------ Änderung oEvent anstatt oE
LOCAL lpRect IS _WINRECT
LOCAL lpPoint IS _WINPOINT
LOCAL dwMouse AS DWORD
LOCAL hParent AS PTR
LOCAL oE AS Event // <-------------------- neu
oE := oEvent // <-------------- neu
...
Gruß
Karl-Heinz
RedimDataWindow
Posted: Thu Feb 06, 2020 9:35 am
by lagraf
Hallo Karl-Heinz,
sieht gut aus, ich hab den Absturz mit den Änderungen nicht mehr zusammengebracht!
Könnte das ein Bug im X# sein?
RedimDataWindow
Posted: Thu Feb 06, 2020 9:41 am
by wriedmann
Hallo Franz,
prinzipiell hast Du recht, dass sich da X# teilweise anders verhält - und da handelt es sich immer um nicht typisierte Variablen.
Die Event-Parameter von Event-Methoden zu typisieren ist eigentlich immer eine gute Idee - auch in VO selber.
Und wenn ich irgendwo im bestehenden Code eine solche Methode ohne typisiertes Objekt sehe, passe ich das immer an.
Gerade bei Events bringt das Geschwindigkeit.
Wolfgang
P.S. das RedimDataWindow stammt ursprünglich mal von mir
RedimDataWindow
Posted: Thu Feb 06, 2020 1:17 pm
by Karl-Heinz
Hallo Franz,
Könnte das ein Bug im X# sein?
Ich kann absolut nicht einschätzen in wieweit man dem X# compiler all das beibringen kann was der VO compiler so treibt. In dem Fall hat man halt das "Pech", dass die Exception erst dann auftritt wenn ein anderer Font zugewiesen wird. Wenn Du allerdings zu Beginn den stack trace gezeigt hättest wäre das Problem sicherlich schneller zu beheben gewesen.
Gruß
Karl-Heinz
RedimDataWindow
Posted: Thu Feb 06, 2020 1:33 pm
by Karl-Heinz
und wie Wolfgang erwähnt hat, sollte die Lehre sein, spätestens nach einem Export alle vorhandenen Dispatcher wie beschrieben zu typisieren !
RedimDataWindow
Posted: Thu Feb 06, 2020 1:37 pm
by robert
Karl-Heinz,
>>SELF:lpHBInfo.hFont := PTR(_CAST, oE:wParam) // <------------
Any _CAST in the code should be reviewed.
Robert
RedimDataWindow
Posted: Thu Feb 06, 2020 2:40 pm
by lagraf
Hallo Karl-Heinz,
hast du den Stack Trace aus dem Error Objekt -> Stack oder ist dein Testprogramm mit dem Stack Trace direkt ausgestiegen? Ich habe immer nur uError:Description betrachtet und das zeigt ja nicht den Ort des Geschehens.
Die Dispatch Methode ist doch eine Callback Methode, wird also von VO bzw. X# aufgerufen. Wenn dabei ein fehlerhaftes oEvent mitkommt:
-> Ist das dann nicht ein Fehler in der Sprache / im Compiler?
-> Wenn ich LOCAL oE := oEvent AS Event zuordne und wParam ist falsch, sollte dann nicht dieses Statement auch abstürzen?
RedimDataWindow
Posted: Thu Feb 06, 2020 2:51 pm
by robert
Franz,
The problem is in the code that says:
SELF:lpHBInfo.hFont := PTR(_CAST, oE:wParam)
the PTR(_CAST tells the compiler:
I know what I am doing. Even though you think that wParam is numeric you should treat it as a pointer and assign it to the hFont field of lpHBInfo
As a result there may be a problem that is not properly handled by the compiler.
If you see a _CAST in your code you may want to revise that code.
Robert