Hvorfor gør Delphi IKKE tingene i Rækkefølge ?

Tags:    delphi

F.eks hvis man programmerer en Button således :

Label1.Caption:='Vent et Øjeblik';
Sleep(10000); // Pause i 10 sekunder

Hvorfor står der så først "Vent et Øjeblik" efter 10 Sekunder ?

Jeg forventede at først ville der stå "Vent et Øjeblik" og så derefter ville der blive pause i 10 Sekunder.

Jeg håber på at der er nogen, som vil hjælpe mig.






User
Bruger #55 @ 15.08.02 21:00
F.eks hvis man programmerer en Button således :

Label1.Caption:='Vent et Øjeblik';
Sleep(10000); // Pause i 10 sekunder

Hvorfor står der så først "Vent et Øjeblik" efter 10 Sekunder ?

Jeg forventede at først ville der stå "Vent et Øjeblik" og så derefter ville der blive pause i 10 Sekunder.

Jeg håber på at der er nogen, som vil hjælpe mig.




Fordi delphi ikke gentegner kontrollen med det samme.
prøv sådan her :

Label1.Caption:='Vent et Øjeblik';
Repaint();
Sleep(10000); // Pause i 10 sekunder



F.eks hvis man programmerer en Button således :

Label1.Caption:='Vent et Øjeblik';
Sleep(10000); // Pause i 10 sekunder

Hvorfor står der så først "Vent et Øjeblik" efter 10 Sekunder ?

Jeg forventede at først ville der stå "Vent et Øjeblik" og så derefter ville der blive pause i 10 Sekunder.

Jeg håber på at der er nogen, som vil hjælpe mig.




Du kunne altid prøve at indsætte processmessages...

Label1.Caption:='Vent et Øjeblik';
Application.processmessages;
Sleep(10000); // Pause i 10 sekunder




Det er nemlig lige det Delphi gør.
1) Sæt caption
2) Sleep i 10 sec
3) hov, ikke mere kode - så kigger vi igen om hvilke besked windows har smidt til programmet (I dit tilfælde, en WM_PAINT besked til din TLabel)


Darkstar[Redigeret d. 18/08-02 16:22:36 af Thomas Nielsen]



Hvis man prøver det her exsempel så vil opleve at det ikke er sikkert i hvad rækkefølge input-funktionerne bliver kaldet så man får i nogle tilfælde (de fleste?) forkert resultat. Det er pga. delphi's måde at oversætte udtryk på.

var
...tabel: array[1..4096] of byte; //en buffer ting
...curPos: integer; //en peger i tablen

function getByte: byte;
begin inc(curPos); getByte:=tabel[curPos]; end;

procedure processIt;
var
...w: word;
begin
...w:=getByte+256*getByte; // skulle være korrekt men lav-del læses til *256 del
// brug istedet:
...w:=getByte;
...w:=w+getByte*256;
end; //processIt





Hvis man prøver det her exsempel så vil opleve at det ikke er sikkert i hvad rækkefølge input-funktionerne bliver kaldet så man får i nogle tilfælde (de fleste?) forkert resultat. Det er pga. delphi's måde at oversætte udtryk på.

var
...tabel: array[1..4096] of byte; //en buffer ting
...curPos: integer; //en peger i tablen

function getByte: byte;
begin inc(curPos); getByte:=tabel[curPos]; end;

procedure processIt;
var
...w: word;
begin
...w:=getByte+256*getByte; // skulle være korrekt men lav-del læses til *256 del
// brug istedet:
...w:=getByte;
...w:=w+getByte*256;
end; //processIt



Du kan vel bare sætte nogle parenteser

Emil Melgaard
emil.melgaard@private.dk



t