Olesio, moim skromnym zdaniem, masz talent do komplikowania rzeczy nieskomplikowanych. Przejrzałem źródła Twojego programu tylko pobieżnie, bo analiza kodu nie jest moim ulubionym zajęciem jeżeli chodzi o programowanie. Wolę sam tworzyć kod i .. niech inni się męczą podczas jego analizy ;)
Ja rozwiązałbym problem wysuwania się formularza w ten sposób (oczywiście kod jest odporny na ustawienie paska zadań po prawej stronie):
procedure TForm2.FormCreate(Sender: TObject);
var WorkRect: TRect;
begin
SystemParametersInfo(SPI_GETWORKAREA, 0, @WorkRect, 0);
Left:= WorkRect.Right + 1; {*}
Show; {*}
Hide; {*}
Left:= WorkRect.Right - Width;
Top:= WorkRect.Bottom - Height;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
AnimateWindow(Form2.Handle, 500, AW_SLIDE or AW_VER_NEGATIVE); // 500 - czas w ms
Form2.Show; // Show jest tu konieczne
end;
Kod jest krótki i myślę, że niezbyt skomplikowany, ale parę słów komentarza nie zaszkodzi.
Po co są te 3 linijki kodu oznaczone gwiazdkami, które odpowiadają za wyświetlenie poza ekranem i natychmiastowe ukrycie formularza? Właściwie można by się bez nich obejść, ale wówczas podczas pierwszego użycia funkcji AnimateWindow będzie się wysuwał pusty formularz, a wszystkie kontrolki, które się na nim znajdują pokażą się dopiero po zakończeniu animacji. Każda następna animacja jest już ze wszystkimi kontrolkami
Dlaczego po AnimateWindow jest jeszcze Form2.Schow? Bez tego formularz nie reaguje na wszystkie zdarzenia. Można zmienić tekst w Edit, ale nie można wywołać procedury np Click przypisanej do Buttona. Można przesunąć formularz chwytając za belkę tytułową, ale nie można go zamknąć naciskając przycisk "x" w prawym rogu. Formularz niby jest, a jakoby go nie było.
Działanie sprawdzone na Windows XP + Delphi 7, ale powinno działać również w nowszych wersjach