Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fenster bewegen (https://www.delphipraxis.net/3530-fenster-bewegen.html)

flomei 17. Mär 2003 13:56


Fenster bewegen
 
Wie kann man erreichen, dass sich ein Fenster bewegt?
Das Fenster soll sich durch einen Timer gesteuert, an eine zufällig bestimmte Position bewegen.

Thx!

MfG Florian

Luckie 17. Mär 2003 14:10

Kuck dir mal die Eigenschaften Left und Top von TForm an.

flomei 17. Mär 2003 20:17

Ich weiss, dass in dem Buch: "Delphi 6 Grundlagen und Profiwissen" die erste Übung ist, ein Programm zu schreiben bei dem folgendes passiert:

Man nehme eine Form, platziere einen Button auf ihr, nenne ihn Beenden und schreibe dann die OnMouseMove Prozedur.

In der steht, dass sich das Fenster an eine zufällige Position bewegt, wenn man mit der Maus über oder an den Buttonrand fährt.

Hat irgendwer das Buch und könnte den Code mal posten? Der funktioniert nämlich.

Thx!

MfG Florian

flomei 17. Mär 2003 20:27

Ich hab das mal selber probiert:
Delphi-Quellcode:
begin
Form1.Top:= random(1000);
Form1.Left:= random(1000);
end;
Hat nicht so toll funktioniert. Meine Form ist immer oben links hängen geblieben oder ganz vom Bildschirm verschwunden. Das klappt also nicht.

hm...

Vielleicht könnte es funktionieren, wenn man den Wert in der Klammer ändert. Aber auf welchen Wert?
Auf keinen Fall darf das Fenster den sichtbaren Bereich des Bildschirms verlassen.

Es soll so schön rumspringen wie das hier:Klick mich! Achtung! Speichert vorher ab, wenn ihr nen OS ohne Taskmanager habt. Am besten geht das mit dem Internet Explorer. Zumindest bei mir.


Thx im Voraus!

MfG Florian

Haegar 17. Mär 2003 20:31

da gibts was, was die höhe und breite des desktops angibt, aber weiss net wies geht, probier doch einfach die werte in den klammern entsprechend kleiner zu machen!

gruss haegar

Chewie 17. Mär 2003 20:34

In einem VCL-Projekt gibts die Bildschirmgrröße unter Screen.DesktopWidth bzw. Screen.DesktopHeight

Luckie 17. Mär 2003 20:35

Setz mal für 1000 entsprechend die Höe und Breite des Bildschirmes ein: Screen.Width und Screen.Height.

Haegar 17. Mär 2003 20:41

Zitat:

Zitat von Luckie
Setz mal für 1000 entsprechend die Höe und Breite des Bildschirmes ein: Screen.Width und Screen.Height.

dann kann es ja immer noch ausserhal liegen....
musst also noch die höhe und breite des formulars abziehen...
Delphi-Quellcode:
form.left:=random(screen.width-form.width);
form.top:=random(screen.height-form.height);
so das sollte es eigentlich sein

gruss haegar

Daniel B 17. Mär 2003 21:20

Zitat:

Zitat von flomei
Ich weiss, dass in dem Buch: "Delphi 6 Grundlagen und Profiwissen" die erste Übung ist, ein Programm zu schreiben bei dem folgendes passiert:

Delphi-Quellcode:
Button1.Left := Random(Form1.ClientWidth - Button1.Width);
Button1.Top := Random(Form1.ClientHeight - Button1.Height);
Grüsse, Daniel :hi:

flomei 18. Mär 2003 08:42

Genau das hab ich gesucht :!: Wenn ich zuhause bin probier ich das aus. :bouncing4: :bounce1: :bounce2:

thx!

MfG Florian

flomei 18. Mär 2003 15:12

Ich hab den Code von Daniel genommen, aber das einzige was passiert ist, dass meine Form oben links in die Ecke spring. Das ist nicht schön! :-(
Sie kommt da nämlich nicht mehr weg.

Weitere Hilfe erbeten!

Thx!

MfG Florian

Specialwork 18. Mär 2003 15:24

Hallo Jungs (und evtl. Mädels)
 
Habt Ihr mal versucht, vor dem Aufruf der random Funktion die Initialisierung mit
Delphi-Quellcode:
Randomize;
aufzurufen.

Gruß, Tom

Specialwork 18. Mär 2003 15:30

Also bei mir funktioniert es anstandlos

Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Timer1: TTimer;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Achtung: Timer1.Enabled=False;
  Timer1.Enabled:=True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Left := Random(Screen.Width-Width);
  Top := Random(Screen.Height-Height);
end;

end.
Gruß, Tom

flomei 18. Mär 2003 15:38

Ich hab da mal ein Randomize; vorgesetzt aber das zeigt keinen Effekt.

Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
Randomize;
Form1.Top:= random(Form1.ClientHeight - Form1.Height);
Form1.Left:= random(Form1.ClientWidth - Form1.Width);
end;
Das ist der Code der OnMouseMove Prozedur meiner Form. Sie springt immer nach links oben in die Ecke.

Vielleicht könnte man auch etwas anderes machen:

Form bewegt sich von links unten nach rechts oben, von da nach rechts unten und dann nach links oben, bewegt sich nach links unten und fängt von vorne an. Mit Schleifen und Bedingungen, oder so???

Thx!

MfG Florian

Haegar 18. Mär 2003 15:56

Zitat:

Das ist der Code der OnMouseMove Prozedur meiner Form. Sie springt immer nach links oben in die Ecke.
dann schau dir nochmal die werte deiner klammern ...random(...);
an, und vergleiche die mal mit den ganzen hier geposteten codes!!

gruss haegar

Specialwork 18. Mär 2003 16:17

Hallo Flomei,

Deine Funktion z.B.
Delphi-Quellcode:
Random(Form1.ClientHeight - Form1.Height);
liefert immer den gleichen Wert (+-1) bis auf das Vorzeichen.

Ich hab mir mal die Werte ausgeben lassen:

Delphi-Quellcode:
LEFT: -32768TOP : 32767
LEFT: 32767TOP : -32768
LEFT: -32768TOP : 32767
LEFT: -32768TOP : -32768
LEFT: 32767TOP : -32768
LEFT: 32767TOP : -32768
LEFT: 32767TOP : -32768
LEFT: 32767TOP : -32768
LEFT: 32767TOP : -32768
LEFT: 32767TOP : -32768
LEFT: 32767TOP : 32767
LEFT: 32767TOP : -32768
LEFT: 32767TOP : -32768
LEFT: 32767TOP : 32767
Diese Werte erhalte ich nur, wenn
Delphi-Quellcode:
Form1.Borderstyle:=bsSingle;
ist. Wenn Du aber
Delphi-Quellcode:
Form1.Borderstyle:=bsNone;
eingestellt hast, bekomme ich nur Null. Das erklärt a) bsSingle: warum Deine Form zur Laufzeit verschwindet; und b) bsNone: warum Deine Form oben links in der Ecke plaziert ist.

Gruß, Tom

Luckie 18. Mär 2003 16:24

Ist doch ganmz simple: ClientHeight ist die Höhe des Client-Bereiches des Fensters und Height die gesamt Höhe.

flomei 20. Mär 2003 15:53

Zitat:

Zitat von Specialwork
Delphi-Quellcode:
Form1.Borderstyle:=bsSingle;
ist. Wenn Du aber
Delphi-Quellcode:
Form1.Borderstyle:=bsNone;
eingestellt hast, bekomme ich nur Null. Das erklärt a) bsSingle: warum Deine Form zur Laufzeit verschwindet; und b) bsNone: warum Deine Form oben links in der Ecke plaziert ist.

Das sollte eigentlich nichts damit zu tun haben, oder?

Wo liegt denn jetzt der Fehler?

Thx!

MfG Florian

flomei 21. Mär 2003 15:44

Prima! Es geht jetzt! Manchmal ist geposteter Code doch am besten. :wink:

Thx!

MfG Florian


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz