Timery i chowanie się formy

0

Witam.

Mam 3 timerki które obsługują w moim programie chowanie się formy poza ekran (do góry):

Zmienne globalne: CzyHide :Boolean, MainTop : Integer

Timer1 (interwał - 10, enabled - True):

procedure TForm1.Timer1Timer(Sender: TObject);
var
  P : TPoint;
begin
GetCursorPos(P);

  if CzyHide = False then   //Jeżeli nie jest schowane poza ekran...
   MainTop := Form1.Top;
    begin //...sprawdź czy kursor nie znajduje sie na formie lub czy nie jest ona aktywna
      if (P.X >= Form1.Left) and (P.X <= Form1.Left + Form1.Width) and    
         (P.Y >= Form1.Top) and (P.Y <= Form1.Top + Form1.Height) or    
         (Application.Active = True) then
         Timer3.Enabled := False 
      else
        begin  
         Timer2.Enabled := True
        end;
    end
  else  //Jeżeli forma jest schowana, a kursor znajduje się w odpowiednim miejscu...
    if (P.X > Form1.Left) and
       (P.X < Form1.Left + Form1.Width) and
       (P.Y = 0) then
      begin
         CzyHide := False;
         Form1.Top := MainTop;  //powrót na pierwotną pozycję, ale nie działa :-(
      end;
end;

Timer2 - Służy do opóźnienia chowania się formy (interwał - 400, enabled - False):

procedure TForm1.Timer2Timer(Sender: TObject);
begin
  Timer2.Enabled := False;
  Timer3.Enabled := True;
end;

Timer2 - Odpowiedzialny za animację chowania formy (interwał - 10, enabled - False):

procedure TForm1.Timer3Timer(Sender: TObject);
begin
  Form1.Top := Form1.Top - 1;
  if Form1.Top < 0 - Form1.Height then
    begin
      Timer3.enabled := False;
      CzyHide := True;
    end
end;

I chodzi o to, że gdy forma się schowa, to po najechaniu w odpowiednie miejsce, pojawia się ale ma top = 0, a nie taki jaki miała przed schowaniem. Chciałbym również by, gdy znajduje się częściowo poza ekranem, po najechaniu kursorem wróciła na pierwotny Form1.Top

A może ma ktoś lepszy pomysł na chowanie się formy (bo trzy Timerki to chyba za dużo) w podobny sposób?

0

nie chce mi się czytać całego kodu.. ale moim zdaniem danie ..

MainTop := Form1.Top;

w Timerze nie jest dobrym pomysłem.. zdaje się że Ty tego Timera później nie wyłączasz.. wiec cały czas tak przypisuje :P

kiedyś robiłem podobny program.. poszukam go, jeśli znajdę to wrzucę jego kod ;)</delphi></delphi>

0

znalazłem ten kod :D .. jak zwykle po przeszukaniu wszystkich płyt był na ostatniej ;P
ja miałem to zrobione trochę inaczej.. na Formie był jeden Timer (Interval=25 , Enabled=True)..
cały kod (a właściwie zmniejszony by zachować tylko to co najważniejsze) wygląda tak:


unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    procedure CmMouseLeave(var Msg: TMessage); message Cm_MouseLeave;
    procedure CmMouseEnter(var Msg: TMessage); message Cm_MouseEnter;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const Wysuwaj = True; // dwie zmienne dla wygody
      Wsuwaj = False;

var
  Form1: TForm1;
  Kierunek: Boolean; // czy forma ma sie wsuwać czy wysuwać
  Min: SmallInt; // liczba oznaczająca wartość właściwości Top formy gdy forma jest ukryta
  Max: SmallInt; // liczba oznaczająca wartość właściwości Top formy gdy forma jest w pełni widoczna
  OIlePixeli:Byte; // prędkość ukrywania/pokazywania się formy
implementation

{$R *.dfm}

// gdy użytkownik opuści myszką obszar formy
procedure TForm1.CmMouseLeave(var Msg: TMessage);
Begin
Kierunek := Wsuwaj;
end;

// gdy użytkownik najedzie myszką na Formę
procedure TForm1.CmMouseEnter(var Msg: TMessage);
Begin
Kierunek := Wysuwaj;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
OIlePixeli := 20; // przesuwaj formę o 20 pikseli przy każdym wywołaniu Time1.OnTimer
Min := - ClientHeight + 1; // ustawienie minimalnej wartosc Top formy
Max := 0; // jak wyżej, tyle że maksymalnej wartości
Kierunek := Wsuwaj; // kierunek przy starcie ustawiony na wsuwaj
Top := Min; // forma jest na początku ukryta
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Kierunek = Wsuwaj then // gdy forma ma się wsuwać..
  begin
    if Top > Min then // jeżeli Forma jeszcze nie jest ukryta
      if Top - OIlePixeli >= Min then Top := Top - OIlePixeli else Top := Min; // przesuń formę o wartość OIlePixeli lub ustaw Top na wartość Min
  end;
if Kierunek = Wysuwaj then // analogicznie do instrukcji wyżej
  begin
    if Top < Max then
      if Top + OIlePixeli <= Max then Top := Top + OIlePixeli else Top := Max;
  end;
end;

end.

Ten kod pasował w mojej sytuacji.. co znaczy że w innej będzie trzeba trochę go zmienić :P

  • miałem ustawione Form1.BorderStyle := bsNone .. bo miałem własny obrazek jako tło aplikacji, więc jak ktoś ma normalne obramowanie to trzeba odliczyć pasek u góry :P
  • chciałem aby się wysuwał tylko do krawędzi nie dalej, jak chce się wysuwać dalej to może nieco kolidować z MouseLeave bo trzeba cały czas trzymać myszkę nad Formą, ale przecież można zamiast MouseLeave i MouseEnter używać czegoś innego ;) np jakiś Buttonek z Kierunek := Wsuwaj;

poza tym Timer przez cały czas działania aplikacji nie musi być włączony więc po zakończeniu animacji można by go wyłączać, ale to już zostawiam Tobie do inwencji twórczej jeśli byś chciał sie pobawić ;)

0

Dzięki serdeczne, jestes wielki. Kilka modyfikacji i jest super. :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1