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

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

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

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

  • Посещение

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

    5

Вадим Смоленский стал победителем дня 3 декабря 2018

Вадим Смоленский имел наиболее популярный контент!

Информация о Вадим Смоленский

  • Звание
    Продвинутый пользователь

Посетители профиля

Блок последних пользователей отключён и не показывается другим пользователям.

  1. Это замечательная новость. Но у меня 10.2, и бесплатно обновиться до 10.4, как я понимаю, нельзя.
  2. В FireMonkey приходится перехватывать сообщения Windows, чтобы обеспечить корректное сворачивание и разворачивание окон. Это здесь уже обсуждалось. Я в итоге сделал у себя так: var TheFormIsMinimized: Boolean = False; TheFormWasMaximized: Boolean = False; function NewWndProc(Wnd: HWND; Msg: UINT; WParam: WPARAM; LParam: LPARAM): LRESULT; stdcall; begin if (Msg = WM_SHOWWINDOW) and (LParam = SW_PARENTCLOSING) and (not TheFormIsMinimized) then begin TheFormIsMinimized := True; TheFormWasMaximized := (MainForm.WindowState=TWindowState.wsMaximized); SendMessage(FormToHWND(MainForm), WM_SYSCOMMAND, SC_MINIMIZE, 0); MainFormp.WindowState := TWindowState.wsMinimized; end else if (Msg = WM_SHOWWINDOW) and (LParam = SW_PARENTOPENING) and (TheFormIsMinimized) then begin TheFormIsMinimized := False; SendMessage(FormToHWND(MainForm), WM_SYSCOMMAND, SC_RESTORE, 0); if TheFormWasMaximized then begin SendMessage(FormToHWND(MainForm),WM_SYSCOMMAND,SC_MAXIMIZE,0); LookUp.WindowState:=TWindowState.wsMaximized; end else begin SendMessage(FormToHWND(MainForm),WM_SYSCOMMAND,SC_RESTORE,0); LookUp.WindowState:=TWindowState.wsNormal; end; end else Result:=CallWindowProc(OldWndProc, Wnd, Msg, WParam, LParam); end; Это работает — но восстановленное из трея окно находится не в фокусе. Пользователь должен дополнительно щелкнуть по нему мышкой. Вставка оператора SetFocus(FormToHWND(MainForm)) непосредственно сюда же ничего не дает — равно как и операторов SendMessage(FormToHWND(MainForm),WM_ACTIVATE,WA_ACTIVE,0), Winapi.Windows.SetActiveWindow(FormToHwnd(MainForm)) или SetForegroundWindow(FormToHWND(MainForm)). Мне приходится запускать из этого места специальный таймер — и уже в обработчике таймера, после некоторой задержки, вызывать SetFocus(FormToHWND(MainForm)). Но и это работает не всегда. Например, если окно было развернуто на весь экран, а свернуто было щелчком по кнопке «Свернуть все окна», то после его разворачивания опять фокуса нет (насколько могу судить, в этом случае не запускается таймер). Нет ли более изящного и надежного способа наладить фокус?
  3. А впрочем, неважно. Самое главное, что оператор Button:=TButton(SenderButton.Clone(SenderButton.Owner)) работает, как задумано. Спасибо!
  4. Простите, но пока плохо понимаю. Мне нужно клонировать объект, созданный в design time. А в вашем примере SenderButton создается как локальная переменная. Какой в этом смысл?
  5. Туплю, не могу понять, как именно нужно клонировать объект. Пишу так: Button2:=FMX.Types.TFmxObject.Clone(Button1); Delphi ругается, говорит: This form of method call only allowed for class methods or constructor. Что делаю не так?
  6. Здесь, к сожалению, никто проблемой не заинтересовался. Пришлось обратиться на experts-exchange.com, и тамошние специалисты подтвердили мою догадку: виноват размер файла со шрифтом (17.2 Mb). Такие файлы не лезут в ресурсы в рамках IDE, но есть обходной путь. Кому интересно, вот ссылка, там все инструкции: https://www.experts-exchange.com/questions/29204716/Adding-a-huge-font-file-to-Delphi-resources.html Выяснилось также, что шрифт вовсе не обязательно запихивать в ресурсы, можно просто добавить файл в deployment и установить непосредственно из файла: AddFontResource(PChar('MyFont.ttf')); SendMessage(FormToHWND(MainForm),WM_FONTCHANGE,0,0); Говорят, что важно еще не забыть этот шрифт в конце убрать: RemoveFontResource(PChar('MyFont.ttf')); SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0); У меня всё заработало.
  7. Пишу для Windows, но в данном случае это, наверное, неважно. Засовываю в ресурсы несколько кастомных шрифтов, и лишь один из них упорно сопротивляется. Обычный шрифт из интернета, в систему устанавливается, функционирует нормально, только в ресурсы не хочет. Цепляю в зазипованном виде - может, кто-нибудь сможет подсказать, что с ним не так. Можно даже создать новый пустой проект, добавить этот шрифт, вызвать проверку синтаксиса, и результат будет такой: "brcc32" exited with code 1 KanjiStrokeOrders_v4.004.zip
  8. Значит, так и сделаем. TWebBrowser в моем приложении уже используется. Под Windows это не так критично. Все минусы будут связаны разве что с дизайном и эстетикой. Края там не поменять.
  9. Тогда, может быть, самым надежным и простым вариантом будет выводить видео в TWebBrowser?
  10. Мне, безусловно, нужно ехать, просто до сей поры удавалось обходиться без сторонних компонентов. Довольно странно, что в Delphi нет нормальной поддержки такой востребованной функции, как воспроизведение видео. Так что же, порекомендуете PasLibVlc? Или есть что-нибудь еще достойное внимания?
  11. Простите, не понял. На моем компьютере mp4-файлы прекрасно проигрываются другими приложениями - например, Windows Media Player. Разве это не означает, что соответствующий кодек установлен?
  12. Отчего-то, если задать TMediaPlayer.FileName с расширением "mp4", то уже при запуске приложение валится с сообщением "Unsupported media file". Причем в секции initialization юнита FMX.Media.Win присутствует и при запуске отрабатывает такой оператор: TMediaCodecManager.RegisterMediaCodecClass('.mp4', SVMP4Files, TMediaType.Video, TWindowsMediaCodec); Запускаю под Windows. Файлы *.avi проигрываются без проблем
  13. Никто не помог ни здесь, ни на Experts Exchange. После долгих мытарств все-таки нашел решение сам. Оказалось достаточным перед вызовом Locate сделать такую штуку: FDConnection.ResourceOptions.PreprocessCmdText:=True А после вызова вернуть обратно в False. Собственно, PreprocessCmdText как раз и устанавливает перечисленные выше пять свойств (EscapeExpand, MacroCreate и т.д.) одним махом либо в True, либо в False. Но почему-то, когда эти свойства были установлены в Object Inspector, ни черта не работало. А такой вот динамический фокус помог. Скорость, по сравнению с Filter, возросла вдвое.
  14. Проблема обозначена в заголовке. Подробнее: при дефолтных установках TFDConnection.ResourceOption (включенных EscapeExpand, MacroCreate, MacroExpand, ParamCreate, ParamExpand) функция Locate возвращает False. При отключении этих параметров Locate падает с сообщением "Unrecognized token {" Вынужден вместо Locate использовать Filter, очень сильно проигрывая в скорости. Хотелось бы все-таки понять, в чем тут дело.
  15. Наверное, детский вопрос задам, и все-таки. Вдруг обнаружил, что в моем проекте никакие блоки try...except не срабатывают. Видимо, дело в каких-то настройках — но в каких именно? Иду в Options => Debugger Options => Embarcadero Debuggers => Native OS Exceptions, пробую там менять установки, толку никакого. Более того — пытаюсь искусственно спровоцировать падение делением на ноль — и вообще никакого падения не происходит, деление на ноль дает ноль! Такая же примерно ерунда с попыткой устроить переполнение. Ткните меня в причину носом кто-нибудь, пожалуйста. UPD Через два дня хаотичных экспериментов с настройками всё прочихалось, и exceptions благополучно работают. В чем было дело, так и не понял.
×
×
  • Создать...