Подтвердить что ты не робот

Лучший способ обмена изображениями между несколькими приложениями

Я работаю над проектом, состоящим из нескольких скомпилированных приложений Delphi (более 20 exe ​​и dll), и мне нужно будет поделиться более 60 изображениями (16x16, 24x24, 32x32,...) между всеми их.

У меня есть два разных способа обмена изображениями между всеми приложениями, но я не уверен, что лучше:


Идея 1:

Создайте проект DLL, доступный только для ресурсов, который содержит ссылку ссылки на ресурс в файле .res, который содержит все мои изображения. Каждое приложение, в свою очередь, загружает DLL и считывает необходимые изображения, которые могут потребоваться либо в TImageList, либо в TImage в зависимости от того, что ему нужно.

Плюсы: позволяет сохранять изображения в репозитории в их собственном формате.

Минусы: я не буду видеть изображения во время разработки, так как они будут загружаться только во время выполнения. Мне также нужно создать такое же количество констант, как и изображения, или использовать набор с тем же числом значений, что и изображения, чтобы каждое изображение можно было ссылаться независимо от его имени в файле ресурсов.


Идея 2:

Создайте модуль данных, который скомпилирован как bpl и включен как пакет времени выполнения для всех приложений. Я бы добавил изображения к нескольким TImageList (в зависимости от размера изображения) или к TPngImageList (который позволяет изображениям нескольких размеров на одном компоненте).

Плюсы: я смогу добавить этот модуль данных ко всем приложениям, которые мне нужны, и увидеть во время разработки все изображения, которые мне могут понадобиться.

Минусы: все изображения будут загружены в память, даже если мне нужно использовать их только. Мне нужно убедиться, что порядок изображений никогда не изменяется при добавлении/изменении изображений в TImageList/TPngImageList. Все изображения будут сохранены в одном формате .dfm.


Идея 3: (новая)

Посмотрев на другие приложения, которым также нужно обмениваться изображениями между скомпилированными exe, у меня возникла еще одна идея. Сохраните все общие изображения в виде простых файлов png/ico в подпапке, где скомпилированные файлы (например, данные).

Плюсы: не нужно загружать все изображения в память, я могу просто получить нужные. Это может быть особенно важно, если общее количество изображений довольно велико (одно приложение, использующее этот метод, имеет 1400 изображений в подпапке данных).

Минусы: изображения будут видимыми/доступными для всех. Может использовать немного больше места на диске пользователя.


Я хотел бы попросить дать комментарии по этим двум идеям или любым другим предложениям о том, как лучше выполнить это.

Спасибо!

4b9b3361

Ответ 1

У меня есть сильное предпочтение для варианта 1. Выполнение этого способа позволяет сохранить изображения в вашем репозитории контроля версий в их собственном формате. С опцией 2 вы храните изображения в файлах .dfm, которые я считаю чрезвычайно неудовлетворительными. Недостатком является то, что вы теряете время просмотра дизайна изображений. Я лично предпочитаю делать этот компромисс.

В моем программном обеспечении у меня есть один глобальный список изображений, который я заполняю во время выполнения, загружая из ресурсов, и, конечно же, также назначаю индексы изображений во время выполнения. Другое преимущество, которое это приносит, - это возможность выбирать размеры изображений, соответствующие масштабированию шрифтов. В противном случае вам нужно иметь отдельные списки изображений для значков 16px, значков 20px, значков 24px, значков 32px и т.д.

Ответ 2

Другой вариант - написать свой собственный компонент TImage с дополнительными свойствами.

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

В процедурах установки вы загружаете изображение из ресурса.
Таким образом, вы все равно сможете видеть изображения во время разработки.

Обязательно переопределите механизм сохранения изображения в файле dfm, чтобы ваш exe не раздулся с изображениями, которые уже находятся в dll.

На 100% не уверен, как это сделать, но если вы хотите следовать этому маршруту, я уверен, что у кого-то есть легкий ответ на этот вопрос.