Перейти к содержанию
Fire Monkey от А до Я

Вадим Смоленский

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

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

  • Посещение

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

    5

Весь контент Вадим Смоленский

  1. В смысле, положить FMX.Platform.Win.pas в ...Embarcadero\Studio\19.0\lib\win32\release ?
  2. Ага... И тогда, получается, это будет работать только на сборках для релиза, но не для отладки, так?
  3. Сделал и это. Результат тот же. По идее, достаточно ведь просто скопировать?
  4. Ну, вот сейчас удалил, результат тот же. При щелчке по иконке приложение теряет/возвращает фокус, но не сворачивается. Я правильно понял, что имеются в виду dcu собственно проекта? Каких-то других dcu ведь нигде не спрятано?
  5. Старательно последовал этой рекомендации, но ни малейшего результата не наблюдаю. Что могло пойти не так?
  6. Отвечаю на свой вопрос сам - вдруг кому пригодится. Наличие или отсутствие aero-темы при запуске можно определить следующим образом: function IsThisAero: Boolean; type TDwmIsCompositionEnabledFunc = function(out pfEnabled: BOOL): HRESULT; stdcall; var IsEnabled: BOOL; ModuleHandle: HMODULE; DwmIsCompositionEnabledFunc: TDwmIsCompositionEnabledFunc; begin Result := False; if Win32MajorVersion>=6 then // Vista or Windows 7+ begin ModuleHandle := LoadLibrary('dwmapi.dll'); if ModuleHandle <> 0 then try @DwmIsCompositionEnabledFunc := GetProcAddress(ModuleHandle, 'DwmIsCompositionEnabled'); if Assigned(DwmIsCompositionEnabledFunc) then if DwmIsCompositionEnabledFunc(IsEnabled) = S_OK then Result := IsEnabled; finally FreeLibrary(ModuleHandle); end; end; end; Критичным в моем случае оказалось то, что при запуске без aero-темы, но с экранным масштабированием многое масштабируется по-другому. Точнее сказать, одно масштабируется, а другое нет. Соответственно, чтобы компоненты приложения выравнивались, как задумано, приходится в разных ситуациях применять два разных коэффициента: один всегда равен экранному масштабу, а другой - только при запусках с aero; при запусках же без aero обращается в единицу. Всё это выходит довольно запутанно, часто при выборе коэффициента мне приходилось действовать методом тыка. Но в итоге добиился того, что приложение выглядит более-менее одинаково в обоих вариантах запуска.
  7. Что такое XE 10.1? Berlin? В этой версии точно TImage снабжен свойством WrapMode. И при чем здесь Main_Form? Это у вас TImage так назван?
  8. Точно такого же нет. Если хотите, чтобы у вас не масштабировались TButton, TLabel и им подобные контролы, то можно воспользоваться их параметром Scale - это масштаб контрола по горизонтали (Scale.X) и вертикали (Scale.Y). Если вы знаете коэффициент экранного масштабирования, то достаточно сделать так: MyButton.Scale.X:=1/Coefficient; MyButton.Scale.Y:=1/Coefficient; Сам же коэффициент извлекается следующим образом (вот здесь меня проинструктировал dnekrasov): Coefficient:=FMX.Helpers.Win.GetWndScale(FMX.Platform.Win.ApplicationHWND); Не забудьте только вставить FMX.Helpers.Win в раздел uses.
  9. По умолчанию TImage.WrapMode=TImageWrapMode.Fit Чтобы картинка не масштабировалась, нужно выставить TImage.WrapMode := TImageWrapMode.Original
  10. Наткнулся на странное поведение FMX-приложений под Windows. Если развернуть окно приложения на весь экран, потом воспользоваться системной кнопкой "Свернуть все окна" (в правом нижнем углу экрана) и после этого опять вызвать окно приложения, то оно выводится уже не развернутым, а обычным. Появились недовольные таким поведением пользователи. Можно ли их чем-нибудь утешить?
  11. Это в планах, но не в первоочередных - равно как и Mac. Я даже не подступался еще к этим вопросам. Но пользователи хотят запускать уже сейчас, хотя бы через эмулятор.
  12. Когда мое приложение для Windows компилировалось в Delphi 6, линуксоиды успешно запускали его в Wine. Рапортовали, что неидеально, но работать можно. Теперь, после перевода на FireMonkey, один тестировщик попробовал запустить его в Wine 3.0 и сообщает: "Результат неутешителен - программа в нём практически не работает. Интерфейс сломан, кнопки интерфейса не нажимаются (в большинстве; а если и нажимаются, то возникают всякие ошибки)." Не сталкивался ли кто-нибудь здесь с этой проблемой? Я тихо надеюсь, что существует некая волшебная кнопка, которая поможет всё наладить. Приложение использует FireDAC и SQLite. Сторонних компонентов никаких.
  13. Отвечаю сам себе: да, есть такой способ! У TPathData есть метод GetBounds: if TextToPath(PD,DestRect,TheKanjiString,False,TTextAlign.Leading,TTextAlign.Leading) then begin W:=(Width-PD.GetBounds.Width)/2; H:=(Height-PD.GetBounds.Height)/2; PD.Translate(X+W-PD.GetBounds.Left,Y+H-PD.GetBounds.Top); FillPath(PD,1); end; Теперь всё красиво:
  14. Впрочем, не всё так гладко. Вот, например, как теперь выводится иероглиф "Единица", состоящий из одного-единственного горизонтального штриха: А по идее, он должен быть всё-таки в середине. Так что, наверное, оставлю этот подход лишь для тех случаев, когда используется шрифт, которого нет в списке предусмотренных. Хотя, может, есть способ вытащить откуда-то из TPathData информацию о реальных размерах символа и, исходя из нее, смещать его туда-сюда? Было бы замечательно.
  15. FillText с Offset, к сожалению, не срабатывает, иероглиф смещается по вертикали. Стало быть, приму вариант с FillPath. Спасибо!
  16. Я и рад бы это опробовать но не понял, куда именно нужно вставлять такое смещение в случае FillText. А вставка PD.Translate помогла, теперь иероглиф надежно прилепляется к левому и верхнему краям. Хорошо бы еще научиться выравнивать его, чтобы он не лепился к этим краям, а вставал бы в середину указанного прямоугольника. Не приходит пока в голову, как это сделать.
  17. Спустя три недели все-таки решил опробовать ваш вариант с TPathData, а то тестировщики продолжают жаловаться. Сделал, не задействуя TPathLabel, вот так: with ThisImage.Bitmap.Canvas do begin PD:=TPathData.Create; BeginScene; try if TextToPath(PD,RectF(X,Y,Width-1,Height-1),TheText,False,TTextAlign.Leading,TTextAlign.Leading) then FillPath(PD,1); finally PD.Free; end; EndScene; end; Увы, результат ровно тот же, с нежелательными вертикальными смещениями.
  18. Я буквально позавчера задался здесь этим вопросом, и меня просветили: в обработчиках таких событий, как OnMouseDown или OnMouseUp нужно проверять параметр Shift. При нажатии пальцем он приобретает значение [ssTouch].
  19. Один тестер моего проекта (один изо всей команды!) поставил меня в полный тупик. У него Windows 7, и он запускает приложение на разных компьютерах, выбирая разные темы - то с Aero, то без. Почему-то приложение выглядит у него прилично лишь при запуске с Aero; при запуске же с базовой темой наблюдаются искажения отрисовки и функциональные нарушения. А на одном компьютере с Aero-темой приложение может не запуститься вовсе: например, если установлено системное масштабирование шрифтов 135%. Тогда при запуске появляется сообщение об ошибке в модуле ntdll.dll. Не мог бы кто-нибудь разъяснить, как установка темы связана с параметрами Windows API? Можно ли как-то нивелировать эту разницу? На что вообще в таких случаях нужно обратить внимание?
  20. Ну, допустим, в обработчике OnMouseMove это можно сделать. Но что мне делать, например, с обработчиком события OnMouseEnter, по которому для некоторых контролов тоже выводится кастомизированная всплывающая подсказка? На планшете эту подсказку мне нужно подавить, но параметр Shift здесь не передается - следовательно, ваш совет уже не применим.
  21. Я наоборот перевел весь свой огромный многолетний проект с VCL на FMX, потому что хочу в перспективе портировать его на Мак и, может быть, на Линукс. Мобильных платформ не трогаю, для них уже есть версии. Что до системных функций, то предусмотрены ведь всякие {$IFDEF MSWINDOWS}, с ними, по идее, можно исхитряться. Хотя я, конечно, понимаю, что при реальном портировании всё будет гораздо сложнее, чем сейчас видится.
  22. В ходе дальнейших штудий и экспериментов пришел к следующему. Определить, что программа запущена на устройстве с сенсорным экраном, можно так: function IsTabletPC: Boolean; begin result:=(GetSystemMetrics(SM_TABLETPC)<>0); end; Когда это определено, нужно присвоить всем OnMouseMove:=nil (кроме тех, где это все-таки нужно - например, связанных с перетаскиванием или рисованием). В моем случае это подавило непрошенные всплывающие подсказки при нажатии пальцем. События OnMouseDown и OnMouseUp все-таки отрабатываются, но есть нюанс с параметром Shift. У меня в коде кое-где проверялось условие Shift=[]. На планшете это отчего-то не срабатывает, что-то там иное передается (что именно, не знаю, планшет был не у меня, а у тестера). Я переписал код, избегая этих проверок, и теперь всё прекрасно работает. Еще один момент был связан с проверкой Button=TMouseButton.mbLeft: на всякий случай я везде добавил or (IsTabletPC). Просто не был уверен, что палец целиком эквивалентен левой кнопке. Не знаю, как там на самом деле обстоит дело. В общем, обошелся без события OnTap. Плохо понимаю, для чего оно вообще нужно.
  23. Разрабатывая свою софтину, о сенсорных экранах я совсем не думал (отстал от прогресса). Но один тестер сейчас погонял текущую сборку на планшете. Оказалось, что почти всё работает хорошо, но в некоторых местах по нажатию пальцем отрабатывается не OnClick и не OnMouseUp, а почему-то OnMouseMove. Прежде чем изобретать велосипед, хочу спросить у знающих людей: а как вообще лучше организовывать работу с мышью/пальцем, чтобы она одинаково хорошо шла в обоих вариантах? Есть ли здесь четкие рекомендации? Вот, например, я вижу событие OnTap: стоит ли задействовать его? Или это только для мобильных платформ?
  24. В общем случае мне нужно выводить не просто одиночный иероглиф, а несколько японских символов, соседствующих на TCanvas с кириллицей и латиницей. Там это едва ли подойдет. Но на главную панель словарной статьи выводится именно одиночный иероглиф, крупным шрифтом (как показано на моих картинках). Именно там наиболее возможен выбор пользователем нестандартного шрифта. Так что вариант с TPathLabel я непременно опробую, спасибо!
  25. Думаю, причина в том, что я создавал проект еще под Windows 7. Соответственно, создался стиль под семерку. А на днях, перейдя на десятку, я этот стиль удалил и руками добавил "Windows 10 Desktop". Поэтому дизайнер форм чистый.
×
×
  • Создать...