1. Друзья, в это тяжёлое и непонятное для всех нас время мы просим вас воздержаться от любых упоминаний политики на форуме, - этим ситуации не поможешь, а только возникнут ненужные ссоры и обиды. Это касается также шуток и юмора на тему конфликта. Пусть войны будут только виртуальными, а политики решают разногласия дипломатическим путём. С уважением, администрация Old-Games.RU.

    Скрыть объявление
  2. Пожалуйста, внимательно прочитайте правила раздела.
  3. Если Вы видите это сообщение, значит, вы ещё не зарегистрировались на нашем форуме.

    Зарегистрируйтесь, если вы хотите принять участие в обсуждениях. Перед регистрацией примите к сведению:
    1. Не регистрируйтесь с никами типа asdfdadhgd, 354621 и тому подобными, не несущими смысловой нагрузки (ник должен быть читаемым!): такие пользователи будут сразу заблокированы!
    2. Не регистрируйте больше одной учётной записи. Если у вас возникли проблемы при регистрации, то вы можете воспользоваться формой обратной связи внизу страницы.
    3. Регистрируйтесь с реально существующими E-mail адресами, иначе вы не сможете завершить регистрацию.
    4. Обязательно ознакомьтесь с правилами поведения на нашем форуме, чтобы избежать дальнейших конфликтов и непонимания.
    С уважением, администрация форума Old-Games.RU
    Скрыть объявление

Soft Вопросы от горе-программиста

Тема в разделе "Hard & Soft", создана пользователем Talking_Sword, 26 фев 2019.

  1. Talking_Sword

    Talking_Sword

    Регистрация:
    2 авг 2013
    Сообщения:
    259
    1. У меня есть база данных в Microsoft Access. В ней есть таблица, в которой есть поле "Tags", содержащее теги, по которым можно найти нужную запись(и). Я поискал в интернете, как делаются SQL-запросы, и придумал такой запрос:

    Код:
    SELECT ID,MD5,MD5+"."+EXT AS FileName,Rating,Tags,CStr(DIR)+"\" AS Folder FROM Images WHERE Tags LIKE "*tag1*" AND Tags LIKE "*tag2*" ORDER BY ID DESC
    Это даже работает, но имеется одна проблема, которая делает этот запрос непригодным к использованию: например, я делаю следующий запрос:

    Код:
    SELECT ID,MD5,MD5+"."+EXT AS FileName,Rating,Tags,CStr(DIR)+"\" AS Folder FROM Images WHERE Tags LIKE "*tag*" ORDER BY ID DESC
    У меня нет записей, содержащих тег "tag", есть только: "tag1", "tag2", "tag3", "tag4", "tag5", но такой запрос найдет их все. Почему это происходит - понятно, * означает любое количество символов, в том числе и нулевое. Нужно так, чтобы если тег введен не полностью, то вообще ничего не находилось. Конечно, можно "окружить" тег пробелами (Tags LIKE "* tag *"), но тогда перестанут искаться теги, стоящие в начале или в конце. Например, есть запись, где содержимое поля "Tags" такое: "tag1 tag2 tag3". Нужно так, чтобы эту запись можно было найти по всем трем тегам, но в случае с пробелами, эта запись будет найдена только по тегу "tag2". Можно, конечно, в поле "Tags" добавить пробел в начале и в конце, но мне это кажется слишком "грязным" методом решения этой проблемы.

    2. Посоветуйте DLL, при помощи которой можно загрузить\сохранить картинку в популярных форматах (интересуют bmp, gif, jpg, png). Нужна совместимость с Windows 95.
     
  2.  
  3. amdx

    amdx

    Регистрация:
    15 фев 2019
    Сообщения:
    55
    В базах MS SQL такое реализуется через UDF, которая парсит строку с тегами в соответствии с выбранными правилами, преобразуя строку в таблицу с множеством строк и из одной колонки.
    Но вот в ACCESS придется городить неплохой огород, ибо возможности запроса ограничены.
    Если поле с тегами только одно, то обязательно делать разделитель. Вы предлагали пробел, но обычно используется запятая или точка с запятой, т.к. пробелы во многих версиях SQL справа - "съедаются" при сравнении данных.
    Это, кстати, не костыльный вариант, а вполне себе заслуживающий внимания
    --- добавлено 26 фев 2019, предыдущее сообщение размещено: 26 фев 2019 ---
    И хотелось бы побольше реальных примеров данных, вместо пресловутых tag, tag1, tag2.
    Я вижу строку с тегами так:
    ";красный;круглый;" - два тега
    ";синий;" - один тег
    Таким образом даже в ACCESS можно писать поиск без парсинга, вида LIKE "*;синий;*"
     
    Talking_Sword нравится это.
  4. grandpa

    grandpa

    Регистрация:
    13 дек 2018
    Сообщения:
    109
    Я бы порекомендовал нормализовать базу. Тогда можно будет писать запросы вида:
    SELECT DISTINCT Images.* FROM Images JOIN Tags ON Images.ID = Tags.image_ID WHERE Tags.tag_name IN ('tag1', 'tag2')
     
  5. Goblinit

    Goblinit

    Регистрация:
    18 мар 2011
    Сообщения:
    4.405
    К ирфанвию в своё время шло куча плагинов. Попробуйте посмотреть старые.
     
  6. daemolisher

    daemolisher

    Регистрация:
    2 дек 2009
    Сообщения:
    1.704
    Может быть DevIL?
    Там есть ссылка на SF, где можно найти файлы ещё 2001 года этой библиотеки.

    Во времена Windows 95 ещё только появлялся .PNG формат :)
     
    Talking_Sword нравится это.
  7. Talking_Sword

    Talking_Sword

    Регистрация:
    2 авг 2013
    Сообщения:
    259
    Прежде чем привести пример реальных придется объяснить, что же я хочу реализовать, а то будет совсем непонятно. В первом сообщении я не стал объяснять, потому что подумал, что объяснение будет слишком громоздким, но сейчас уже понял свою ошибку (получилось еще непонятнее, да и объяснение того, что я хочу от запроса получилось тоже несколько громоздким).

    Я, конечно, мог написать, что хочу написать свой Booru, который работает как десктопное приложение, а не как движок сайта, но побоялся что, возможно, многие люди здесь могут быть "не в теме" и не пользоваться *booru-сайтами, и не понять, о чем идет речь. Если вы не понаслышке знакомы с *booru-сайтами, можете не читать описание ниже.

    Что такое Booru?

    Ну не знаю, возможно в некоторых версиях SQL они "съедается", но Access с ними "дружит"

    А теперь пример реальных данных:
    Код:
    1girl akashio_(loli_ace) beach blob blonde_hair blue_eyes blue_sky boots broom capelet forest hat lake nature puyo_(puyopuyo) puyopuyo river shirt skirt sky smile solo windmill witch witch_(puyopuyo)
    (поле "Tags" одной из картинок, взял из своей тестовой БД)

    Правда, он уже не нужен, я уже нашел решение проблемы.

    Дело в том, что вопрос по организации коллекции аниме-картинок у меня возник еще в 2012(?) году. Тогда я попытался найти программу, которая обеспечивала бы функционал Booru на локальном компьютере. Тогда я ничего подходящего не нашел, и поставил Apache+MySQL+PHP+Gelbooru (попутно наступив на все гарабли, которые только могут быть). Эта связка у меня работает до сих пор, ей я сейчас пишу замену. Когда я составлял свою БД, я ориентировался на уже существующую базу из Gelbooru, просматривая ее через phpMyAdmin. Я просматривал таблицы посто нажимая на кнопку "Browse" рядом с таблицей. В этом и была моя ошибка. Вчера я попробовал нажать редактирование на одной случайно взятой записи, и увидел, что оказывается в начале и в конце поля "Tags" есть пробелы! Почему-то при "простом" просмотре таблицы пробел в начале не отображается. Так что этот метод вовсе не такой уж и грязный, раз уж используется в Gelbooru.

    Не могли бы вы объяснить как это сделать? Я не очень хорошо разбираюсь в базах данных. На сколько я понял, под теги нужна будет отдельная таблица? А как ее связать с таблицей "Images"? Я, конечно, знаю про поля подстановки, но в нем можно выбрать только одно значение. Как быть, если нужно сразу несколько?

    У меня есть еще пара вопросов:

    1. Посоветуйте DLL, при помощи которой можно расчитать MD5-сумму файла. Опять же, нужна совместимость с Windows 95.
    2. Подскажите статью, в которой бы были подробно разобраны Uset Control-ы в Visual Basic 6 (можно на английском).
     
  8. amdx

    amdx

    Регистрация:
    15 фев 2019
    Сообщения:
    55
    Да, это будет отдельная таблица с тегами. У каждого изображения в таблице Images должен быть ID и он наверняка есть.
    Теперь создаем таблицу Tags, создаем поля ImageID и Tag. Таким образом получаем сопоставление картинки и тега. Не забываем создать кластерный индекс по полю ImageID.
    Осталось только заполнить эту таблицу первоначальными данными. Для этого для каждого изображения из Images парсим поле Tag и вставляем в таблицу Tags нужное число строк.
    Поскольку делать это нужно только один раз и поскольку язык запросов в Access весьма ограниченный, я бы реализовал это в VBA перебором строк из таблицы.
    Если хотите, то могу помочь с кодом.
    В принципе, на Delphi7 могу вам создать такую DLL с одной экспортируемой функцией. Подойдет?
     
    Talking_Sword нравится это.
  9. grandpa

    grandpa

    Регистрация:
    13 дек 2018
    Сообщения:
    109
    Про таблицы вам уже написали выше. К этому добавлю, что для связи таблиц желательно создать foreign key чтобы обеспечить целостность. Можно пойти дальше и создать ещё одну таблицу возможных тегов, которая будет связана с первой через вторую, состоящую из image_id и tag_id. Получится так называемая связь многие-ко-многим. Это позволит, например, получать список тегов для полей выбора в UI и вообще работать с тегами без сложных запросов к первой таблице. Кроме того, вы сможете добавить тегам свойства, например, для сортировки по значимости/частоте/... при отображении. Что касается множественного выбора и поля подстановки, я полагаю, это вы, в конечном счёте, про пользовательский интерфейс (давно не брал я в руки Access)? Если да, то вам, вероятно, сюда: VBA MultiSelect Property of ListBox Explained with Examples
    Заполняете listbox тегами из третьей таблицы, затем из выбранных пользователем элементов составляете IN(). Конструкторы существенно ограничены в возможностях, придётся больше напрямую кодить в SQL и VBA.
     
    Последнее редактирование: 1 мар 2019
    Talking_Sword и Goblinit нравится это.
  10. Talking_Sword

    Talking_Sword

    Регистрация:
    2 авг 2013
    Сообщения:
    259
    Нет. Я не хочу никого заставлять писать программу ради меня, поэтому нужно что-то готовое.

    Насчет БД. После того, что написали amdx и grandpa у меня окончательно пошла кругом голова. Я запутался. Подскажите, можно ли в phpMyAdmin посмотреть связи между таблицами и как это сделать. Как я уже писал выше, у меня уже есть готовая база в MySQL, сделаная через Gelbooru. Я посмотрю, как в ней все связано, и постараюсь сделать так же в Access.
     
  11. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.054
    Связи по внешним ключам?
    Структура -> Связи.
    --- добавлено 1 мар 2019, предыдущее сообщение размещено: 1 мар 2019 ---
    В МySQL используй REGEXP или RLIKE.
    Регулярные выражения в MySQL

    В MSAccess тоже должно быть что-то подобное.
     
  12. Talking_Sword

    Talking_Sword

    Регистрация:
    2 авг 2013
    Сообщения:
    259
    Error
    The additional Features for working with linked Tables have been deactivated. To find out why click here.

    После нажатия на "here": PMA Database ... not OK[ Documentation ]
    General relation features Disabled

    В документации написано, что phpMyAdmin нужны какие-то свои таблицы. Опять сложности, нужно разбираться.
    Это уже не актуально, я уже решил эту проблему.
     
  13. Helmut Herr Mannelig

    Helmut

    Переводчик

    Регистрация:
    18 мар 2008
    Сообщения:
    7.054
    Да, он при установке создает собственную БД с кучей таблиц.
     
  14. Talking_Sword

    Talking_Sword

    Регистрация:
    2 авг 2013
    Сообщения:
    259
    Я снова решил вернуться к своей программе. Пока решил отступиться от вопросов БД и заняться выводом изображения. Для этих целей выше посоветовали DevIL. Кто-нибудь знает, можно ли найти в интернете примеры кода Visual Basic (не VB.NET) с использованием DevIL? Если такие примеры найти нельзя, посоветуйте другую библиотеку, к которой можно найти примеры кода на Visual Basic.
     
  15. amdx

    amdx

    Регистрация:
    15 фев 2019
    Сообщения:
    55
  16. Talking_Sword

    Talking_Sword

    Регистрация:
    2 авг 2013
    Сообщения:
    259
    Увы, это не то. Совем не то. У меня изображения не будут хранится в БД, а будут хранится в виде отдельных файлов.

    Нужен пример кода на Visual Basic для отображения на форме изображения с использованием DLL, поддерживающей изображения в популярных форматах (интересуют bmp, gif, jpg, png). Можно ли найти примеры кода в интернете?

    P.S.: Я использую Visual Basic 6, а не VBA.
     
  17. grandpa

    grandpa

    Регистрация:
    13 дек 2018
    Сообщения:
    109
  18. amdx

    amdx

    Регистрация:
    15 фев 2019
    Сообщения:
    55
    Вообще, для таких задач когда то служила GDI+
    Уж для нее полно примеров
     
  19. Talking_Sword

    Talking_Sword

    Регистрация:
    2 авг 2013
    Сообщения:
    259
    @grandpa, я хочу сделать программу без использования ActiveX.
    @amdx, GDI+ это уже что-то из области Windows 2000 (и новее), а я хочу сделать программу для Windows 95. Да и неизветно, будет ли она нормально поддерживать JPEG.
     
  1. На этом сайте используются файлы cookie, чтобы персонализировать содержимое, хранить Ваши предпочтения и держать Вас авторизованным в системе, если Вы зарегистрировались.
    Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie.
    Скрыть объявление