Лидеры
Популярный контент
Показан контент с высокой репутацией 09.11.2017 во всех областях
-
Вызов TPopup ломает поведение TWebBrowser
Равиль Зарипов (ZuBy) и 2 других отреагировал kami за вопрос
Апну тему. На этот раз - 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 балла -
Эффекты смены фреймов можно и без TTabControl сделать, было бы желание1 балл
-
Концепция интерфейса приложения для Андроида
RoschinSpb отреагировал krapotkin за вопрос
более того. одно другому не мешает ))) обязательно фреймы. но для того, чтобы они красиво слайдились, кладем их на табы1 балл -
Кнопка с картинкой
Anatoliy отреагировал 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 балл -
1 балл
-
У читалок есть много сложных загонов с выводом. Например из-за шрифтов, отступов и т.д. Если бы я просто отображал постранично текст, бы сделал следующее: закачал бы в какой-нибудь stritglist весь файл, потом начал построчно рисовать в канву с переносом. И как только высота превышала бы максимум, создавалась бы следующая страница. Всё.1 балл
-
Я проверю свою догадку и отпишусь чуть позже. Есть шанс, что все также легко.1 балл
-
Нужны на мобильной платформе строки, которые работают по стандарту языка pascal.
Rusland отреагировал Andrey Efimov за вопрос
Рекомендую ознакомиться с официальной документацией: Migrating Delphi Code to Mobile from Desktop Zero-based strings (Delphi)1 балл -
И так проблемма решилась 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.aspx1 балл
-
Можно поподробнее, про что поподробнее? Скачал последний 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 балл
-
Все работает, авторизация в один клик, спасибо!! Немного помучился с настройками фейсбук-приложения и генерацией Хэш-ключа. Помогла инструкция https://stackoverflow.com/questions/5306009/facebook-android-generate-key-hash?noredirect=1&lq=1. Для Вконтакте тоже, вроде как, есть описание в документации. Буду пробовать)1 балл
-
В общем эта дрянь имела место только для TabControl. Ему в событие Onchange надо добавить Application.ProcessMessages; TabControl1.Repaint;1 балл
-
ownerBitmap := true;1 балл
-
Возможно ли узнать, что программа написана на Delphi?
Anatoliy отреагировал Кривяков Виталий за вопрос
Можно, по куче признаков: 1. classes.dex определенного размера 2. firemonkey и embarcadero - часто встречаются в манифесте. 3. Темный экран при старте. И.т.д.1 балл -
Тот случай, когда нужно перейти на Tokyo1 балл
-
Причина такого поведения довольно простая - 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 балл