title image


Smiley Fertig mit dem Beispiel.. kann man das eleganter programmieren?
Folgender Code sollte problemlos zu verstehen sein ;-)



Nun meine Frage: kann man das eleganter programmieren, evtl. Code einsparen oder direkt über Messages gehen, dass dieses verdammte components[] weg kommt..?







procedure Check_Seiten_Form2Form(Form: TForm; Rand: Integer = 30; AlignToDestination: Boolean = False);

var

x: Integer;

A_Right, A_Width: Integer;

A_R, A_W: Integer;



A_Top: Integer;

A_T_1, A_T_2: Integer;



A_Bottom: Integer;

A_B_1, A_B_2: Integer;



A_Left: Integer;

A_L_1, A_L_2: Integer;



A_Height: Integer;

begin

for x := 0 to Application.ComponentCount - 1 do

if Application.Components[x] is TForm then

if ((Application.Components[x] as TForm) Form) and ((Application.Components[x] as TForm).Visible) then

begin

A_Top := (Application.Components[x] as TForm).Top;

A_Right := (Application.Components[x] as TForm).Left;

A_Height := (Application.Components[x] as TForm).Height;

A_Bottom := (Application.Components[x] as TForm).Top + A_Height;

A_Left := (Application.Components[x] as TForm).Left;

A_Width := (Application.Components[x] as TForm).Width;



{ Obere Seite }

A_T_1 := (A_Top) - Rand;

A_T_2 := (A_Top) + Rand;

if (Form.Top + Form.Height > A_T_1) and (Form.Top + Form.Height < A_T_2) then

begin

Form.Top := A_Top - Form.Height;

if AlignToDestination then

begin

Form.Left := A_Left;

Form.Width := A_Width;

end;

end;

{ Rechte Seite }

A_R := (A_Right + A_Width) - Rand;

A_W := (A_Right + A_Width) + Rand;

if (Form.Left > A_R) and (Form.Left < A_W) then

begin

Form.Left := A_Right + A_Width;

if AlignToDestination then

begin

Form.Top := A_Top;

Form.Height := A_Height;

end;

end;

{ Untere Seite }

A_B_1 := (A_Bottom) - Rand;

A_B_2 := (A_Bottom) + Rand;

if (Form.Top > A_B_1) and (Form.Top < A_B_2) then

begin

Form.Top := A_Bottom;

if AlignToDestination then

begin

Form.Left := A_Left;

Form.Width := A_Width;

end;

end;

{ Linke Seite }

A_L_1 := (A_Left) - Rand;

A_L_2 := (A_Left) + Rand;

if (Form.Left + Form.Width > A_L_1) and (Form.Left + Form.Width < A_L_2) then

begin

Form.Left := A_Left - Form.Width;

if AlignToDestination then

begin

Form.Top := A_Top;

Form.Height := A_Height;

end;

end;

end;

end;







Benutzung:



Formbewegung abfangen, dann folgendes ausführen:



Check_Seiten_Form2Form(Self,30,True);

// Form wird bei -30..+30 Pixeln angeklebt und auch an die Größe angepasst

Check_Seiten_Form2Form(Self);

// Form wird bei -[vorgabe]..+[vorgabe] Pixeln angeklebt, Größe wird NICHT angepasst



Die Sache mit dem Doppelcode (Form.Top := A_Top;Form.Height := A_Height;) unter Aligntodestination kann ich selbst schnell optimieren, ist hier für die Verständlichkeit komplett so eingefasst..



Hinweis: Es werden alle, auch dynamisch erstellte Forms verarbeitet, eine Endlosschleife könnte entstehen, wenn eine Form automaisch an bestimmte Positionen gesetzt wird oder die Höhe/Breite per Timer angepasst wird.







Gruß
~Mathias
..   ————————————————————————————————————————
..
..   Private Seite: http://www.nogad.de
..
..   ————————————————————————————————————————
..
..   Pension Fiege - Inhaber Monika Fiege
..   Kranichfelder Straße 68
..   99097 Erfurt
..
..   Tel: +49 361 41 38 39
..   Fax: +49 361 42 150 87
..
..   www.Pension-Fiege.de
..
..   ————————————————————————————————————————


geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: