Wyskakujące okienka inaczej
Infor_mat_ik
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.
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.
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".
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.