Programowanie w języku Delphi » Artykuły

Wyskakujące okienka inaczej

Witam!
Wiem, że już taki temat o okienkach tu był, ale tylko wysuwających się w górę. Ja pokaże wam mój projekt.


  1. Na początek deklarujemy typ wyliczeniowy TAlingDirection:
type
 TAlingDirection = (adTop, adLeft, adRight, adDown);


Klasa ta oznacza CZTERY kierunki: adTop - góra, adDown - dół, adRight - prawo i adLeft -  lewo.

  1. Później deklarujemy dwie procedury:
procedure FormMessage(Form: TForm; Direction: TAlingDirection; Speed: Cardinal; AddTo:  Integer);
   procedure HideFormMessage(Form: TForm; Direction: TAlingDirection; Speed: Cardinal; DeleteTo: Integer);


 Procedura FormMessage wysuwa okienko, a HideFormMessage - chowa.

Piszemy procedurę FormMessage:
procedure FormMessage(Form: TForm; Direction: TAlingDirection; Speed: Cardinal; AddTo: Integer);
var
     x,y,z,a,i,b: Integer;
begin
        i:=0;
        if Direction = adTop then 
           begin
                x:=screen.Height;
                y:=screen.Width;
                z:=form.Height;
                a:=form.Width;
                form.Top:=screen.Height;
                form.Left:=y-a;
                form.Show;
                repeat
                  form.Top:=form.Top-AddTo;
                  sleep(speed);
                until form.Top=x-z;
           end;
        if Direction = adLeft then 
           begin
               x:=screen.Height;
               y:=screen.Width;
               z:=form.Height;
               a:=form.Width;
               i:=0;
               form.Top:= x div 2;
               form.Left:=-a;
               form.Show;
               repeat
                 form.Left:=form.Left+AddTo;
                 sleep(speed);
               until form.Left = 0;
           end;
        if Direction = adDown then 
           begin
                x:=screen.Height;
                y:=screen.Width;
                z:=form.Height;
                a:=form.Width;
                i:=0;
                form.Top:=-z;
                form.Left:=y div 2;
                form.show;
                repeat
                  form.Top:=form.Top+AddTo;
                  sleep(speed);
                until form.Top=0;
          end;
       if Direction = adRight then 
          begin
               x:=screen.Height;
               y:=screen.Width;
               z:=form.Height;
               a:=form.Width;
               i:=0;
               form.Left:=y;
               form.Top:=x div 2;
               form.Show;
               repeat
                form.Left:=form.Left-AddTo;
                sleep(speed);
              until form.Left = y-a;
          end;
end;


Następnie procedurę HideFormMessage:
procedure HideFormMessage(Form: TForm; Direction: TAlingDirection; Speed: Cardinal; DeleteTo: Integer);
var
     x,y,z,a,i: integer;
begin
        if Direction = adDown then 
           begin
                x:=screen.Height;
                y:=screen.Width;
                z:=form.Height;
                a:=form.Width;
                i:=0;
                repeat
                 form.Top:=form.Top+DeleteTo;
                 sleep(speed);
                until form.Top=x;
          end;
       if Direction = adLeft then 
          begin
               x:=screen.Height;
               y:=screen.Width;
               z:=form.Height;
               a:=form.Width;
               i:=0;
               repeat
                form.Left:=form.Left-DeleteTo;
                sleep(speed);
               until form.Left=-a;
         end;
      if Direction = adRight then 
         begin
             x:=screen.Height;
             y:=screen.Width;
             z:=form.Height;
             a:=form.Width;
             i:=0;
             repeat
               form.Left:=form.Left+DeleteTo;
               sleep(speed);
             until form.Left = y;
         end;
      if Direction = adTop then 
         begin
              x:=screen.Height;
              y:=screen.Width;
              z:=form.Height;
              a:=form.Width;
              i:=0;
              repeat
                 form.Top:=form.Top-DeleteTo;
                 sleep(speed);
              until form.Top = -z;
         end;
end;


Już wyjaśniam:
- Procedura FormMessage/HideFormMessage
  - Form: TForm - Deklaracja formy, która ma się wysunąć
  - Direction: TAlingDirection - Kierunek wysuwania formy
  - Speed: Cardinal - czas, jaki ma przerywać między jednym a drugim przesunięciem formy; im mniejsza wartość, tym szybciej
  - AddTo: Integer - O ile ma przesuwać formę; im większa wartość, tym szybciej forma zostaje wysunięta

Aby uniknąć zawieszenia się programu, nalezy stosować poniższe pary kierunków:
FormMessage (adTop), HideFormMessage(adDown)
FormMessage (adDown), HideFormMessage(adTop)
FormMessage(adRight), HideFormMessage(adRight)
FormMessage(adLeft), HideFormMessage(adLeft)

Nie należy także stosować zbyt dużych wartości dla Speed i Addto/DeleteTo, poniważ forma może nam wtedy poprostu "uciec".

1 komentarz

TomRiddle 2011-04-02 12:16

We wszystkich ośmiu przypadkach, zmienna "x" zawsze ma Screen.Height, "y" zawsze Screen.Width, "z" zawsze Form.Height, a "a" zawsze Form.Width. A nie lepiej dać ten kod tylko na początku procedury, a potem go pomijać? Bo przypisujesz do zmiennej ta same wartości.