|
| Fejl i Delphi 6? Fra : Asger Grunnet |
Dato : 26-11-01 23:22 |
|
Hej med jer!
Jeg har for nyligt opgraderet fra Delphi 5 til Delphi 6 og er
stødt på en mærkværdighed.
Den følgende kode virker som forventet (det forudsættes at der
findes en fil der hedder e:\Test.txt og som har længde mindst 10) :
procedure TForm1.Button1Click(Sender: TObject);
var
wStream : TFileStream;
wPos : Integer;
wSize : Integer;
begin
wStream := TFileStream.Create('e:\Test.txt', fmOpenRead or fmShareDenyNone);
try
wStream.Seek(10, soFromBeginning);
wPos := wStream.Position;
wSize := wStream.Size;
ShowMessage(IntToStr(wPos) + ' ' + IntToStr(wSize));
finally
wStream.Free;
end;
end;
Men hvis jeg placerer et breakpoint på linien med ShowMessage, og
tilføjer wStream.Position og wStream.Size til Watch-listen, så
påstår Delphi 6 at værdierne er 0! Der er ikke noget problem i Delphi 5.
Er det bare min Delphi installation der er mærkelig, eller hvad?
/Asger
| |
Thomas Rose (27-11-2001)
| Kommentar Fra : Thomas Rose |
Dato : 27-11-01 08:16 |
|
Hej Asger,
jeg ved ikke om det er en fejl i Delphi 6 (jeg bruger selv D5), men jeg ved
at der findes en bug i D5 der minder om det - hvor debuggeren/"Code Insight"
kan finde på at skrive at en objektreference er "nil" selvom det i
virkeligheden er en peger til et validt objekt. Har du prøvet at skrive
værdierne ud på skærmen, for at verificere de tal som Delphi 6 selv oplyser?
Cheers,
Thomas
"Asger Grunnet" <asger@adslhome.dk> wrote in message
news:3c02c10c$0$223$edfadb0f@dspool01.news.tele.dk...
> Hej med jer!
>
> Jeg har for nyligt opgraderet fra Delphi 5 til Delphi 6 og er
> stødt på en mærkværdighed.
>
> Den følgende kode virker som forventet (det forudsættes at der
> findes en fil der hedder e:\Test.txt og som har længde mindst 10) :
>
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
> wStream : TFileStream;
> wPos : Integer;
> wSize : Integer;
> begin
> wStream := TFileStream.Create('e:\Test.txt', fmOpenRead or
fmShareDenyNone);
> try
> wStream.Seek(10, soFromBeginning);
> wPos := wStream.Position;
> wSize := wStream.Size;
> ShowMessage(IntToStr(wPos) + ' ' + IntToStr(wSize));
> finally
> wStream.Free;
> end;
> end;
>
>
> Men hvis jeg placerer et breakpoint på linien med ShowMessage, og
> tilføjer wStream.Position og wStream.Size til Watch-listen, så
> påstår Delphi 6 at værdierne er 0! Der er ikke noget problem i Delphi 5.
>
> Er det bare min Delphi installation der er mærkelig, eller hvad?
>
> /Asger
>
>
| |
Asger Grunnet (27-11-2001)
| Kommentar Fra : Asger Grunnet |
Dato : 27-11-01 18:59 |
|
"Thomas Rose" <trose@get2net.dk> wrote in message news:3c033d7f$0$738$edfadb0f@dspool01.news.tele.dk...
> Hej Asger,
>
> jeg ved ikke om det er en fejl i Delphi 6 (jeg bruger selv D5), men jeg ved
> at der findes en bug i D5 der minder om det - hvor debuggeren/"Code Insight"
> kan finde på at skrive at en objektreference er "nil" selvom det i
> virkeligheden er en peger til et validt objekt.
Det har jeg til gengæld ikke været ude for!
> Har du prøvet at skrive
> værdierne ud på skærmen, for at verificere de tal som Delphi 6 selv oplyser?
Ja, kaldet til ShowMessage i min kode-stump (indkluderet nedenunder) skriver de
korrekte værdier ud, og programmet virker som sagt også upåklageligt. Det er kun
i debuggeren der er et problem. Det er selvfølgelig ikke noget stort problem.
Det kan bare være lidt irriterende, at jeg indimellem ikke kan se de rigtige værdier
når jeg debugger.
/Asger
> "Asger Grunnet" <asger@adslhome.dk> wrote in message
> news:3c02c10c$0$223$edfadb0f@dspool01.news.tele.dk...
> > Hej med jer!
> >
> > Jeg har for nyligt opgraderet fra Delphi 5 til Delphi 6 og er
> > stødt på en mærkværdighed.
> >
> > Den følgende kode virker som forventet (det forudsættes at der
> > findes en fil der hedder e:\Test.txt og som har længde mindst 10) :
> >
> >
> > procedure TForm1.Button1Click(Sender: TObject);
> > var
> > wStream : TFileStream;
> > wPos : Integer;
> > wSize : Integer;
> > begin
> > wStream := TFileStream.Create('e:\Test.txt', fmOpenRead or fmShareDenyNone);
> > try
> > wStream.Seek(10, soFromBeginning);
> > wPos := wStream.Position;
> > wSize := wStream.Size;
> > ShowMessage(IntToStr(wPos) + ' ' + IntToStr(wSize));
> > finally
> > wStream.Free;
> > end;
> > end;
> >
> >
> > Men hvis jeg placerer et breakpoint på linien med ShowMessage, og
> > tilføjer wStream.Position og wStream.Size til Watch-listen, så
> > påstår Delphi 6 at værdierne er 0! Der er ikke noget problem i Delphi 5.
> >
> > Er det bare min Delphi installation der er mærkelig, eller hvad?
> >
> > /Asger
| |
Peter Petersen (27-11-2001)
| Kommentar Fra : Peter Petersen |
Dato : 27-11-01 20:07 |
|
Jeg har oplever det samme når jeg debugger.
Jeg tror der er tale om en compiler optimering.
Dette begrunder jeg i, at årsagen til det du oplever er, at du sætter dit
breakpoint efter at du er færdig med at anvende objektet, og det faktisk
ikke har nogen yderligere anvendelse i programmet. Havde du istedet sat dit
break på
wPos := wStream.Position;
ville du have set, at objekterne stadig indeholdt de rigtige værdier.....
M.v.h.
Peter
"Asger Grunnet" <asger@adslhome.dk> wrote in message
news:3c03d4fa$0$731$edfadb0f@dspool01.news.tele.dk...
>
> "Thomas Rose" <trose@get2net.dk> wrote in message
news:3c033d7f$0$738$edfadb0f@dspool01.news.tele.dk...
> > Hej Asger,
> >
> > jeg ved ikke om det er en fejl i Delphi 6 (jeg bruger selv D5), men jeg
ved
> > at der findes en bug i D5 der minder om det - hvor debuggeren/"Code
Insight"
> > kan finde på at skrive at en objektreference er "nil" selvom det i
> > virkeligheden er en peger til et validt objekt.
>
> Det har jeg til gengæld ikke været ude for!
>
> > Har du prøvet at skrive
> > værdierne ud på skærmen, for at verificere de tal som Delphi 6 selv
oplyser?
>
> Ja, kaldet til ShowMessage i min kode-stump (indkluderet nedenunder)
skriver de
> korrekte værdier ud, og programmet virker som sagt også upåklageligt. Det
er kun
> i debuggeren der er et problem. Det er selvfølgelig ikke noget stort
problem.
> Det kan bare være lidt irriterende, at jeg indimellem ikke kan se de
rigtige værdier
> når jeg debugger.
>
> /Asger
>
> > "Asger Grunnet" <asger@adslhome.dk> wrote in message
> > news:3c02c10c$0$223$edfadb0f@dspool01.news.tele.dk...
> > > Hej med jer!
> > >
> > > Jeg har for nyligt opgraderet fra Delphi 5 til Delphi 6 og er
> > > stødt på en mærkværdighed.
> > >
> > > Den følgende kode virker som forventet (det forudsættes at der
> > > findes en fil der hedder e:\Test.txt og som har længde mindst 10) :
> > >
> > >
> > > procedure TForm1.Button1Click(Sender: TObject);
> > > var
> > > wStream : TFileStream;
> > > wPos : Integer;
> > > wSize : Integer;
> > > begin
> > > wStream := TFileStream.Create('e:\Test.txt', fmOpenRead or
fmShareDenyNone);
> > > try
> > > wStream.Seek(10, soFromBeginning);
> > > wPos := wStream.Position;
> > > wSize := wStream.Size;
> > > ShowMessage(IntToStr(wPos) + ' ' + IntToStr(wSize));
> > > finally
> > > wStream.Free;
> > > end;
> > > end;
> > >
> > >
> > > Men hvis jeg placerer et breakpoint på linien med ShowMessage, og
> > > tilføjer wStream.Position og wStream.Size til Watch-listen, så
> > > påstår Delphi 6 at værdierne er 0! Der er ikke noget problem i Delphi
5.
> > >
> > > Er det bare min Delphi installation der er mærkelig, eller hvad?
> > >
> > > /Asger
>
>
>
| |
Asger Grunnet (28-11-2001)
| Kommentar Fra : Asger Grunnet |
Dato : 28-11-01 08:20 |
|
"Peter Petersen" <the.1@get2net.dk> wrote in message news:3c03e390$0$58048$edfadb0f@dspool01.news.tele.dk...
> Jeg har oplever det samme når jeg debugger.
> Jeg tror der er tale om en compiler optimering.
>
> Dette begrunder jeg i, at årsagen til det du oplever er, at du sætter dit
> breakpoint efter at du er færdig med at anvende objektet, og det faktisk
> ikke har nogen yderligere anvendelse i programmet. Havde du istedet sat dit
> break på
> wPos := wStream.Position;
> ville du have set, at objekterne stadig indeholdt de rigtige værdier.....
Nej, det har ingen betydning.
Du har ret i at man nogle gange ikke kan få fat i værdier på grund af
optimering, men så får man en meddelelse i stil med 'Value inaccessible
due to optimization'. Desuden kan man slå optimering fra under Options,
og det giver heller ingen forskel.
Jeg er overbevist om at det enten er en generel fejl i Delphi 6 eller en fejl
i min Delphi / Windows installation. Jeg har været nødt til at geninstallere
Windows og Delphi (af andre årsager) siden jeg opdagede fejlen, men det
ændrede ikke noget.
/Asger
| |
|
|