No dobrze, PoC gotowy.
Dla przykładu użyłem loga 4p, tak aby pokazać, że kształty i zawartość podświetlanych fragmentów nie mają większego znaczenia. Są trzy Memo
, każde z nich podświetla dany fragment loga – reszta jest nieaktywna. Wszystkie Memo
i Image
są nazwane domyślnie, z zachowaniem indeksu – dzięki temu można łatwo się do nich odnieść. Wszystkie obrazki wbrew pozorom nie obsługują przezroczystości – są 24-bitowe, z białym tłem w szare linie. Łącznie z tłem.
O co chodzi – użyte kontrolki mają nazwy Memo0
, Memo1
, Memo2
, Image0
, Image1
oraz Image2
. Dodatkowo, każde Memo
ma ustawiony Tag
na wartość od 0
do 2
. Do tego mamy wygenerowaną parę zdarzeń – OnMouseEnter
i OnMouseLeave
dla Memo0
– które podpięte są w oknie inspektora obiektów do pozostałych Memo
. Wyglądają tak:
procedure TForm1.Memo0MouseEnter(ASender: TObject);
var
LMemo: TMemo absolute ASender;
begin
UpdateImageVisibility(LMemo.Tag, True);
end;
procedure TForm1.Memo0MouseLeave(ASender: TObject);
var
LMemo: TMemo absolute ASender;
begin
UpdateImageVisibility(LMemo.Tag, False);
end;
Deklaracja LMemo
służy do tego, aby móc traktować ASender
nie jako TObject
, a właśnie jako TMemo
, bo trzeba się dobrać do właściwości Tag
(a TObject
go nie posiada). Następnie wywoływana jest metoda UpdateImageVisibility
, która wygląda tak:
procedure TForm1.UpdateImageVisibility(AIndex: Integer; AVisible: Boolean);
var
LImage: TImage;
LImageName: String;
begin
LImageName := Format('Image%d', [AIndex]);
LImage := FindChildControl(LImageName) as TImage;
LImage.Visible := AVisible;
end;
Pierwsza linijka po begin
służy do określenia nazwy komponentu Image
, na podstawie indeksu z parametru AIndex
. Chodzi o to, aby uzyskać ciąg Image0
, Image1
lub Image2
, bo takie nazwy komponentów Image
używamy.
Kolejna linijka służy do znalezienia komponentu o przygotowanej nazwie (trzymanej w zmiennej LImageName
) i zwrócenia referencji tego komponentu. Z racji tej, że metoda FindChildControl
zwraca referencję typu TControl
, rzutujemy ją na TImage
za pomocą operatora as
. Do zmiennej LImage
ląduje referencja docelowego Image
.
Ostatnim krokiem jest zmiana stanu widoczności naszego obrazka, co wykonywane jest w ostatniej linijce – wartość AVisible
wpisywana jest do właściwości Visible
, która albo ukrywa komponent (jeśli True
), albo go pokazuje (jeśli False
). Wartość True
przekazywana jest w zdarzeniu OnMouseEnter
, bo chcemy pokazać dany Image
, a False
w zdarzeniu OnMouseLeave
, aby go ukryć.
I to wszystko – cały kod modułu głównego okna wrzucam tutaj. Jak widać, jest go niewiele, a jeśli dojdą kolejne pary Image
i Memo
, to przybędzie jedynie kodu deklaracji kontrolek w klasie okna – zdarzenia będzie można podpiąć pod nowe kontrolki, nie pisząc ani jednej linijki kodu.
Zrzut z działania aplikacji jest w załączniku (filmik .webm), tak samo jak źródła projektu z plikiem .exe do potestowania. Załącznik oprócz źródeł projektu zawiera także cztery używane grafiki, więc możesz sobie popatrzeć jak one wyglądają.
PS: Niektóre rzeczy można było zapisać krócej, jednak nie chciałem zbyt skomplikować kodu. No i też trochę spieszyłem się z tym przykładem, więc nie wszystko dobrze przemyślałem. Ale jest Ok – możesz korzystać. :P