Перейти к содержанию

Дмитрий Потапов

Пользователи
  • Активность

    50
  • Зарегистрирован

  • Посещение

  • Победитель дней

    4

Весь контент Дмитрий Потапов

  1. В общем. ВСЕМ спасибо. Реально работает, все это время у было это решение под рукой, но из-за неправильного использования оно не работало...
  2. Это решение подразумевает наличие этих файлов на диске? (к сожалению, сейчас проверить это решение не имею возможности). Просто у меня архив с нестандартной структурой и хотелось бы получить иконки файлов без их извлечения на диск. Например (насколько я знаю), так работает WinRar и 7-zip, они не извлекают файлы для того получить их иконки. Можно открыть архив на несколько гигабайт и он корректно покажет иконки файлов. Вот чего я хочу добиться, чтобы отобразить иконку файла, но если самого файла на диске нет. P.S: Даже смотрел в сторону еще одного костыльного решения: создавать пустые файлы, которые содержатся в архиве и тогда вполне корректно смогу получить их иконки.
  3. Доброго времени суток. Имеется необходимость получить иконки файлов. Суть такая: Имеются некие файлы-архивы, с нестандартной структурой файла. Проще говоря, я пишу приложение-архиватор для своего типа файлов. Все бы ничего, но хотелось бы скрасить некрасивый голый список файлов иконками (как в проводнике). Соответственно я начал изучать этот вопрос, как же получить иконку по расширению файла. Например: у меня установлен AIMP и все поддерживаемые AIMP'ом файлы отображаются его иконками. EXE, DLL, BAT, CMD и др - системными иконками. Можно поискать готовые решения в виде ShellListBox, ShellListView и т.д., но они не подойдут, как минимум потому, что файлы, которыми я заполняю список не распакованы, они находятся в файле-архиве. Соответственно функции по типу ExtractIcon (ссылка на docs.microsoft.com) и др. не подходят, файла-то нет. Я нашел одно решение - поиск иконок по реестру. В принципе это работает, но далеко не так, как хотелось бы... Информация в реестре почему-то порой не соответствует указанным мною параметрам. Например, в реестре у меня иконки подгружаются из файла VLC.exe. Изначально так оно и было, пока я не сменил их на AIMP, в проводнике это привело к нужному результату (иконки сменились), а вот в реестре до сих пор отображается VLC, соответственно, когда я ищу иконку по расширению .mp3, я нахожу иконку VLC, хотя настройки ассоциации формата .mp3 явно указывают на AIMP. Так же, в реестре порой можно наткнуться на отсутствие необходимых ключей и значений, в таком случае я реализовал подгрузку иконки (Unknown. т.е, когда проводник не распознал формат файла и показывает просто белый файл). В итоге у меня половина проверенных мною форматов шла (Unknown). Собственно вопрос: В какую сторону копать для решения данной проблемы? (Решения "только для FireMonkey" не подойдут, ибо нужны именно WinAPI-решения). Код получения иконки по формату файла: (не самое лучшее решение, это очевидно). Прикрепляю небольшой пример использования этой функции. Project1.zip
  4. WINDOWLESS - это Lite версия библиотеки, я же использую обычную версию, так что все правильно в этом случае.
  5. Здесь просто забыл дописать, ибо писал это все с телефона, да и времени особо не было. В коде же stdcall есть обязательно перед каждой функцией библиотеки
  6. Начну по порядку: 1. SCFN я сразу же расшифровал как: __stdcall *НАЗВАНИЕ ФУНКЦИИ* - например __stdcall SciterVersion(bool major) 2. Я изначально использовал тип BOOL в Delphi, но так как его значение true является (-1), то я перешел на Integer, ведь функции и с ним работают нормально, по крайней мере что бы я не проверил подставив Integer вместо BOOL, результат был ожидаемым и ничего нигде не падало с каким-либо исключением. Из-за того, что значение BOOL (true) является -1, функции не считали его как true, они принимали значения (true - 1, false - 0)? Соответственно функция SciterVersion(true) (BOOL) возвращала то же, что и SciterVersion(false), а вот когда я перешел на Integer, результат функции SciterVersion(1) и SciterVersion(0) стал отличаться. К сожалению, но ничего из этого мне не помогает, и вообще было предпринято мною изначально. Пока-что, единственный мой выход из ситуации *костыль* в виде отдельной DLL-библиотеки-посредника, с которой связывается мой Delphi-код, а та в свою очередь вызывает одноименный метод структуры ISciterAPI в нужной мне библиотеке и возвращает мне через этого *посредника* мне обратно в Delphi-код. Выглядит ужасно, но это работает... Хотелось бы все-таки обойтись без этого костыля. Сейчас у меня работает это примерно так: 1. Delphi (вызывает функцию SciterVersion(1)) из DLL-посредника 2. DLL-посредник связывается с основной библиотекой и вызывает оттуда одноименный метод структуры ISciterAPI 3. DLL-посредник возвращает мне результат, полученный из основной функции. Минус этого подхода для меня в том, что после серьезного обновления библиотеки, или любого другого, которое хоть как-то заденет API, мне придется переписывать DLL-посредника для соответствия последним изменениям API Sciter. А так же придется переписывать код Delphi для соответствия последним моим изменениям DLL-посредника. ЭТО КРАЙНЕ НЕУДОБНО
  7. Всем доброго времени суток, имеется проблема... Есть библиотека sciter, я хочу ее использовать в Delphi, но имеющиеся там *привязки*(bindings) ориентированы на Delphi 7 (но это не самое главное, они рассчитаны на версию библиотеки 3.x, в то время, как библиотека уже давно 4.4.x, собственно там много чего нет). Но у библиотеки есть C PLAIN API, при помощи которого можно запросто подружить ее с Delphi, чем я собственно и занимаюсь, но возникла проблема.. Есть основная функция, которая возвращает структуру с кучей других функций (ISciterAPI), она в принципе работает, некоторые функции я пробовал из нее вызывать и они работали отлично, но работают лишь несколько первых функций нормально, остальные же сыплются на Access Violation, хотя на других языках это работает нормально. Структура выглядит таким образом, потом при помощи другой функции возвращается указатель на эту структуру ISciterAPI* (В самой структуре функций намного больше). typedef struct ISciterAPI { UINT version; LPCWSTR SciterClassName(void); UINT SciterVersion(BOOL major); }; typedef ISciterAPI* LPSciterAPI; В Delphi я все оформляю так: type PSciterAPI = ^ISciterAPI; ISciterAPI = packed record version: UINT; SciterClassName: function(): LPCWSTR; // LPCWSTR - PWideChar; SciterVersion: function(major: Integer): UINT; // Использовал до этого BOOL, но наткнулся на статью, где рассказывалось о том, что он немного странно работает, мол BOOL false = 0, а BOOL true = -1; Поэтому напрмиер функция SciterVersion у меня не работала правильно, но при использовании Integer все стало нормально работать. end; Но, как я уже сказал ранее - только некоторые функции работают, остальные падают с исключением ACCESS VIOLATION. Почему так может быть? P.S: Единственный пока рабочий для меня вариант - написание отдельной библиотеки, которая выносит все эти функции в экспорт, соответственно их теперь можно вызывать непосредственно из самой библиотеки, минуя ISciterAPI, но минусы такого подхода в том, что эта библиотека по сути является посредником между программой на Delphi и Sciter...
  8. Ну, если я не ошибаюсь, то Project->Format Project Sources, как раз и форматирует все юниты проекта.
  9. Да, про это знаю. До текущего момента пользовался этим, но я уже несколько лет пользовался именно встроенным средством форматирования кода. К тому же я его настраивал как мне было удобно. А тот, что поставляется с CnWizards форматирует только в одном порядке, без какой-либо возможности редактирования правил форматирования. Вопрос уже решил, но теперь форматировать смогу только по одному файлу за раз. CTRL+D (работает, причем берет параметры из настроек для Formatter), а вот если использовать через меню Project->Format Project Sources, то весь код портится сразу.
  10. Спасибо за файл, но почему-то это не принесло ожидаемого результата(( Буду искать решение проблемы еще... Upd: можно еще файл Embarcadero.Modeling.Formatter.dll? Upd2: Вопрос решен! (не знаю, одно ли то же это или нет, но форматирование кода через меню Project->Format Project Sources поганит весь код, а если использовать сочетание клавиш CTRL+D, то он конечно форматирует только текущий документ (вроде), то все работает нормально).
  11. Приветствую. Перешел на 10.4, но столкнулся с проблемой. Либо я чего-то недопонимаю, либо Embarcadero убили Formatter, ибо строки после форматирования прыгают аж на 8 табов (Tab stop), хотя в настройках все указано верно, пробовал играться с профилями утилиты, но толку это не дало. По этому пришел к следующему выводу - надо попробовать заменить Formatter на заведомо рабочий из 10.3.3. Собственно, у меня к вам просьба. Могли бы скинуть Formatter.exe из папки Вашей среды? Он находится по следующему пути: ДИСК:\ПУТЬДОСТУДИИ\bin\Formatter.exe (например у меня: C:\Embarcadero\Studio\bin\Formatter.exe). Прошу скинуть его сюда. Спасибо! Upd: К слову о том, что происходит во время форматирования кода при помощи Formatter.exe (скрины под спойлером)
  12. Держите, кому нужно. В архиве библиотеки BASS (для Windows и Android), а так же все найденные мною дополнения (У меня есть дополнения не для всех платформ. Например, какие-то дополнения я нашел только под Windows, а библиотеки каких-то дополнений BASS есть не на каждый процессор) ВАЖНОЕ ЗАМЕЧАНИЕ: Для дополнений у меня нет юнитов, но их не сложно сделать самому. Просто скачиваем с сайта un4seen необходимые плагины для Windows и переписываем его на динамическую загрузку (LoadLibrary, GetProcAddress и т.д.). Библиотеку протестировал, проверил не все функции, но основное все работало прекрасно. Проверял следующее: BASS_Init, BASS_StreamCreateFile, BASS_StreamCreateURL, BASS_ChannelPlay, BASS_ChannelPause, BASS_ChannelIsActive, BASS_ChannelGetAttribute, BASS_ChannelSetAttribute, BASS_ChannelGetLength, BASS_GetConfig, BASS_SetConfig, BASS_GetConfigPtr, BASS_SetConfigPtr (вроде все, может что-то упустил). Все работало на Windows и Android. Если нужна будет помощь с подключением библиотеки - задавайте вопросы bass.zip
  13. Приветствую. Имеются кнопки, в стиле которых есть иконки. Захотелось немного сэкономить свое время и вместо того, чтобы делать несколько отдельных иконок с разными цветами, я подумал раскрасить одну иконку в нужный цвет в нужный момент времени. Например: Кнопка неактивна - иконка темно-серого цвета. Кнопка активна - иконка черного цвета. Кнопка выделена курсором (MouseEnter) - иконка например темно-синего цвета. и т.д. По сути подумал использовать встроенный эффект TFillRGBEffect. Цвет легко меняется, в дизайнтайме все работает хорошо, но стоит только запустить программу, как во время инициализации формы приложение немного зависает а после вылетает с ошибкой. (скрины ошибок под спойлером). .
  14. В общем. Вот пример. Для его работоспособности пришлось добавить одну строчку в файл FMX.Platform.Win.pas, связана она с тем, чтобы получить возможность перехватывать сообщения окна. Решение взято было отсюда: Далее, использовал этот код (написанный на C#). Взяв решение оттуда и просто чуть-чуть переделав его под Delphi смог получить нативную тень над формой. Проверил на форме с нестандартным стилем (который затрагивает заголовок формы), там есть проблема (не понял, как ее решить, да и не копал особо в эту сторону). Если использовать тень, то заголовок формы перекрывается родным от Windows и из-за этого он полностью ломается (не реагирует на перемещение, изменение размеров и кнопки так же неактивны). Так что самым простым вариантом с нестандартным стилем для меня оказалось - просто использовать BorderStyle - None, конечно, тогда придется вручную реализовывать бордюр и заголовок, а так же перемещение за заголовок и изменение размеров формы за бордюры. Но, благо в Firemonkey уже это все реализовано в виде двух простых функций StartWindowDrag и StartWindowResize. В общем, если у кого-то есть идеи, как это можно улучшить и САМОЕ ГЛАВНОЕ решить проблему с нестандартными стилями - буду благодарен за помощь. BorderlessWindowWithShadow.zip
  15. Так и я тоже) Решение я вообще собирал отчасти по кусочкам с различных форумов. Так же была и ваша часть) Но, когда я сделал все, у моего окна было "две" тени, одна нативная от Win10, вторая, как у вас. Так что строчка SetClassLong(...) не пригодилась мне, убрав ее я убрал такую тень. Как буду за домашним пк, то скину сюда пример с кодом.
  16. CreateParams я не использовал, WndProc тоже (только в одном файле, FMX.Platform.Win вроде). Есть только одно различие, я не использовал кастомный стиль, использовал пока только Borderless форму и все. Но сегодня попробую еще и с кастомным стилем. По итогу получилась Borderless форма с нативной тенью из Windows 10.
  17. Да пожалуйста). Там просто глупая вещь получилась (очень). Забыл подключить библиотеку (LoadBASSDLL) Так что тут ничего сверхъестественного, после этого все, что я хотел работало нормально.
  18. Все. Кажется понял в чем дело. Библиотека завелась нормально.
  19. PAnsiChar - это я под Windows делал. Таким образом я смог с легкостью пользоваться этими функциями (BASS_GetConfigPtr и BASS_SetConfigPtr) и получать\устанавливать значения строковых параметров. В Android же такой тип не поддерживается и соответственно что-то другое нужно. Я сейчас еще ковыряю проект. PAnsiChar изначально и нет в pas файле. У меня так же, что в Win версии, что в Android версии на этих функциях идет Pointer.
  20. Приветствую. На просторах интернета нашел BASS-библиотеку для Android и соответственно обертку для нее под Delphi. Вроде бы все работает нормально, но вот при настройке библиотеки при помощи методов BASS_GetConfigPtr, BASS_SetConfigPtr для работы со строковыми параметрами возникает проблема. На Windows с этим я легко работал, там достаточно использовать такую конструкцию PAnsiChar(BASS_GetConfigPtr(configId)) и получаем значение. BASS_SetConfigPtr(configId, PAnsiChar(value)) и задаем значение. Но вот под Android такой способ не проходит, как минимум по одной причине - он не понимает, что такое PAnsiChar. На docwiki.emarcadero.com, есть вот такая статейка. В которой написано, что PAnsiChar нужно заменить одним из трех: System.String, System.MarshalledString или System.SysUtils.TStringBuiler Только вот, если использовать MarshalledString, то при попытке получить значение приложение просто намертво зависает и все. Потом я подумал, так как библиотека написана на Java (вероятно), то может стоит попробовать использовать JNI в работе с ней, так как в Java файле, который прилагался вместе с библиотекой. Там я нашел объявления этих функций и заметил, что тип возвращаемого значения Object (ну, не зная Java я просто предположил, что это тоже просто ссылка на значение, например как PAnsiChar в Delphi на Windows). Но, при попытке как-либо использовать это натыкаюсь на проблемы в виде ошибки компиляции, либо очередном зависании приложения. Так как возвращается Object, то решил попробовать вариант с JObject и JString, но ни один вариант не хочет работать, опять ошибки на стадии компиляции, либо зависание приложение. Может быть, я что-то не так делаю. В общем, буду признателен за помощь!
  21. BlurBehind Control. Компонент позволяет использовать размытие, по типу, которое реализовано в WIndows 10, т.е компонент позволяет "размыть" то, что находится под ним. Пусть и увидел это непосредственно в самой студии на стартовой странице (Welcome Page), но все-таки подумал скинуть ссылку сюда. Исходники: https://github.com/grijjy/CodeRage2019/tree/master/BlurBehind Видео:
×
×
  • Создать...