Problem ze skalowaniem komponentów na formie
Napisane: niedziela, 22 kwietnia 2018, 21:24
Witam!
Mam problem ze skalowaniem komponentów na formie programu.
Duży obrazek w formacie PNG (4960x3508) "przeskalowuję" do rozmiaru (1143x808) i odrysowuję go na Canvas formy, która ma rozmiar 1143x854. Dlaczego akurat taki rozmiar obrazka? Ponieważ jest to minimalna wielkość przy której w miarę widać detale.
Na tle formy (na obrazku) jest sporo rubryk, więc na formie umieściłem odpowiadające im pola Memo, Edit, Label itd. Na powyższym rysunku umieściłem tylko jedno pole białego koloru.
Podczas korzystania z programu komponenty zostają wypełniane danymi. Współrzędne tych komponentów są dopasowane do minimalnego rozmiaru tła formy, gdyż z taką rozdzielczością startuje program.
Właściwość BorderStyle formy ustawiłem na bsSingle aby okno można było tylko maksymalizować lub wracać do minimalnego rozmiaru (nie da się płynnie rozciągać okna).
Gdy ktoś naciśnie opcję maksymalizuj, to odpowiednia funkcja przeskalowuje z maksymalnego PNGa (4960x3508) do aktualnego, możliwie największego rozmiaru okna, przy zachowaniu proporcji obrazka. Działa to naprawdę całkiem dobrze.
Problem pojawia się gdy chciałem przeskalować wszystkie obiekty na formie aby po zmaksymalizowaniu trafiły dokładnie w miejsca odpowiadające tłu formy. Zabieg wydaje się być prosty. Przy zwiększaniu formy, mnożyłem właściwości (left, top, width, height) komponentów przez ten sam współczynnik. Niestety wychodzą dziwne akcje. Komponenty nie są w tych miejscach.
Znalazłem przykłady na YT, jak robią podobne rzeczy w Delphi lub C# i tam mało kto pisał ręcznie funkcję skalującą na piechotę, tylko wszystkie komponenty na formie musiały mieć właściwość Align ustawioną na alCustom oraz właściwości Anchors (akLeft=true, akTop=true, akRight=true). Wówczas podczas zmiany rozmiaru okna wszystkie komponenty automatycznie powinny się przeskalować...ale to nie działa, wcale się nie skalują. Moja funkcja przynajmniej powodowała właściwą zmianę skali ale w niewłaściwe miejsce.
Myślę, że problem polega na tym, że na canvasie formy ,o minimalnych współrzędnych (0, 0, 1143, 854), odrysowuję obrazek zmniejszony do 1143x808, nie od Left=0 i Top=0, tylko od Left=0 i Top=25. Te 25 pikseli przeznaczyłem na Buttony. Nie chciałem aby były umieszczone na tle formy (nie ma tam za bardzo miejsca).
Próbowałem na wszelakie sposoby. Nawet liczyłem to na kartce i wydawało mi się, że wszystko się zgadza ale w programie pola edycyjne nie trafiają dokładnie w to samo miejsce tylko trochę przesunięte w lewo. Na początku myślałem, że to wina zaokrągleń floatów na int-y ale teraz wiem, że to nie możliwe.
Proszę o pomoc.
Mam problem ze skalowaniem komponentów na formie programu.
Duży obrazek w formacie PNG (4960x3508) "przeskalowuję" do rozmiaru (1143x808) i odrysowuję go na Canvas formy, która ma rozmiar 1143x854. Dlaczego akurat taki rozmiar obrazka? Ponieważ jest to minimalna wielkość przy której w miarę widać detale.
Na tle formy (na obrazku) jest sporo rubryk, więc na formie umieściłem odpowiadające im pola Memo, Edit, Label itd. Na powyższym rysunku umieściłem tylko jedno pole białego koloru.
Podczas korzystania z programu komponenty zostają wypełniane danymi. Współrzędne tych komponentów są dopasowane do minimalnego rozmiaru tła formy, gdyż z taką rozdzielczością startuje program.
Właściwość BorderStyle formy ustawiłem na bsSingle aby okno można było tylko maksymalizować lub wracać do minimalnego rozmiaru (nie da się płynnie rozciągać okna).
Gdy ktoś naciśnie opcję maksymalizuj, to odpowiednia funkcja przeskalowuje z maksymalnego PNGa (4960x3508) do aktualnego, możliwie największego rozmiaru okna, przy zachowaniu proporcji obrazka. Działa to naprawdę całkiem dobrze.
Problem pojawia się gdy chciałem przeskalować wszystkie obiekty na formie aby po zmaksymalizowaniu trafiły dokładnie w miejsca odpowiadające tłu formy. Zabieg wydaje się być prosty. Przy zwiększaniu formy, mnożyłem właściwości (left, top, width, height) komponentów przez ten sam współczynnik. Niestety wychodzą dziwne akcje. Komponenty nie są w tych miejscach.
Znalazłem przykłady na YT, jak robią podobne rzeczy w Delphi lub C# i tam mało kto pisał ręcznie funkcję skalującą na piechotę, tylko wszystkie komponenty na formie musiały mieć właściwość Align ustawioną na alCustom oraz właściwości Anchors (akLeft=true, akTop=true, akRight=true). Wówczas podczas zmiany rozmiaru okna wszystkie komponenty automatycznie powinny się przeskalować...ale to nie działa, wcale się nie skalują. Moja funkcja przynajmniej powodowała właściwą zmianę skali ale w niewłaściwe miejsce.
Myślę, że problem polega na tym, że na canvasie formy ,o minimalnych współrzędnych (0, 0, 1143, 854), odrysowuję obrazek zmniejszony do 1143x808, nie od Left=0 i Top=0, tylko od Left=0 i Top=25. Te 25 pikseli przeznaczyłem na Buttony. Nie chciałem aby były umieszczone na tle formy (nie ma tam za bardzo miejsca).
Próbowałem na wszelakie sposoby. Nawet liczyłem to na kartce i wydawało mi się, że wszystko się zgadza ale w programie pola edycyjne nie trafiają dokładnie w to samo miejsce tylko trochę przesunięte w lewo. Na początku myślałem, że to wina zaokrągleń floatów na int-y ale teraz wiem, że to nie możliwe.
Proszę o pomoc.