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

Brovin Yaroslav

Администраторы
  • Постов

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

  • Посещение

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

    390

Активность репутации

  1. Like
    Brovin Yaroslav отреагировална OnePeople в Монополия   
    Делал чисто для себя! И только для своего удовольствия!
    Возможны ошибки!*(вернее точно есть))) 
    Графика не окончательная!
    Скриншоты сервер:
    Скриншоты клиент:
    Сервер на комп, клиент Android (должны находиться в одной сети)
    P/S И так как все устройства у меня Full HD, проверял только на них(
    Monopoly.rar
  2. Like
    Brovin Yaroslav получил реакцию от Tom1984 в Получаем разрешение экрана устройства, логические и физические размеры экрана в FireMonkey   
    Введение
    Появление экранов повышенной плотность физических точек, привело с одной стороны к проблеме адаптации графического интерфейса под разные разрешения экранов при их одинаковых физических размерах, с другой к увеличению четкости и качества картинки.
     
    Например, если раньше на iPhone 3 при размере экрана 3,5 дюйма позволял отобразить 320х480 точек, то на устройстве iPhone 4 при таком же физическом размере экрана, экран мог уже отображать 640х960 точек. Это хорошо видно на увеличенном изображении обычного экрана и ретина экрана на рисунке ниже (слева - не ретина, справа - ретина (2х)). Справа количество физических точек ровно в четыре раза больше, чем слева:

     
    Для разработчика это могло означать, что интерфейс привязанный к разрешению 320х480 на Retina экране будет занимать только четверть экрана. Естественно, что использование разрешения экрана в физических координатах не удобно с этой точки зрения. Именно по этому появились логические координаты, которые гарантируют, что тот же пользовательский интерфейс для iPhone 3, будет иметь такие же размеры (физические) и на экране с ретиной.
     
    FireMonkey работает в логических координатах. Это означает, что на iPhone 3 - 4 мы работаем с логическим разрешением 320x480 точек. Однако, при отображении интерфейса на iPhone 4 c (с двойной плотностью пикселей по сравнению с iPhone 3), интерфейс автоматически масштабируется на физическое разрешение 640х960 с коэффициентом масштабирования равным 2. 
     
    Практика
    Теперь посмотрим, как получить всю эту информацию. Вся информация об экране (логический размер и коэффициент масштабирования) находится в сервисе IFMXScreenService. 
    Чтобы получить физическое разрешение экрана, нужно логический размер умножить на коэффициент масштабирования.
     
    Код ниже показывает, как получить доступ к этому сервису и извлечь требуемые параметры:
    var ScreenService: IFMXScreenService; LogicScreenSize: TPoint; ScreenScale: Single; begin // Запрашиваем сервис экрана, для получения информации о размере и текущем коэффициенте масштабирования if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then begin LogicScreenSize := ScreenService.GetScreenSize.Round; ScreenScale := ScreenService.GetScreenScale; LabelLogicScreenSize.Text := Format('Логический размер: %d, %d', [LogicScreenSize.X, LogicScreenSize.Y]); LabelPhysicScreenSize.Text := Format('Физический размер: %f, %f', [LogicScreenSize.X * ScreenScale, LogicScreenSize.Y * ScreenScale]); LabelScreenScale.Text := Format('Коэффициент масштабирования: %f',[ScreenService.GetScreenScale]); end; end; Результат кода приведен на снимке экранов ниже для iPad устройств с ретиной экраном и без:

  3. Like
    Brovin Yaroslav получил реакцию от flydev в Описание TfgActivityDialog   
    Описание
    Назначение: Компонент предназначен для визуального отображения хода выполнения длительной операции. При этом пользовательский интерфейс блокируется диалоговым окном до окончания выполнения задачи. Используется, когда время выполнения задачи нельзя оценить никаким адекватным способом (Ожидание ответа от сервера при авторизации и тд.) Если время выполнения известно, то рекомендуется использовать TfgProgressDialog Поддерживаемые платформы: iOS, Android Демо проект: Samples\ProgressDialogDemo\ProgressDialogDemo.dproj Скриншоты
    Работа под iOS:
    Работа под Андроид (Выше, чем GingerBread 2.3): Работа под Андроид (GingerBread 2.3):
  4. Like
    Brovin Yaroslav отреагировална Yarpda в Delphi Rio Android application.processMessages; dosent work   
    Ну в 10.3 как раз ничем не хуже. Точно также не будет работать.
    Как я понимаю, не нужно просто пробежаться от 0 до 100 в прогрессбаре.
    Тут приведен просто пример, а на самом деле же нужно выполнять какой-то код в программе, который будет вместо sleep(100), а если это делать, то все встанет колом едва запустившись. И там уже не до progressbar будет, потому что цикл в зависимости значения таймера пойдет как попало. В общем это решения ОЧЕНЬ спорное на мой взгляд.
  5. Like
    Brovin Yaroslav отреагировална Vitaldj в Мобильная разработка на Delphi - программа для врачей по оценке взаимодействий лекарств.   
    Уважаемый коллеги! Пришло время показывать результаты работы нового фреймворка FGX native в деле и в реальном приложении. В рамках XXVI РОССИЙСКОГО НАЦИОНАЛЬНОГО КОНГРЕССА «ЧЕЛОВЕК И ЛЕКАРСТВО» будет представлен доклад:
    «Контроль полипрагмазии «в кармане», мобильная разработка основанная на FGX Native» 
    Будет представлена мобильная программа, написанная с использованием вышеназванного фреймворка для Андроида. Конечно конгресс для врачей, но если кому будет интересно, приходите послушать доклад 9-го апреля в ЦМТ ( Москва, Краснопресненская набережная, 12). С 16-00 до 20-00. Доклад последний,  поэтому, думаю к 18-30 можно подтягиваться! 
    Программа конгресса
  6. Like
    Brovin Yaroslav отреагировална Barbanel в Runtime permissions in Delphi 10.3 Rio   
    В поставке 10.3 есть примеры работы с правами.
    Один из них можно найти по такому пути:
    C:\Users\Public\Documents\Embarcadero\Studio\20.0\Samples\Object Pascal\Multi-Device Samples\Media\PhotoEditorDemo
    Что интересно, этот же код можно без изменений использовать под любой другой платформой.
    На других платформах приложение будет считать что ему выдали все права, и соответственно запускать все коллбеки без каких-либо вопросов.
  7. Like
    Brovin Yaroslav отреагировална Евгений Корепов в Runtime permissions in Delphi 10.3 Rio   
    Для полноценной работы вам нужно добавить параметры в вызов (иначе вы не узнаете дал ли пользователь разрешение или нет)
    PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], nil); Вот так:
    PermissionsService.RequestPermissions([FPermissionWrite, FPermissionRead], PermissionRequestResult, ExplainReason); PermissionRequestResult - это обработка ответа пользователя
    procedure TForm.PermissionRequestResult(Sender: TObject; const APermissions: TArray<string>; const AGrantResults: TArray<TPermissionStatus>); begin if (Length(AGrantResults) = 2) and (AGrantResults[0] = TPermissionStatus.Granted) and (AGrantResults[1] = TPermissionStatus.Granted) then begin // Ура! Пользователь дал разрешение на оба наших запроса. Выставялем глобальные флаги (к примеру) которые сигнализируют что можно читать/писать карту памти end else TDialogService.ShowMessage('Не возможно продолжить работу, требуемые разрешения не получены') end; И ExplainReason - если пользователь сдуру не дал разрешение, то вам нужно объяснить ему что без этого приложение работать не будет.
    procedure TForm.ExplainReason(Sender: TObject; const APermissions: TArray<string>; const APostRationaleProc: TProc); begin TDialogService.ShowMessage('Приложению нужен доступ к карте памяти для таких то целей, иначе приложение не сможет работать. Зайдите в настроки Андроид и дайте разрешение на доступ', procedure(const AResult: TModalResult) begin APostRationaleProc; end) end;  
  8. Like
    Brovin Yaroslav получил реакцию от Barbanel в [Android] TAnimator.AnimateFloatWait как работает   
    Почему?
    Андроид не поддерживает конструкции типа:
    while Flag do Application.ProcessMessage; Поскольку Андроид не позволяет запускать внутреннюю петлю обработки сообщений и выполнять обработку сообщений из главной очереди. Именно по этому не используйте этот паттерн в принципе.
    Любая анимация вида AnimateXXXAndWait внутри себя использует этот шаблон. Поэтому банально анимация выполняется, но отрисовки не будет. Так как сообщение на отрисовку будет обработано уже в главной петле обработки сообщения после возврата управления (выхода из этого паттерна). 
    На что заменить?
    Не использовать синхронную анимацию в принципе! Заменить синхронный на асинхронный вариант с коллбеком завершения.
  9. Like
    Brovin Yaroslav получил реакцию от Ingalime в [Android] TAnimator.AnimateFloatWait как работает   
    Почему?
    Андроид не поддерживает конструкции типа:
    while Flag do Application.ProcessMessage; Поскольку Андроид не позволяет запускать внутреннюю петлю обработки сообщений и выполнять обработку сообщений из главной очереди. Именно по этому не используйте этот паттерн в принципе.
    Любая анимация вида AnimateXXXAndWait внутри себя использует этот шаблон. Поэтому банально анимация выполняется, но отрисовки не будет. Так как сообщение на отрисовку будет обработано уже в главной петле обработки сообщения после возврата управления (выхода из этого паттерна). 
    На что заменить?
    Не использовать синхронную анимацию в принципе! Заменить синхронный на асинхронный вариант с коллбеком завершения.
  10. Like
    Brovin Yaroslav получил реакцию от Maximus в О видах координат в FireMonkey и конвертации между ними   
    Типы координат
    В FIreMonkey различают три вида координат:
    Локальные - это координаты в системе координат контрола.  Абсолютные - это координаты в системе координат клиентской части формы. Экранные - это координаты в системе координат экрана. Соответственно, если речь идет о форме, то позиция формы задается в экранных координатах.
    Если речь идет о контролах, то в локальных координатах своего родительского контрола.
     
    Конвертация
    Локальные -> Абсолютные
    TControl.LocalToAbsolute(TPointF): TPointF Абсолютные -> Локальные
    TControl.AbsoluteToLocal(TPointF): TPointF Абсолютные -> Экранные
    TControl.Scene.LocalToScreen(TPointF): TPointF; Экранные -> Локальные
    TControl.Scene.ScreenToLocal(TPointF): TPointF;
  11. Thanks
    Brovin Yaroslav получил реакцию от yooSee в [RX] [FGX] Описание версии 0.7.1.118   
    Ссылка на скачивание (Только для RAD Studio Berlin?fgx_0.7.1.118.zip Инструкция по установке: "Инструкция по установке набора компонентов FGX" Описание
    Эта версия включает в себя следующий набор компонентов:
    Дизайнер итемов - дизайнер итемов. TfgToast (UPDATED) - класс отображения быстрых сообщений TfgFlipView - слайдер изображений. Поддерживает несколько способов переключения фотографий при помощи эффектов и сдвигов. При первом использовании ОБЯЗАТЕЛЬНО прочитать инструкцию "TfgFlipView - Инструкция загрузки стиля" TfgPositionAnimation - анимация свойств типа TPosition TfgPosition3DAnimation - анимация свойств типа TPosition3D  TfgBitmapLinkAnimation - анимация свойств типа TBitmapLink  TfgProgressDialog (UPDATED) - Компонент для отображения диалогового окна в момент выполнения длительной фоновой операции, когда время выполнения фоновой операции можно оценить. TfgActivityDialog (UPDATED) - компонент для отображения диалогового окна в момент выполнения длительной фоновой операции, когда время выполнения операции не возможно адекватно оценить. TfgActionSheet (UPDATED) - Аналог контекстного меню для мобильных платформ. TfgColorsPanel - Палитра цветов с возможностью выбора цвета. TfgGradientEdit (UPDATED) - Компонент выбора градиента. TfgLinkedLabel  - Метка поддерживающая открытие Web ссылки в браузере по умолчанию. TfgApplicationEvents - компонент с возможностью легко задать обработчики на основные события приложения: Отслеживание смены состояния приложения, простой, обновление и выполнение действий Actions, Изменение ориентации устройства и тд. TfgVirtualKeyboard - компонент облегчающий работу с виртуальной клавиатурой. Позволяет задать пользовательские кнопки над виртуальной клавиатурой под iOS, а так же отлавливать события по отображению и скрытию клавиатуры. (UPDATED) Зарегистрированы все стилевые объекты на вкладке "FGX: Style objects" Список изменений
    TfgActionSheet: Добавлен новый вариант темы Theme = Custom и свойство ThemeID, позволяющий для андроида указать идентификатор своей темы диалога. Теперь доступна возможность создать свой вариант диалога для андроида. Изменен порядо срабатывания событий OnCancel, OnHide в реализации на iOS. Раньше срабатывали OnHide -> OnCancel, Теперь: OnCancel -> OnHide Обновлен пример Общие улучшения в читабельности кода TfgProgressDialog, TfgActivityDialog: Добавлен новый вариант темы Theme = Custom и свойство ThemeID, позволяющий для андроида указать идентификатор своей темы диалога. Обновлен пример Общие улучшения в читабельности кода TfgGradientEdit: Добавлено событие OnPointRemoved, срабатывающее, когда точка удалена из градиента. Обновлен пример TfgToast: Исправлена ошибка на iOS, приводящая к AV при многочисленном отображении тостов. (Спасибо Сергею Пьянкову за найденную ошибку) Регистрация стилевых объектов: Теперь регистрируются только те объекты, которые не добавлены в палитру.
  12. Like
    Brovin Yaroslav получил реакцию от Сергей Сенин (COS-MIC) в Как добавить в TEdit кнопку очистки поля?   
    Добрый день,
     
    Лучше не использовать TClearingEdit, потому что TEdit поддерживает добавление специальных кнопок. И компонент TClearingEdit является частным случаем и не исключено, что он может быть в будущем удален.
     
    Чтобы можно было очистить поле Edit, не достаточно применить к нему стиль ClearingEditStyle. Необходимо, чтобы сам TEdit умел работать с объектами стиля. Но "clearingeditstyle" не предназначен для TEdit. Поэтому не смотря на то, что эдит будет выглядеть с кнопкой очисти, кнопка работать не будет.
     
    Как встроить кнопки в TEdit
    Обратите внимание, что при использовании этого способа, кнопка очистки будет автоматически очищать поле.


  13. Like
    Brovin Yaroslav получил реакцию от flydev в Описание TfgProgressDialog   
    Описание
    Назначение: Компонент предназначен для визуального отображения хода выполнения длительной операции. При этом пользовательский интерфейс блокируется диалоговым окном до окончания выполнения задачи. В отличии от TfgActivityDialog этот компонент используется в том случае, когда мы можем каким-либо способом оценить длительность выполнения операции. Поддерживаемые платформы: iOS, Android Демо проект: Samples\ProgressDialogDemo\ProgressDialogDemo.dproj Скриншоты
    Работа под iOS:
    Работа под Андроид (Выше, чем GingerBread 2.3):
    Работа под Андроид (GingerBread 2.3):

     
  14. Like
    Brovin Yaroslav отреагировална yooSee в Runtime permissions in Delphi 10.3 Rio   
    Всем привет, вот и я решил внести свою лепту в жизнь форума и сегодня мы разберемся с разрешениями на Delphi Rio под Андроид. 
    Для примера мы будем использовать разрешения на чтение и запись с памяти устройства, для начала в нашем проекте выставим в Delphi>Project>Application>Uses Permissions галочки на Read External Storage и Write External Storage.
    в uses проекта добавьте следующее
    uses System.Permissions, Androidapi.Jni.Os, Androidapi.Helpers, далее  создадим переменные
    var Form: TForm; .... FPermissionWrite: string; FPermissionRead: string; в Form.Create добавим следующий код
    procedure TForm.FormCreate(Sender: TObject); begin FPermissionWrite := JStringToString(TJManifest_permission.JavaClass.WRITE_EXTERNAL_STORAGE); //Значение на запись FPermissionRead := JStringToString(TJManifest_permission.JavaClass.READ_EXTERNAL_STORAGE); //Значение на чтение end; и теперь сам не посредственно запрос на подтверждение наших прав
    procedure TForm.Button1Click(Sender: TObject); begin PermissionsService.RequestPermissions ([FPermissionWrite, FPermissionRead], nil); end; //это вызовет окно с запросом разрешения прав ну и для проверки бросим на форму TMemo и пару TButton , в них реализуем сохранение и чтение из файла с памяти устройства
    procedure TForm.Button1Click(Sender: TObject); begin Memo1.Lines.LoadFromFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'test.txt')); end; procedure TForm.Button2Click(Sender: TObject); begin Memo1.Lines.SaveToFile(TPath.Combine(TPath.GetSharedDocumentsPath, 'test.txt')); end; P.S. Напоминаю что для работы TPath нам понадобится подключить в Uses 
    uses System.system.ioutils; Надеюсь материал будет полезен! 
     
     
     

    video_2019-02-08_00-11-36.mp4 Permissions.zip
  15. Like
    Brovin Yaroslav получил реакцию от Alisson R Oliveira в Изменение свойства шрифта одной ячейки в FireMonkey TStringGrid DELPHI XE6   
    Поменялась логика работы грида. Теперь он самостоятельно отрисовывает ячейки и не создает для каждой ячейки отдельный контрол. Поэтому старый способ работать не будет.
     
    Новый вариант решения - это самостоятельно нарисовать ячейку грида:
    uses FMX.TextLayout, System.UIConsts; procedure TForm2.Grid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); const HorzTextMargin = 2; VertTextMargin = 1; var TextLayout : TTextLayout; TextRect: TRectF; begin // Здесь определяем какую ячейку будем перерисовывать if (Column = StringColumn1) and (Row = 1) then begin TextRect := Bounds; TextRect.Left := TextRect.Left + 1; TextRect.Bottom := TextRect.Bottom -1; TextRect.Inflate(-HorzTextMargin, -VertTextMargin); Canvas.FillRect(TextRect, 0, 0, AllCorners, 1); TextLayout := TTextLayoutManager.DefaultTextLayout.Create; try TextLayout.BeginUpdate; try TextLayout.WordWrap := False; TextLayout.Opacity := Column.AbsoluteOpacity; TextLayout.HorizontalAlign := StringGrid1.TextSettings.HorzAlign; TextLayout.VerticalAlign := StringGrid1.TextSettings.VertAlign; TextLayout.Trimming := TTextTrimming.Character; TextLayout.TopLeft := TextRect.TopLeft; TextLayout.Text := Value.ToString; TextLayout.MaxSize := PointF(TextRect.Width, TextRect.Height); { Пользовательские настройки отрисовки } TextLayout.Font.Family := 'Times New Roman'; TextLayout.Font.Style := [ TFontStyle.fsBold ]; TextLayout.Font.Size := 14; TextLayout.Color := claBlueViolet; finally TextLayout.EndUpdate; end; TextLayout.RenderLayout(Canvas); finally TextLayout.Free; end; end; end;
  16. Like
    Brovin Yaroslav получил реакцию от Hevard в [TStringGrid] Как подсветить задний фон ячейки в зависимости от данных?   
    Нужно:
    Повесить обработчик события на ручную отрисовку ячеек: TGrid.OnDrawColumnCell: В обработчике в зависимости от требуемой строки или данных, нарисовать задний фон ячейки Затем поверх выполнить обычное отображение содержимого ячейки  type TOpenColumn = class (TColumn); procedure TForm8.StringGrid1DrawColumnCell(Sender: TObject; const Canvas: TCanvas; const Column: TColumn; const Bounds: TRectF; const Row: Integer; const Value: TValue; const State: TGridDrawStates); begin if Row mod 2 = 0 then begin // Выполняем закраску заднего фона Canvas.Fill.Color := TAlphaColorRec.Aliceblue; Canvas.FillRect(Bounds, 0, 0, AllCorners, 1); // Рисуем поверх обычное отображение содержимого ячейки TOpenColumn(Column).DefaultDrawCell(Canvas, Bounds, Row, Value, State); end; end; Для этого примера, у меня получилось так:

  17. Like
    Brovin Yaroslav получил реакцию от Martifan в Описание TfgSignature - Получение подписи на устройстве   
    Описание:
    Назначение: Получение подписи клиента в графическом виде. Позволяет получить векторную подпись клиента на устройстве и сохранить ее в файл с любым разрешением Поддерживаемые платформы: Windows, OSX, Android, iOS Демо проект: Samples\SignatureDemo\SignatureDemo.dproj Доступен с версии: R102  Возможности:
    Экспорт подписи в файл или поток с любым разрешением (TfgSignature.SaveToFile, TfgSignature.SaveToStream). При этом в файле подпись кадрируется, то есть пустые не заполненные области справа, слева, сверху и снизу игнорируются. Доступно изменение точности записи подписи  (TfgSignature.TrackingAccurancy). Возможность получить в процентах степень заполнения подписи клиента (TfgSignature.CalculatePercentFilling, TfgSignature.IsValidSignature) Возможность установить цвет (TfgSignature.Stroke) Возможность задать цвет заднего фона (TfgSignature.Brush) Доступно редактирование длительности отображения уведомления (TfgToast.Duration) Возможность менять глобальные параметры отображения всех тостов в рамках приложения (TfgToast.DefaultBackgroundColor, TfgToast.DefaultMessageColor и TfgToast.DefaultPadding) Скриншоты:


  18. Like
    Brovin Yaroslav отреагировална sinuke в [Android] Прозрачный StatusBar в RAD 10.3 Rio   
    Привет
    Вчера была выпущена финальная версия RAD Studio 10.3 Rio, в которой много нововведений для Андройд. Но вот про статусбар снова "забыли". Хотя не совсем, добавили файлик styles-v21.xml, который превносит новую материальную тему на устройствах под управлением Android 5.0 и выше вместо устаревшей Holo.
    Но все равно свойство формы SystemStatusBar так и не реализовали. Поэтому при запуске статус бар будет окрашен в унылый серый цвет (см. скриншот).

    Для того, чтобы сделать статусбар прозрачным и поместить под него содержимое формы, то достаточно сделать несколько несложных шагов:
    1. Убираем из деплоймента (Project -> Deployment) файл styles-v21.xml (можно просто снять галочку рядом с именем файла)

    2. Добавить в деплоймент проекта новый файл styles-v21.xml (styles-v21.zip) и прописать ему путь res\values-v21\

    3. В результате получится следующий вид

     
    P.S. В новом файле по сравнению со стандартным добавилась строчка <item name="android:windowTranslucentStatus">true</item>, которая и отвечает за прозрачный статусбар
    P.P.S. Чтобы определять размер статус бара, все также можно воспользоваться решеним ZuBy - http://blog.rzaripov.kz/2016/12/android-ios.html
    P.P.P.S. Тестовый проектик - StatusBar.zip
  19. Like
    Brovin Yaroslav отреагировална RoschinSpb в Как убить кнопку кликнув на нее саму   
    Не ссоритесь девочки пож.
    Возвращаясь к сути вопроса. Основная сложность тут в том, что в Delphi нельзя разрушать экземпляр класса внутри метода этого класса за исключением тех случаев, когда метод использует только для разрушения Free, DisposeOf. Почему так, а не иначе, какие есть исключения и почему "уменяфсёработает" объяснять долго, поэтому в первом приближении предлагаю принять это за аксиому.
    Обработчики событий OnClick и пр. вызываются из методов классов, так что разрушать контрол внутри события нельзя от слова совсем. Кроме очевидных случаев типа Self.DisposeOf существуют более запутанные варианты, когда к примеру закрывает и разрушается форма, что приводит к разрушению всех дочерних контролов.
    Образно говоря, самоубийства строго запрещены, но не запрещено нанимать киллера и в качестве жертвы указывать себя. Т.е. должен быть некий другой (глобальный) объект который будет разрушать объекты, которые хотели бы самоубицо. Реализацию такого объекта можете придумать сами, или использовать TPurgatory (чистилище, в католическом учении — промежуточное место между раем и адом). Но чтобы убедиться в правильности работы можно создать своего наследника TButton в котором перекрыть деструктор и поставить в нем точку останова. При запуске в режиме отладки посмотрите стек вызова деструктора (надо быть внимательным, он может быть длиннющим), ни где в этом стеке не должно быть метода разрушаемого экземпляра. Если в Вы нашли метод разрушаемого объекта (за исключением вышеуказанных), то Ваш способ удаления работает не правильно и с некоторой долей вероятности будет приводить к AV и другим "неприятностям" которые почти невозможно отловить в режиме отладки.
  20. Like
    Brovin Yaroslav получил реакцию от krapotkin в Как убить кнопку кликнув на нее саму   
    P.S. И именно по этой причине, кстати, и был задепрекейчен Release.
  21. Like
    Brovin Yaroslav получил реакцию от krapotkin в Как убить кнопку кликнув на нее саму   
    Надо уметь мыслить в терминах асинхронного программирования. Тогда такие вещи не будут удивлять и не будет проблем.
  22. Like
    Brovin Yaroslav получил реакцию от Виталий Иванов в Как убить кнопку кликнув на нее саму   
    @kami все правильно написал. Используйте просто ForceQueue. А внутри либо отлинкуйте контрол от родителя и вызовите Free, либо брутально дергайте DisposeOf.
    P.S. документация http://docwiki.embarcadero.com/Libraries/Rio/en/System.Classes.TThread.ForceQueue
  23. Like
    Brovin Yaroslav получил реакцию от Yarpda в Как убить кнопку кликнув на нее саму   
    @kami все правильно написал. Используйте просто ForceQueue. А внутри либо отлинкуйте контрол от родителя и вызовите Free, либо брутально дергайте DisposeOf.
    P.S. документация http://docwiki.embarcadero.com/Libraries/Rio/en/System.Classes.TThread.ForceQueue
  24. Like
    Brovin Yaroslav отреагировална dnekrasov в [Windows] Запретить окну переход в прозрачный режим   
    Недавно решил одну проблемку, которая долго мучала - решил поделиться, может кому ещё пригодится.
    При работе с двумя мониторами или с монитором и проектором часто возникает необходимость запретить окну "исчезать" при наведении курсора мыши на миниатюру другого приложения в панели задач. Чтобы это сделать надо:
    uses ... Winapi.DwmApi ... TMainForm = class(TForm) ... protected procedure CreateHandle; override; ... end; ... procedure TMainForm.CreateHandle; var Val, Res: Integer; begin inherited CreateHandle; Val := 1; Res := DwmSetWindowAttribute(FormToHWND(Self), DWMWA_EXCLUDED_FROM_PEEK, @Val, SizeOf(Val)); {$IFDEF DEBUG} if Res <> S_OK then ShowMessage(SysErrorMessage(Res)); {$ENDIF} end; Спасибо @Alex7wrt за наводку
  25. Like
    Brovin Yaroslav отреагировална Евгений Корепов в Как застать TWebBrowser обрабатывать адреса эл. почты (Android)   
    Прошу прощения, я ввел вас в заблуждение (тестировал на одном своем проекте). Открытие подобных ссылок вы должны делать самостоятельно, обрабатывая событие браузера ShouldStartLoadWithRequest.
    Вот код:
    uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, {$IFDEF ANDROID} Androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers, {$ENDIF ANDROID} FMX.Types, FMX.Graphics, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.StdCtrls, FMX.WebBrowser, FMX.Controls.Presentation; ..... const ConstMainURL = 'http://www.docme.ru/contacts'; .... procedure THeaderFooterForm.WebBrowser1ShouldStartLoadWithRequest( ASender: TObject; const URL: string); begin if Not URL.StartsWith(ConstMainURL) then // Если ссылка перехода отличается от базовой, то открываем ее через активити begin WebBrowser1.Stop; OpenURL(URL); end; end; procedure THeaderFooterForm.OpenURL(const AUrl: string); {$IFDEF ANDROID} var Uri: Jnet_Uri; OpenLinkIntent: JIntent; {$ENDIF ANDROID} begin {$IFDEF MSWINDOWS} ShellExecute(0, 'open', PChar(AUrl), nil, nil, SW_SHOWNORMAL); {$ENDIF MSWINDOWS} {$IFDEF ANDROID} Uri := StrToJURI(AUrl); OpenLinkIntent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_VIEW, Uri); TAndroidHelper.Activity.startActivity(OpenLinkIntent); {$ENDIF ANDROID} end; И прикрепляю ваш проект с моими изменениями
    WebPrj.zip
×
×
  • Создать...