TImage ze ScrollBarem.

0

W jaki sposób do TImage dołączyć ScrollBar? Próbowałem kilku opcji z wartościami Min i Max. Próbowałem także ze zdarzeniem ScrollBarChange z zawartością Image1.Top:=ScrollBar.Position, jednak nie przyniosło to oczekiwanego rezultatu. Efekt jaki chciałbym uzyskać, to komponent Image którego zawartość mogę dowolnie przesuwać- tak jak stronę internetową scrollem.

dodanie znacznika `` - Furious Programming

1

poszukaj komponentu ScrollBox i umieść w nim Image, scroll'e będą się automatycznie dostosowywać do rozmiaru Image

0

Jeśli koniecznie chcesz rysować po komponencie TImage, to przechowaj oryginalny obraz np. w dodatkowym polu klasy formularza; W komponencie trzeba będzie malować tylko fragment oryginalnego obrazu, więc w kolejnej zmiennej, np. typu TPoint przechowaj sobie aktualny offset od lewej krawędzi oryginalnego obrazu i od górnej krawędzi; Następnie w odpowiednich zdarzeniach inkrementuj te offsety i maluj odpowiedni fragment; Do skopiowania fragmentu oryginalnego obrazu i namalowania go w komponencie użyj metody TCanvas.CopyRect;

Dzięki temu będziesz mógł dowolnie "przesuwać obrazem" - bez względu na to czy paskami przesuwu, czy np. klawiszami strzałek, czy myszą (do tych dwóch ostatnich trzeba będzie machnąć dodatkowy kod obsługi klawiszy i zdarzeń myszy);

Dodatkowo możesz sobie zabezpieczyć, aby offsety nie mogły być ujemne, a także aby razem z wysokością komponentu TImage nie były większe, niż rozmiary oryginalnego obrazu.

0

Jeśli koniecznie chcesz rysować po komponencie TImage

Po sposobie wypowiedzi wnioskuję, iż TImage nie jest najlepszym sposobem realizującym grafikę. Chciałbym uzyskać układ współrzędnych kartezjańskich, w którym będę rysował obiekty wg. tych współrzędnych. Jak najlepiej to uzyskać?

1

@nieznany - tu nie chodzi o to, co będzie najlepsze (bo w obu przypadkach i tak będziesz korzystał z TImage) tylko o to, co będzie kosztować mniej pracy, czyli mniej kodu; Jeśli wykorzystasz wspomniany TScrollBox to wystarczy jedynie położyć na niego komponent obrazka i załadować do niego grafikę lub ją narysować - tyle zabawy; W przypadku własnego rysowania będzie nieco więcej roboty, jednak oczywiście jest to do zrobienia;

Wczoraj z ciekawości pobawiłem się i wystarczająco dobry efekt można uzyskać na komponencie TImage; Tyle że ja chciałem wiedzieć, czy przesuwanie obrazu myszą będzie działało płynnie na moim dość leciwym sprzęcie i muszę stwierdzić, że bez problemu będzie, nawet przy dużych grafikach; Wystarczą odpowiednie obliczenia i tak jak wspomniałem w poprzednim poście:

  • dodatkowa zmienna (lub pole klasy formularza) typu np. TBitmap, do której ładujesz całą grafikę lub na niej rysujesz,
  • dodatkowa zmienna określająca offsety aktualnie wyświetlonego fragmentu oryginalnego obrazu;
    Przy przesuwaniu scrollem zwiększasz lub zmniejszasz odpowiedni offset (osi X lub Y) i rysujesz w komponencie fragment oryginalnego obrazu, bazując właśnie na ustawianych offsetach;

Robiąc to ręcznie będziesz musiał dodatkowo stworzyć paski przesuwu, zainicjować wartości ich właściwości i przypisać nowe zdarzenia, jeśli nie masz tego komponentu na palecie, czyli nie możesz ich położyć na formie i ustawić w edytorze formularza; Ja nie mam tego komponentu na palecie, więc stworzyłem je dynamicznie i wszystko śmigało; Trzeba tylko nieco pokombinować - robota na góra godzinę.

0

Dziękuję, udało się rozwiązać problem (nie przez TScrollBox a przez przesuwanie myszką, rozwiązanie wygodniejsze). Powrócę jednak do pytania- chcę uzyskać układ współrzędnych kartezjańskich, na który będę mógł wstawiać obiekty podobnie jak do TImage. Czy należałoby to wykonać przy pomocy TImage, czy inaczej?

0

chcę uzyskać układ współrzędnych kartezjańskich, na który będę mógł wstawiać obiekty podobnie jak do TImage.

To znaczy co chcesz zrobić? Jakie obiekty i kiedy chcesz je wstawiać? Napisz nieco precyzyjniej;

Czy należałoby to wykonać przy pomocy TImage, czy inaczej?

TImage jest klasą komponentu, więc powinno się je używać na formularzach; Jeśli potrzebujesz w pamięci trzymać jakiś obraz, to wykorzystaj klasę TBitmap; Zresztą komponenty i tak wszystko trzymają w bitmapach, nawet jak wczytasz PNG; Będziesz mógł albo rysować po bitmapie, albo skopiować do niej fragment innej; Wszystko opisałem Ci w poprzednim swoim poście.

0

Właśnie obmyśliłem, iż do każdej wprowadzanej współrzędnej (np. -256 czy też 55) można dodawać pewną wartość (np. +1000), dzięki czemu można będzie rysować obiekty w TImage obiekty niczym na siatce współrzędnych, nawet z wartościami na minusie. Tak więc współrzędne i przesuwanie tego obiektu już rozwiązane.

Jakie obiekty i kiedy chcesz je wstawiać?

Zamierzenie jest takie: mamy TImage. Na TImage nanosimy elementy. I dopóki są to elementy TCanvas (TextOut, LineTo), to jest łatwo. Ja natomiast chciałbym np. wstawić na TImage obiekt (np. linię z punktu A do punktu B), który będzie miał dodatkowe parametry (np. wyświetlanie podpowiedzi po najechaniu na niego). Jak to zrobić? Znalazłem TShape. Nie ma tam jednak np. tworzenia linii, zaś w zdarzeniach nie ma np. zdarzenia kliknięcia na obiekt. Czy zdarzenie takie mogę wywołać mimo to, czy należy je w jakiś sposób dodać? Mam nadzieję, że napisałem w miarę jasno- przepraszam za rozwlekanie wypowiedzi.

0

Hmm, sporo zabawy będzie z zewnętrzną obsługą takich "obiektów";

Jeśli miałbym takie coś zrobić dla siebie, to na pewno stworzyłbym własny komponent, dziedziczony po jakiejś graficznej klasie, np. TGraphicControl; Do niej dodałbym odpowiednie metody do dodawania/usuwania takich "obiektów", dzięki czemu miałbym przyjazny interfejs do modyfikowania zawartości komponentu; Do tego na pewno kilka właściwości, np. do ustalania stylu rysowania obiektów, kolorystyki siatki, jej rozmiarów itd.; No i oprogramowałbym sobie komunikaty myszy (czyli dodał zdarzenia niższego poziomu), aby można było wewnętrznie obsługiwać choćby hinty;

Polecam więc zapoznanie się z tematyką budowania własnych komponentów, dlatego że zewnętrzne obsługiwanie tego typu dodatków będzie uciążliwe; Sam dawno temu w ten sposób przerabiałem ListBoxy i naprawdę dokładanie nowych rzeczy poza klasą komponentu jest denerwujące - kod się rozłazi, zamiast być spójny w jednym miejscu (w jednej klasie).

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