Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Nicht-Lineare Bewegung eines Fensters (https://www.delphipraxis.net/76660-nicht-lineare-bewegung-eines-fensters.html)

SittingDuck 7. Sep 2006 17:11


Nicht-Lineare Bewegung eines Fensters
 
Moin Moin ...

Wer den Launcher kennt, der weiss, das er eine AutoHide-Funktion besitzt.
Dabei wird das Fenster vom Bildschirm gezogen, entweder manuell oder nach einer
festgelegten Zeit. Die Bewegung des Fensters ist nahezu linear, denn ich gebe eine
Zeit in ms vor, in der sich der Launcher 'aus dem Staub' gemacht haben soll.
Zu Verdeutlichung hier der entsprechende Source-Code:

Delphi-Quellcode:
procedure TLauncher1.Slide;
var fw,fh,RPos: integer; Start,Step: Extended;
begin
 SlideSpeed := 500; // eine halbe Sekunde für die Bewegung
 
 Start := GetTickCount + SlideSpeed;

 if not Slided then begin
  ExHeight := Height;
  ExWidth := Width;
  RPos := Left + ExWidth;

  repeat
   Step := (Start - GetTickCount) / SlideSpeed;
   //^^ Verkleinerungs-Faktor abhängig von der verstichenen Zeit
   
   fh := Round(ExHeight * Step); // reduzierte Fensterhöhe
   fw := Round(ExWidth * Step); //    -"-     Fensterbreite

   if Slided then begin // Werte umdrehen um Fenster wieder herzustellen
    fh := ExHeight - fh; fw := ExWidth - fw;
   end;

   case Richtung of 1: Height := fh; // ab nach oben
                    2: begin Left := Screen.Width - fw; Width := fw; end; // rechts
                    3: begin Top := Screen.Height - fh; Height := fh; end; // unten
                    4: Width := fw; // Fenster nach links schieben
                   
   end;

   Application.ProcessMessages;

  until Start - GetTickCount < 0;

 end;
end;
Soweit so gut ... Das Ergebnis könnt Ihr Euch gerne mit der letzten
Beta-Version ansehen.

Nun schwebt mir eine 'nicht-lineare' Fensterbewegung vor, ähnlich einer teueren
Küchenschublade. Jeder kennt den Effekt, wenn so eine Schublade vor dem
Schließen nochmal kurz abgebremst wird. Diesen Effekt würde ich gerne in eine
entsprechende Formel pressen. :thumb:

Ich schaffe es aber nicht meine Routine so abzuändern. Sämtliche Versuche
sehen entweder ruckelig aus oder enden in total verkrampften Source-Code.
Auch habe ich Zweifel am 'TimeBased Movement' meines Programms. Wahrscheinlich
kann man den gesamten Code sowieso noch schwer optimieren.

Für jeden Tipp dankbar, grüßt ...

3_of_8 7. Sep 2006 17:26

Re: Nicht-Lineare Bewegung eines Fensters
 
Du könntest das mit Sinus machen, indem du das Fenster mit 1-sin(degtorad(pos)) bewegst, wobei pos die aktuelle Position (Zahl zwischen 0 und 90) ist.

SittingDuck 11. Sep 2006 07:09

Re: Nicht-Lineare Bewegung eines Fensters
 
Moin Moin ...

@3_of_8: OK, diese Idee hatte ich auch schon, bekomme sie aber nicht sauber
umgesetzt ... Vielleicht hat ja noch jemand einen Vorschlag ?!?

Mit dem Kurvenlineal, winkt ...

markusj 11. Sep 2006 09:16

Re: Nicht-Lineare Bewegung eines Fensters
 
Hallo!

Wie wärs mit einer

-(x^2)

Funktion vielleicht?
Die Nullstelle setzt du auf die Mitte deiner Leiste, dann beschleunigt sie langsam, wird an der Mitte am schnellsten und bremst am Rand wieder ab!

mfG

Markus

SittingDuck 12. Sep 2006 11:34

Re: Nicht-Lineare Bewegung eines Fensters
 
Tach nochmal ...

@markusj: Auch keine schlechte Idee ... Ich bezweifele im Moment jedoch
das ich mit meiner Funktion (siehe oben) so etwas überhaupt hinbekomme,
denn diese Routine versucht ja immer eine bestimmte Strecke pro Zeit
zurückzulegen ... :gruebel: oder liege ich da falsch ?!?

Wie muss ich denn diese Zeile verändern, damit sich die Bewegung am
Kurvenverlauf orientiert ?
Delphi-Quellcode:
Step := (Start - GetTickCount) / SlideSpeed;
Schön gleichmäßig, grüßt ...

Waldteufel 12. Sep 2006 13:30

Re: Nicht-Lineare Bewegung eines Fensters
 
Hi SittingDuck.

Kurzer Denkanstoß:
Delphi-Quellcode:
Step := 20 - SlideSpeed * Power((Start - GetTickCount), 2);
(Ungetestet)

Gruß,
Waldteufel

markusj 12. Sep 2006 13:44

Re: Nicht-Lineare Bewegung eines Fensters
 
Du variierst deinen Slide-Speed ... der entspricht dem Verlauf einer -(x^2)+z Parabel, wobei z die Geschwindigkeit und die Nullstellen bestimmt.

mfG

Markus

SittingDuck 14. Sep 2006 09:15

Re: Nicht-Lineare Bewegung eines Fensters
 
Hi ...

@markusj: Dein Kurvenvorschlag würde ich gerne mal in Aktion sehen !
(ein lauffähiges Beispiel wäre natürlich der Hit ...)

So wie der Waldteufel die Routine modifiziert hat, läuft es leider
nicht. (steigt mit einem Bereichsprüfungsfehler aus ...)

Beinahe aus der Kurve geflogen, grüßt ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:13 Uhr.

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