Avatar billede n1 Nybegynder
24. november 2003 - 12:58 Der er 5 kommentarer og
1 løsning

Vindue der hopper hen over skærmen

jeg skal ha en kode så vinduet hopper tilfældigt hen over skærmen!!

tak
Avatar billede pjotre Novice
24. november 2003 - 13:17 #1
Brug evt. top og left:
procedure TForm1.Button1Click(Sender: TObject);
var i : integer;
begin
i := 0;
repeat
Form1.top := i * 25;
Form1.left := i * 25;
i := i + 1;
form1.refresh;
MessageDlg('Tryk på OK', mtInformation,[mbOk], 0);
until i > 5;
end;
Mvh Pjotre
Avatar billede stoney Nybegynder
24. november 2003 - 13:22 #2
eller drop en timer

procedure TForm1.Timer1Timer(Sender: TObject);
begin
form1.Top := random(screen.Height);
form1.Left := random(screen.Width)
end;

Stoney
Avatar billede stoney Nybegynder
24. november 2003 - 13:23 #3
ups manglede lige randomize

procedure TForm1.Timer1Timer(Sender: TObject);
begin
randomize;
form1.Top := random(screen.Height);
form1.Left := random(screen.Width)
end;

Stoney
Avatar billede n1 Nybegynder
24. november 2003 - 14:09 #4
det skal nu mere være ligesom med pauseskærmen med windows logoet, hvor når den rammer en kant bliver den reflekteret!
Avatar billede borrisholt Novice
24. november 2003 - 14:42 #5
1) Kopier Uniten der afslutter det her  svar.
2) Overe i din mainUnit skla du uses UnitMoveForm;
3) Ret TForm1 = class(TForm) til TForm1 = class(TMovebleForm)

unit UnitMoveForm;

interface

uses
  SysUtils, Forms, ExtCtrls, Math, StdCtrls;

type
  TMovebleForm = class(TForm)
  private
    XPosition, YPosition: real;
    Direction: Integer;
    MoveTimer: TTimer;

    function ScaleX(X: real): Integer;
    function ScaleY(Y: real): Integer;
    procedure Move(Distance: Integer);
    procedure DoMoveTo(Xto: real; Yto: real);
    function GetTimerEnabled: Boolean;
    procedure SetTimerEnabled(const Value: Boolean);
    function GetInterval: Cardinal;
    procedure SetInterval(const Value: Cardinal);
  protected
    procedure doCreate; override;
    procedure doDestroy; override;
    procedure DoMoveTimer(Sender: TObject);
  public
    Property Enabled : Boolean read GetTimerEnabled write SetTimerEnabled;
    property Interval : Cardinal Read GetInterval Write SetInterval;
  end;

implementation

function TMovebleForm.ScaleX(X: real): Integer;
begin
  Result := Round((ClientWidth / (Screen.Width - Width)) * X);
end;

function TMovebleForm.ScaleY(Y: real): Integer;
begin
  Result := (ClientHeight - 1) - Round((ClientHeight / (Screen.Height - Height)) * Y);
end;

procedure TMovebleForm.Move(Distance: Integer);
begin
  DoMoveTo(XPosition + cos(DegToRad(Direction)) * Distance, YPosition + sin(DegToRad(Direction)) * Distance);
end;

procedure TMovebleForm.DoMoveTo(Xto, Yto: real);
begin
  Left := ScaleX(XTo);
  Top := ScaleY(YTo);
  XPosition := XTo;
  YPosition := YTo;
end;

procedure TMovebleForm.doCreate;
begin
  MoveTimer := TTimer.Create(nil);
  MoveTimer.OnTimer := DoMoveTimer;
  MoveTimer.Interval := 20;
  Direction := Random(360);
  XPosition := Random(200);
  YPosition := 100 + Random(200);
  inherited;
end;

procedure TMovebleForm.DoMoveTimer(Sender: TObject);
begin
  if (Left + Width >= Screen.Width) or (Top + Height >= Screen.Height) or (Top <= 0) or (Left <= 0) then
  begin
    if (Top <= 0) and (Left <= 0) then
      repeat
        Direction := Random(360);
      until (Direction > 270)
    else if (Top <= 0) and (Left + Width >= Screen.Width) then
      repeat
        Direction := Random(360);
      until (Direction > 180) and (Direction < 270)
    else if (Top + Height >= Screen.Height) and (Left + Width >= Screen.Width) then
      repeat
        Direction := Random(360);
      until (Direction > 90) and (Direction < 180)
    else if (Top + Height >= Screen.Height) and (Left < 0) then
      repeat
        Direction := Random(360);
      until (Direction < 90)
    else if (Top <= 0) then
      repeat
        Direction := Random(360);
      until (Direction > 180)
    else if (Left <= 0) then
      repeat
        Direction := Random(360);
      until (Direction < 90) or (Direction > 270)
    else if (Top + Height >= Screen.Height) then
      repeat
        Direction := Random(360);
      until (Direction < 180)
    else if (Left + Width >= Screen.Width) then
      repeat
        Direction := Random(360);
      until (Direction > 90) and (Direction < 270);
  end;
  Move(1);
end;

procedure TMovebleForm.doDestroy;
begin
  FreeAndNil(MoveTimer);
  inherited;
end;

function TMovebleForm.GetTimerEnabled: Boolean;
begin
  Result := MoveTimer.Enabled;
end;

procedure TMovebleForm.SetTimerEnabled(const Value: Boolean);
begin
  MoveTimer.Enabled := Value;
end;

function TMovebleForm.GetInterval: Cardinal;
begin
  Result := MoveTimer.Interval;
end;

procedure TMovebleForm.SetInterval(const Value: Cardinal);
begin
  MoveTimer.Interval := Value;
end;

initialization
  Randomize;
end.

 
Jens B
Avatar billede borrisholt Novice
24. november 2003 - 15:14 #6
N1 >> Nemt ikke ?

Stoney >> Tsk tsk tsk. Har du helt glemt din vector matematik ?

Jens B
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester