Ik heb een stuk code (even versimpeld) dat altijd goed werkte.
Code:
TTestThread = class(TThread)
private
Data: record
Test,// : Extended;
Test1: Extended;
end;
procedure SetTest(AValue: Extended);
procedure SetTest1(AValue: Extended);
protected
procedure Execute; override;
public
property Test: Extended read Data.Test write SetTest;
property Test1: Extended read Data.Test1 write SetTest1;
end;
Maar sinds de overgang van XE8 naar DX10 gaat er iets mis als ik bovenstaande in Win32 compileer.
via de onderstaande button click test ik het object:
Code:
procedure TTestForm.TestBtnClick(Sender: TObject);
var
tt : TTestThread;
t,
t1 : Extended;
begin
tt := TTestThread.Create(true);
with tt do
try
Test := 12.3;
Test1 := 45.6;
try
t := Test;
t1 := Test1;
Self.Caption := Format('Test=%.1f | Test1=%.1f', [t, t1]);
except
on E:Exception do Application.MessageBox(PChar(E.Message), 'Foutje')
end;
finally
Free
end
end;
Als ik via de properties Test en Test1 schrijf en daarna de waardes teruglees in t en t1 dan komt de t1 niet overeen (3,72036854775808e+2959 ipv 45.6)
Als ik echter een break plaats en via de debugger de waardes in tt.Data bekijk, dan staan daar wel de goede waardes?!?
Het onderstaande heb ik al geprobeerd en getest.
Als ik in Win64 compileer gaat het goed.
Als ik Double ipv Extended gebruik gaat het goed.
Als ik Test direct als Extended definieer gaat het goed.
Daarnaast gaat het ook goed
als ik een getter én een setter gebruik
of als ik géén getter en géén setter gebruik.
Dus ik kan er omheen werken, maar ben wel benieuwd waardoor dit optreedt?
En het feit dat Win32 tov Win64 compileren (voor het eerst) een probleem geeft in "simpele" code, doet mij diep fronsen.
Moeten Embarcadero wakker geschopt worden of zie ik iets over het hoofd?
Bookmarks