Położenie jednej formy względem drugiej

0

Witam,

Mam problem, a szczegółowo, to tak: mam 2 formy. Pierwsza jest widoczna cały czas, zaś druga po kliknięciu buttona powinna pojawić się w górnym prawym rogu. Cały czas próbuję to zrobić, ale teraz utknąłem. Nie wiem czemu z kodu poniżej wyskakuje błąd.

procedure TForm5.FormCreate(Sender: TObject);
begin
Form5.Left:=Form1.Left+(Form1.Width-Form5.Width);
Form5.Top:=Form1.Top+(Form1.Height-Form5.Height);

end;

Proszę o pomoc i pozdrawiam,
Starmax

0

W górnym prawym rogu pierwszej formy czy rogu ekranu? Napisałeś w tytule "względem drugiej". Jak chcesz w prawym górnym rogu względem drugiej formy to:

Form2.Left := Form1.Left + Form1.Width;
Form2.Top := Form1.Top;

A względem ekranu w jego prawym górnym rogu:

Form2.Left := // <klops> Dawno nie pisałem nic w Delphi i nie pamiętam jak się odczytuje właściwości ekranu ;/
// W każdym razie poszukaj w necie jak odczytać długość i wysokość ekranu, a szablon będzie taki:
Form2.Left := dl_ekranu - Form2.Width;
Form2.Top := 0;

Powinno działać.

A jaki tam masz błąd?? <treść>

0
Form5.Left:=Form1.Left+(Form1.Width-Form5.Width);
Form5.Top:=Form1.Top+(Form1.Height-Form5.Height);

Podczas tworzenia formy nie ma ona jeszcze przypisanych wymiarów (chyba), lecz nie powinno to wywoływać błędu.

0

Odwołanie jest do formy, która jeszcze nie istnieje.
Takie rzeczy wykonuje się w OnShow/OnActivate formy głównej.

0

U mnie ten kod

Form2.Left:=Form1.Left+(Form1.Width-Form2.Width);
Form2.Top:=Form1.Top+(Form1.Height-Form2.Height);

Działa bezproblemowo.
Kod podpięty pod Form2.Create, a pod Form1.Button1.Click jest wyświetlenie tej formy.
Brak błędów, choć wg.mnie pozycja okna powinna być ustawiana w Form1.Button1.Click przed wyświetleniem Form2 (czy tam Form5).

0

Hmmm na Delphi się wprawdzie nie wyznaję,ale czy tutaj nie ma czasem możliwości stworzenia relacji child-parent pomiędzy formami?Wówczas z automatu pozycja childa będzie dostosowana do pozycji parenta

0
Starmax napisał(a)

Mam problem, a szczegółowo, to tak: mam 2 formy. Pierwsza jest widoczna cały czas, zaś druga po kliknięciu buttona powinna pojawić się w górnym prawym rogu.

Krótko i na temat:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Form5.Left:= Form1.ClientOrigin.X + Form1.ClientWidth - Form5.Width;
  Form5.Top:= Form1.ClientOrigin.Y;
  Form5.Show;
end;
0

Może źle napisałem. Chodzi mi o położenie Jednej formy wzg. drugiej. Druga forma po kliknięciu buttona powinna pojawić się w górnym prawym rogu formy pierwszej.

Zaś treść błędu brzmi:

Project Project1.exe raised exception class EAcessViolation with message 'Access violation at adress 00470042 in module 'Project1.exe'. Read of adress 00000048'. Process stopped. Use Step or Run to Continue.

Pozdrawiam
Starmax

0

O jakie ustawienie w rogu Ci chodzi? Przedstawiłem 2 moje możliwości, o ktorą ci chodzi? (może jeszcze inną??):
Forma 2. względem I - środek formy w prawym górnym rogu Formy 1.:
user image
Forma 2. względem I - lewy dolny róg Formy 2. w prawym górnym Formy 1.:
user image

Kod dla możliwości I.:

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2.Left := Form1.Left + Form1.Width - (Form2.Width / 2);
Form2.Top := Form1.Top + (Form2.Height / 2);
Form2.ShowModal;
end;

Kod dla możliwości II podałem kilka postów wyżej.

0

Dokładnie chodzi mi o możliwość II, ale i przy niej pojawia mi się błąd "Project Project1.exe raised exception class EAcessViolation with message 'Access violation at adress 00470042 in module 'Project1.exe'. Read of adress 00000048'. Process stopped. Use Step or Run to Continue."

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