2011-08-29 13 views
17

Pracuję nad projektem, który składa się z kilku skompilowanych aplikacji Delphi (ponad 20 plików exe i dll) i będę potrzebować udostępnić ponad 60 obrazów (16x16, 24x24, 32x32 , ...) między wszystkimi.Najlepszy sposób udostępniania obrazów między kilkoma aplikacjami

mam chociaż na dwa różne sposoby udostępniania zdjęć między wszystkimi aplikacjami, ale nie jestem pewien, co jest lepsze:


Pomysł 1:

Tworzenie z zasobów tylko projekt DLL, który zawiera odsyłacz do odnośnika do pliku .res, który zawiera wszystkie moje obrazy. Każda aplikacja będzie z kolei ładować bibliotekę dll i odczytać niezbędne obrazy, które mogą być potrzebne do TImageList lub TImage w zależności od potrzeb.

Plusy: Umożliwia przechowywanie obrazów w repozytorium w ich macierzystym formacie.

Minusy: Nie będę mógł oglądać zdjęć w czasie projektowania, ponieważ będą one ładowane tylko w czasie wykonywania. Będę również musiał utworzyć taką samą liczbę stałych, jak są obrazy, lub użyć zestawu o takiej samej liczbie wartości, jak w przypadku obrazów, aby można było odwoływać się do każdego obrazu niezależnie od jego nazwy w pliku zasobów.


Pomysł 2:

utworzyć moduł danych, które są skompilowane jako BPL i zawarte w pakiecie run-time na wszystkich zastosowań. Dodałbym obrazy do kilku bibliotek TImageList (w zależności od rozmiaru obrazu) lub do TPngImageList (która pozwala na obrazy o różnych rozmiarach na jednym komponencie).

Plusy: Będę w stanie dodać ten moduł danych do wszystkich potrzebnych aplikacji i zobaczyć w czasie projektowania wszystkie obrazy, które mogą być potrzebne.

Minusy: Wszystkie obrazy zostaną załadowane do pamięci, nawet jeśli będę potrzebować tylko jednego. Muszę się upewnić, że kolejność obrazów nigdy się nie zmieni podczas dodawania/modyfikowania obrazów do TImageList/TPngImageList. Wszystkie obrazy będą przechowywane w jednym pliku .dfm.


Pomysł 3: (Nowe)

Po patrząc na inne aplikacje, które również muszą udostępniać zdjęcia między skompilowanych exe, miałem jeszcze inny pomysł. Zapisz wszystkie udostępnione obrazy jako zwykłe pliki png/ico w podfolderze, w którym znajdują się skompilowane pliki (na przykład dane).

Plusy: Nie ma potrzeby wczytywania wszystkich obrazów do pamięci, mogę tylko uzyskać potrzebne. Może to być szczególnie ważne, jeśli całkowita liczba obrazów jest dość duża (jedna aplikacja korzystająca z tej metody ma 1400 obrazów w podfolderze Dane).

Przeciw: Obrazy będą widoczne dla każdego. Może zużywać nieco więcej miejsca na dysku na komputerze użytkownika.


Chciałbym poprosić o komentarze na temat tych dwóch pomysłów lub innych sugestii, jak lepiej to osiągnąć.

Dzięki!

+0

Odnośnie pomysłu 2: Czy byłbyś w stanie uwolnić obrazy, których nie potrzebujesz w czasie wykonywania? – Jeff

+0

Nie sądzę, mogę łatwo zwolnić obrazy, których nie potrzebuję w czasie wykonywania, głównie dlatego, że jeśli usunę te, których nie potrzebuję z TImageList, to nie będą miały poprawnego imageindex przypisanego do żadnej kontroli kto używa TImageList. – smartins

Odpowiedz

11

Mam silną preferencję dla opcji 1. Robienie tego w ten sposób umożliwia przechowywanie obrazów w repozytorium kontroli wersji w ich macierzystym formacie. Za pomocą opcji 2 można przechowywać obrazy w plikach .dfm, które uważam za niezadowalające. Minusem jest to, że tracisz czas oglądania obrazów. Osobiście wolę dokonać tego kompromisu.

W moim oprogramowaniu mam jedną globalną listę obrazów, którą zapełniam w środowisku wykonawczym, ładując z zasobów, i oczywiście również przypisuję indeksy obrazów w czasie wykonywania. Inną zaletą tego jest możliwość wyboru rozmiarów obrazu odpowiednich do skalowania czcionek. W przeciwnym razie musisz mieć oddzielne listy obrazów dla ikon 16px, ikon 20px, ikon 24px, ikon 32px itp.

+0

Dzięki David za odpowiedź. Nie wiedziałem jednak, w jaki sposób każde rozwiązanie będzie przechowywane w repozytorium, ale powinieneś podać poprawny punkt dotyczący problemu z DFM, który jest kolejnym problemem dla pomysłu 2. Zmienię to pytanie, aby uwzględnić to również. – smartins

7

Inną opcją jest napisanie własnego komponentu TImage z dodatkowymi właściwościami o nazwie.

property dllname: string read fdllname write set_dllname; 
property resname: string read fresname write set_resname; 

W procedurach ustawiających należy załadować obraz z zasobu.
W ten sposób nadal będziesz mógł oglądać obrazy w czasie projektowania.

Upewnij się, że zastąpiłeś mechanizm zapisywania obrazu w pliku dfm, aby twój exe nie został przepełniony obrazami, które są już w bibliotece dll.

Nie jestem w 100% pewien, jak to zrobić, ale jeśli chcesz podążać tą trasą, jestem pewien, że ktoś ma łatwą odpowiedź na to pytanie.

+0

nie ma dyrektywy "stored" dla właściwości, które można również określić jako false? –

+0

@Marjan, dobre połączenie, zobacz: http://stackoverflow.com/questions/2072096/stored-keyword-in-delphi – Johan

Powiązane problemy