Einzelnen Beitrag anzeigen

Benutzerbild von Muellermilchtrinker
Muellermilchtrinker

Registriert seit: 1. Aug 2009
447 Beiträge
 
Delphi 2009 Professional
 
#11

AW: fortlaufende Animationen - ohne Freeze

  Alt 13. Feb 2012, 18:48
So ich hab mal ein wenig rumexperimentiert. Jedoch freezt sich mein Programm immer noch.
Also auf dem Hauptformular gibt es einen Timer, der für die Animation ausführern soll und danach auch wiederholen. Diese Animationen sind einzelne Prozeduren in einer anderen Unit. Nun habe ich in der anderen Unit einen Timer erstellt um eine gewisse Zeit warten zu können, ohne jeglichen Erfolg.

Also der Timer auf meinem Hauptformular ganz billig (wird mit 2 Buttons gestartet/gestoppt):
Delphi-Quellcode:
//Effekte Timer
procedure TfrmMain.effectTimer(Sender: TObject);
begin
  //Blinken Animation
  if blinken1.Checked then
  begin
    ani_blinken();
  end
  //mittlere Ebene rotieren
  else if rotierendeEbene1.Checked then
  begin

  end;
end;
Die rotierende Ebene ist noch nicht programmiert, da ich die eine Animation ja noch nicht ganz hab.
Und dann in der Unit animations:
Delphi-Quellcode:
unit animations;

interface

uses
  ExtCtrls;

type
  TMyTimer = class(TTimer)
    procedure TimerProc(Sender: TObject);
  end;

  procedure waitpertimer(msec: Integer);
  procedure ani_blinken();

var
  timetoend: Integer;
  timestriked: Integer = 0;
  timeend: Boolean;

implementation

uses
  windows, Forms, draw;

procedure TMyTimer.TimerProc(Sender: TObject);
begin
  inc(timestriked);
  if timestriked = timetoend then
  begin
    timestriked := 0;
    timeend := true;
  end;
end;

procedure waitpertimer(msec: Integer);
  var Timer: TMyTimer;
begin
  Timer := TMyTimer.Create(nil);
  Timer.Enabled := False;
  Timer.Interval := 10;
  Timer.OnTimer := Timer.TimerProc;

  timetoend := round(msec/10);
  timeend := false;
  Timer.Enabled := True;

  repeat
    Application.ProcessMessages;
  until (timeend);

  Timer.Enabled := False;
  Timer.Free;
end;

//Lässt den LED Cube blinken
procedure ani_blinken();
begin
  //Cube an
  set_cube();

  waitpertimer(500);

  //Cube aus
  clear_cube();

  waitpertimer(500);
end;

end.
Die clear_cube und set_cube Funktionen sind in einer anderen Unit. Dort sollen später 0815-Zeichen-Routinen rein, damit man zum Beispiel eine Ebene nicht imemr mit Schleifen füllen muss.
Chuck Norris doesn't need backups. He just uploads his files and lets the world mirror them.
  Mit Zitat antworten Zitat