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

Лидеры

  1. kami

    kami

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


    • Баллы

      4

    • Постов

      643


  2. Andrey Efimov

    Andrey Efimov

    Модераторы


    • Баллы

      2

    • Постов

      851


  3. Tumaso

    Tumaso

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


    • Баллы

      2

    • Постов

      356


  4. #WAMACO

    #WAMACO

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


    • Баллы

      2

    • Постов

      776


Популярный контент

Показан контент с высокой репутацией 09.11.2017 во всех областях

  1. Апну тему. На этот раз - Tokio upd1, с патчем под iOS11. Что требуется: скопировать в папку с проектом (рядом с dpr) файл FMX.WebBrowser.pas. В нем внести изменения в метод TCustomWebBrowser.FormHandleCreated, чтобы он выглядел следующим образом: procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage); function GetParentForm(Control: TFmxObject): TCommonCustomForm; begin if (Control.Root <> nil) and (Control.Root.GetObject is TCommonCustomForm) then Result := TCommonCustomForm(Control.Root.GetObject) else Result := nil; end; var WBService : IFMXWBService; begin if not (csDesigning in ComponentState) and ((FWeb = nil) or (Sender = GetParentForm(self as TFmxObject))) and TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService) then begin WBService.DestroyWebBrowser(FWeb); // добавлена эта строка. FWeb := WBService.CreateWebBrowser; FWeb.SetWebBrowserControl(Self); FWeb.UpdateContentFromControl; FWeb.URL := FURL; FWeb.Navigate; end; end; Что дает правка: допустим, у вас есть WB на главной форме и на дочерней форме (или фрейме - без разницы), которая создается / уничтожается динамически. При создании вторичной формы метод FormHandleCreated вызывается дважды, при этом FWeb, созданный в первом вызове просто забывается, но не уничтожается (сильная ссылка в списке веббраузеров в WBService). Дальше вторичная форма уничтожается (захватывая с собой FWeb, созданный при втором вызове FormHandleCreated ), а в "забытом" FWeb остаются невалидные ссылки на родителя. Что при вызове метода TWBFactoryService.RealignBrowsers (активация / изменение размеров формы) приведет к AV. Внесенное изменение удаляет FWeb из списка WBService, и в дальнейшем ничего не мешает его спокойному уничтожению.
    3 балла
  2. Эффекты смены фреймов можно и без TTabControl сделать, было бы желание
    1 балл
  3. более того. одно другому не мешает ))) обязательно фреймы. но для того, чтобы они красиво слайдились, кладем их на табы
    1 балл
  4. RoschinSpb

    Кнопка с картинкой

    Да, мило. Как уже было сказано можно подгружать фотографии и в TImageList в RunTime, примеров тут есть. begin Button1.Images := ImageList1; Button1.ImageIndex := ImageList1.AddOrSet('Add', [1, 1.5, 2], ['D:\Мои веселые картинки\Icons\add16.png', 'D:\Мои веселые картинки\Icons\add24.png', 'D:\Мои веселые картинки\Icons\add32.png']); end; Тогда в отличие от TList будет автоматически разруливаться ситуация с большим количеством одновременно созданных TBitmap. TBitmap это довольно ресурсоёмкий объект (отсюда и возможные ошибки с дескрипторами) их количество ограничено, особенно на телефонах, TImageList хранит данные хоть и в памяти но просто в виде двоичных данных (в формате PNG), при этом системные объекты создаются и уничтожатся по мере использования, максимальное их количество можно задать свойством CacheSize (должно быть не меньше чем максимальное количество одновременно видимых картинок на экране).
    1 балл
  5. Tumaso

    Кнопка с картинкой

    Намекаете, что приложения не существует? Существует
    1 балл
  6. Akad

    TMemo постранично

    У читалок есть много сложных загонов с выводом. Например из-за шрифтов, отступов и т.д. Если бы я просто отображал постранично текст, бы сделал следующее: закачал бы в какой-нибудь stritglist весь файл, потом начал построчно рисовать в канву с переносом. И как только высота превышала бы максимум, создавалась бы следующая страница. Всё.
    1 балл
  7. Я проверю свою догадку и отпишусь чуть позже. Есть шанс, что все также легко.
    1 балл
  8. Отлично работает. Проверил на Андроиде в Berlin 10.1.2 и Tokyo 10.2.1, скрины ниже. К слову, в исходниках студии есть файлы в которых используется эта директива и всё прекрасно работает. С библиотекой pascalc не сталкивался, поэтому ничего конкретного не подскажу.
    1 балл
  9. Рекомендую ознакомиться с официальной документацией: Migrating Delphi Code to Mobile from Desktop Zero-based strings (Delphi)
    1 балл
  10. И так проблемма решилась if frm_main.IdSMTP1.Connected then frm_main.IdSMTP1.Disconnect; frm_main.IdSMTP1.Host := readiniprop('mail', 'host'); // адрес smtp-сервера frm_main.IdSMTP1.Port := StrToInt(readiniprop('mail', 'port')); frm_main.IdSMTP1.Username := readiniprop('mail', 'user');; frm_main.IdSMTP1.Password := readiniprop('mail', 'pass');; frm_main.IdMessage1.Clear; frm_main.IdMessage1.Subject := (readiniprop('mail', 'tema')); // текст темы сообщения frm_main.IdMessage1.Recipients.EMailAddresses := adreess; // указываем адрес получателя frm_main.IdMessage1.From.Address := readiniprop('mail', 'user'); // указываем адрес отправителя frm_main.IdMessage1.From.name := readiniprop('mail', 'otprv'); // имя отправителя письма frm_main.IdMessage1.ContentType := 'multipart/mixed; type="text/html'; //frm_main.IdMessage1.CharSet := 'Windows-1251'; frm_main.IdMessage1.IsEncoded := True; frm_main.IdMessage1.MessageParts.Clear; TIdAttachmentFile.Create(frm_main.IdMessage1.MessageParts, 'shablon.doc'); with TIdText.Create(frm_main.IdMessage1.MessageParts, nil) do begin CharSet := 'Windows-1251'; ContentType := 'text/html'; Body.text := s.text; end; //frm_main.IdMessage1.Body.text := s.text; frm_main.IdSMTP1.connect; // (5000); // соединяемся frm_main.IdSMTP1.Send(frm_main.IdMessage1); // отправляем frm_main.IdSMTP1.Disconnect; // отъединяемся } помогло http://www.indyproject.org/Sockets/Blogs/RLebeau/2005_08_17_A.en.aspx
    1 балл
  11. kami

    Сборка приложения для IOS 11

    Можно поподробнее, про что поподробнее? Скачал последний XCode, поставил, убедился что в Preferences-Locations стоит последняя версия Command line tools -> Установил патчи в PAServer и IDE -> удалил напрочь все "старые" SDK из опций IDE, удалил их из папки -> скачал SDK 11.1, убедился что SDK 11.1 активны -> скомпилировал и задеплоил (кажется, во время деплоя мне было сказано, что Bundle Identificator плох, пришлось заменить его с вида F43234.com.application.my на com.application.my. Это, по большому счету, всё, что касается работы с SDK 11.1, остальные танцы с бубном (на предыдущих SDK) не вижу смысла приводить. Тщательно разбирайте ошибки компиляции и деплоя и будет вам счастье
    1 балл
  12. Все работает, авторизация в один клик, спасибо!! Немного помучился с настройками фейсбук-приложения и генерацией Хэш-ключа. Помогла инструкция https://stackoverflow.com/questions/5306009/facebook-android-generate-key-hash?noredirect=1&lq=1. Для Вконтакте тоже, вроде как, есть описание в документации. Буду пробовать)
    1 балл
  13. POV

    Артефакты при масштабировании

    В общем эта дрянь имела место только для TabControl. Ему в событие Onchange надо добавить Application.ProcessMessages; TabControl1.Repaint;
    1 балл
  14. Можно, по куче признаков: 1. classes.dex определенного размера 2. firemonkey и embarcadero - часто встречаются в манифесте. 3. Темный экран при старте. И.т.д.
    1 балл
  15. Тот случай, когда нужно перейти на Tokyo
    1 балл
  16. Причина такого поведения довольно простая - java библиотеки FMX часто передают в Delphi только уведомление о событии, без непосредственного влияния на процесс. Открываем библиотеку fmx.jar и смотрим код класса WebClient (package com.embarcadero.firemonkey.webbrowser;): public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) { super.onReceivedSslError(view, handler, error);// обработка ошибки происходит здесь по дефолту if (this.mListener != null) { this.mListener.onReceivedSslError(view, handler, error);//передача в Delphi лишь уведомления, что событие произошло } } Одно из решений*: 1. Заменяем** код на: public void onReceivedSslError(WebView paramWebView, SslErrorHandler paramSslErrorHandler, SslError paramSslError) { if (this.mListener != null) { this.mListener.onReceivedSslError(paramWebView, paramSslErrorHandler, paramSslError);//Delphi обработчик } else { super.onReceivedSslError(paramWebView, paramSslErrorHandler, paramSslError);//обработчик по умолчанию } } После манипуляций получаем свою версию библиотеки, мой пример здесь (Delphi Berlin). 2. Подключаем библиотеку к проекту (скриншот ниже). 3. Копируем unit FMX.WebBrowser.Android в папку своего проекта и меняем следующие строки: procedure TAndroidWebBrowserService.TWebBrowserListener.onReceivedSslError( P1: JWebView; P2: JSslErrorHandler; P3: JSslError); begin P2.proceed;//добавляем разрешение для истекших сертификатов FWBService.FailLoadingWithError;//стандартный обработчик OnDidFailLoadWithError end; *Если вариант изменения кода java библиотек совсем не подходит, можно реализовать все средствами Delphi. Для этого создаем свою реализация класса WebViewClient (или WebClient) и задаем его для JWebBrowser: //все тот же unit FMX.WebBrowser.Android; procedure TAndroidWebBrowserService.InitUIThread; var lClient : TWebBrowserCLientFix;//наш класс begin FJWebBrowser := TJWebBrowser.JavaClass.init(TAndroidHelper.Activity); FJWebBrowser.getSettings.setJavaScriptEnabled(True); lClient := TWebBrowserCLientFix.Create(Self); FJWebBrowser.setWebViewClient(lClient);//меняем на наш класс FListener := TWebBrowserListener.Create(Self); lClient.SetWebViewListener(FListener); //комментируем //FJWebBrowser.SetWebViewListener(FListener); **Замена кода происходит по тому же сценарию, как и создание своих собственных классов на java. Если кому потребуется помощь - пишите, я помогу ответами и примером.
    1 балл
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...