[Delphi] Eindeloze loop met animatie

Pagina: 1
Acties:

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 08-09 08:43

Bergen

Spellingscontroleur

Topicstarter
Ik word helemaal gek. In m'n 3D engine heb ik nu een tekenloop zitten die er ongeveer zo uitziet:
code:
1
2
3
4
5
6
7
8
9
10
procedure TfrmDisplay.StartAnimation;
begin
     Animating := true;
     while Animating do
     begin
        // Draw Object
        // Move Object
        Application.ProcessMessages;
     end;
end;

Als ik dubbelklik op het formulier (fullscreen, in een andere resolutie, zonder border) zou hij de loop moeten afbreken zodat hij stopt en teruggaat naar de normale resolutie. Daarvoor gebruik ik de simpele code:
code:
1
2
3
4
5
procedure TfrmDisplay.FormDblClick(Sender: TObject);
begin
     Animating := false;
     Close;
end;

Maar reken maar niet dat hij uit die loop springt! Hij reageert simpelweg helemaal niet op 't feit dat Animating op false staat! :'( Ik heb al vanalles geprobeerd: vervangen door een repeat..until loop, meer Application.ProcessMessages commando's ertussen, meteen een Close aanroepen en dan de Animating := false bij OnClose, bij OnDestroy, OnDeactivate, maar niets wil helpen. Wie-o-wie helpt me?

[edit] Ja leuk he ik gebruik camel en hungarian doorelkaar :P

  • bobo1on1
  • Registratie: Juli 2001
  • Laatst online: 19-10-2025
Reageert ie wel op het feit dat je dubbelklikt?
Ik ben nog heel erg beginner met delphi maar heb in het programma wat voor compiler door moet gaan visual basic dus wel enige ervaring.

Wat je daar dus moet doen als je een do..loop hebt is doevents ertussen zetten om te voorkomen dat het programma vastloopt.

Misschien heb je ook zoiets in delphi.

edit:
hmm dat zou dus weleens Application.ProcessMessages kunnen zijn |:(

Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02-2025

SchizoDuckie

Kwaak

heb je je variabele Animating wel public gedeclareerd? (bovenaan in je code dus, zodat ie overal gebruikt kan worden) en probeer ook eens while animating = true voor de grap..

Stop uploading passwords to Github!


  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 08-09 08:43

Bergen

Spellingscontroleur

Topicstarter
Uiteraard issie public :)

Enneh while Animating is toch echt hetzelfde als while Animating = true. (ja ik heb het voor de zekerheid even geprobeerd maar het hielp niet)

Hij reageert verder wel op de dubbelklik. Als ik er een showMessage tussen zet laat ie keurig een berichtje zien.

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 22:50

Klippy

Still Game

Op welk event roep je de StartAnimation procedure aan?

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 08-09 08:43

Bergen

Spellingscontroleur

Topicstarter
Op maandag 04 februari 2002 04:17 schreef LiquidSilver het volgende:
Op welk event roep je de StartAnimation procedure aan?
Op de OnActivate:
code:
1
2
3
4
5
6
7
8
procedure TfrmDisplay.FormActivate (Sender: TObject);
begin
    Self.Cursor := crNone;
    Self.Width := GetChosenWidth;
    Self.Height := GetChosenHeight;
    InitAnimation;
    StartAnimation;
end;

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 22:50

Klippy

Still Game

Tsjah, die code moet iig goed zijn.

Nu moet ik ook gaan gokken, waarmee teken je?

Kan zijn dat een Drawbox oid nadat ie niet meer gebruikt word het form opnieuw activeert, lijkt me sterk.

En die draw object en move object functies kunnen ook zelf de loop vormen.

Vreemd idd...

Edit: Wat doe die Close eigenlijk? Dat kan ik ff niet zo snel zien, maar dat kan ook aan het tijdstip liggen :P

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 08-09 08:43

Bergen

Spellingscontroleur

Topicstarter
Op maandag 04 februari 2002 04:25 schreef LiquidSilver het volgende:
Tsjah, die code moet iig goed zijn.

Nu moet ik ook gaan gokken, waarmee teken je?

Kan zijn dat een Drawbox oid nadat ie niet meer gebruikt word het form opnieuw activeert, lijkt me sterk.

En die draw object en move object functies kunnen ook zelf de loop vormen.

Vreemd idd...
Ik teken nog helemaal niet.. Ik wil dit eerst werkend hebben, dan implementeer ik mijn reeds gereedstaande tekenfuncties wel :) En ik teken niet in een drawbox maar in een stuk geheugen. Als dat klaar is kopieer ik de lap geheugen naar een tbitmap en die teken ik direct op 't canvas.

Close sluit het formulier.

  • Klippy
  • Registratie: Oktober 2000
  • Laatst online: 22:50

Klippy

Still Game

Hmm ik ga slapen denk ik, volg 't niet meer :P

Close sluit het formulier.
Hoe weet je dan of je lus doorgaat?

En die lus zou toch al moeten stoppen al het formulier sluit of niet?

Steam | SXQncyBhbGwgZ29vZCwgbWFuISDwn5iO


  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 08-09 08:43

Bergen

Spellingscontroleur

Topicstarter
Op maandag 04 februari 2002 04:36 schreef LiquidSilver het volgende:
Hmm ik ga slapen denk ik, volg 't niet meer :P

Close sluit het formulier.
Hoe weet je dan of je lus doorgaat?

En die lus zou toch al moeten stoppen al het formulier sluit of niet?
In principe wel maar omdat die lus alle processorkracht vreet heeft ie eigenlijk helemaal geen tijd om het formulier te sluiten. Ik weet zeker dat die lus niet stopt omdat ik een ShowMessage direct na de lus hebt staan en dat berichtje toont ie niet.

Ik heb even een voorbeeldje gemaakt om mee te prutsen. Het zijn Delphi 3 bestanden. Download het testpakketje hier.

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Titel maar ietsje serieuzer gemaakt :)

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

Op maandag 04 februari 2002 08:14 schreef ACM het volgende:
Titel maar ietsje serieuzer gemaakt :)
Moet er dan niet een * achter?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Hij zou er uit moeten springen bij de check, dus óf de check faalt, óf de check wordt niet uitgevoerd.

Hoe snel wordt dat loopje doorlopen? zit er niet nog een 'eindeloos' loopje in?
Ik neem aan dat iedere loop staat voor een frame, dus wat is je fps?
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
procedure TfrmDisplay.StartAnimation;
var FrameId:integer;
begin
     Animating := true;
     FrameId:=0;
     while Animating do
     begin
        // Draw Object
        // Move Object
        Application.ProcessMessages; // voor het evt afhandelen van een muisklik.
        inc(FrameId);
        if(Animating)
           TfrmDisplay1.caption := format("%d (animating)",[FrameId])
        else
           TfrmDisplay1.caption := format("%d (stopped)",[FrameId])
        Application.ProcessMessages; // voor het updaten van de caption
     end;
end;

en verwijder dan even die close, zodat je het resultaat kunt zien.

Localhost, sweet localhost


Verwijderd

Persoonlijk denk ik dat je probleem hem zit in de OnActivate event. Ik heb het volgende geprobeerd en dat werkt:

Hier volgt code Unit1.pas - (formulier met 1 button)
code:
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
39
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses Unit2;

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
  with TfrmDisplay.Create(nil) do
  try
    Show;
    StartAnimation;
  finally
    Release;
  end;
end;

end.

Hier volgt code voor Unit2 - Formulier met naam: TfrmDisplay
code:
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
39
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
  TfrmDisplay = class(TForm)
  private
    FAnimating: Boolean;
    procedure WMMaximize(var Message: TWMSysCommand); message WM_SYSCOMMAND;
  public
    procedure StartAnimation;
  end;

implementation

{$R *.DFM}

{ TfrmDisplay }

procedure TfrmDisplay.StartAnimation;
begin
  FAnimating:=True;
  while FAnimating do
    Application.ProcessMessages;
end;

procedure TfrmDisplay.WMMaximize(var Message: TWMSysCommand);
begin
  if Message.CmdType = SC_MAXIMIZE then
  begin
    ShowMessage('Maximize');
    FAnimating := False;
  end;
end;

end.

Hopelijk kun je er wat mee.

Verwijderd

Het probleem is dat de ShowModal een eigen loop heeft met
code:
1
2
3
repeat
  Application.HandleMessage
until [..]

Maar net voordat de code in die loop komt verstuurt de form een CM_ACTIVATE naar zichzelf. Hierop reagerend ga jij in een eigen loop zitten [StartAnimation]

Allemaal niet erg maar nadat jouw loop is afgelopen [dubbel klikken], begint meteen de loop van de ShowModal, dus wordt het scherm niet gesloten [ModalResult wordt eerst op 0 gezet]

Een oplossing:
  • Geen ShowModal aanroepen: zie hvdberg
  • Een WM_CLOSE naar jezelf versturen via postmessage, als je uit jouw loop komt in de StartAnimation. Deze zal dan in de loop van ShowModal ontvangen worden, en het scherm zal gesloten worden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
procedure TForm2.StartAnimation;
begin
  Animating := True;
  Klaar := False;
  while Animating do
  begin
    Application.ProcessMessages;
  end;
  Klaar := True;
  PostMessage(Handle, WM_CLOSE, 0, 0);
end;

procedure TForm2.FormDblClick(Sender: TObject);
begin
  Animating := False;
end;

Er stond wat overbodige code in jouw source, die heb ik eruit gemikt :)

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 08-09 08:43

Bergen

Spellingscontroleur

Topicstarter
Geweldig! Het werkt perfect die laatste oplossing met de WM_CLOSE message! Bedankt allemaal voor de uitleg :o

Verwijderd

Ik heb het hier even getest met bijna dezelfde code en het werkt gewoon.

edit:

Maar zonder ShowModal, zal dus wel kloppen :)
Pagina: 1