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

Anatoliy

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

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

  • Посещение

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

  1. Like
    Anatoliy отреагировална OnePeople в DX - minus (Win приложение для скачивания минусовок)   
    Программа для скачивания минусовок

     
    DX-minus b259.rar
  2. Like
    Anatoliy отреагировална RoschinSpb в [Delphi Berlin FMX Win32] Как реализовать двойной клик на ячейке в StringGrid?   
    Потому, что Х3 как определить то, что находится в гриде под курсором (обычная ячейка, недоступная ячейка, редактор ячейки, заголовок, пустое место), особенно в момент скроллирования на телефоне где и мыши-то нет. И ХЗ когда менять выделенную ячейку до срабатывания события, после срабатывания события, после первого клика, или после второго. И ХЗ как реагировать самому гриду на клик, если пользователь сам уже что-то сделал...
    Поэтому в дизайнер введены другие события например OnSelectCell, OnCellDblClick, которые срабатывают в таком порядке
    OnSelectCell
    OnSelChanged
    OnCellClick
    OnCellDblClick
  3. Like
    Anatoliy отреагировална Fedor K в [ANDROID] Смена USER-AGENT компонента Webbrowser   
    Если я правильно понимаю, это запись значения в справочник. Для работы с этим хранилищем есть такой враппер:
    https://www.dropbox.com/s/5q17zki83t1ivjq/AppProperties.pas?dl=0
    Попробуйте сделать так:
    TAppProperties.SaveStr(['UserAgent'], ['My User Agent 1.0']);  
  4. Like
    Anatoliy отреагировална Fedor K в Через NetHTTPClient передать фотографию на сервер   
    Не совсем верно. При использовании Indy нужно к проекту подключать библиотеки (libcrypto.so, libssl.so) для Android и  (libcrypto.a, libssl.a)iOS. Пример для A есть на форуме. Для iOS такие же телодвижения, библиотеки например здесь. 
    После всего это приложения прекрасно проходят проверки маркетов. Но все это добавляют лишнее телодвижения, размер приложения раздувается. И я бы рекомендовал использовать нативные компоненты, где это возможно. 
  5. Like
    Anatoliy отреагировална Fedor K в TWebBrowser и неверный ssl сертификат на сайте.   
    Objective-C конечно весьма специфический... Попробовал несколько методов, но решение действительно очень простое:
    1. Меняем iOSapi.Foundation.pas:
    unit iOSapi.Foundation; //~3855 строка, добавляем 2 метода NSURLRequestClass = interface(NSObjectClass) ['{A93A4D14-529E-41F0-86EC-B570715512BB}'] {class} function requestWithURL(URL: NSURL): Pointer; cdecl; overload; {class} function requestWithURL(URL: NSURL; cachePolicy: NSURLRequestCachePolicy; timeoutInterval: NSTimeInterval): Pointer; cdecl; overload; //метод раз {class} function allowsAnyHTTPSCertificateForHost(host: NSString): Boolean; cdecl; overload; //метод два {class} procedure setAllowsAnyHTTPSCertificate(allow: Boolean; forHost: NSString); cdecl; overload; end; 2. В своем коде для требуемых сайтов пишем следующее:
    TNSURLRequest.OCClass.setAllowsAnyHTTPSCertificate(true, StrToNSStr(<требуемый сайт>)); Проверял на сайте expired.badssl.com, XCode 7 + SDK 9.3, Simulator, также на реальном устройстве с iOS 11.
    п.с. Если нужно доверять абсолютно всем сайтам, думаю можно п. 2 вставить в FMX.WebBrowser.Cocoa.pas в методе:
    procedure TCommonWebBrowserService.DoNavigate(const URL: string);  
  6. Like
    Anatoliy отреагировална kami в Вызов TPopup ломает поведение TWebBrowser   
    Апну тему.
    На этот раз - 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, и в дальнейшем ничего не мешает его спокойному уничтожению.
  7. Like
    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 (должно быть не меньше чем максимальное количество одновременно видимых картинок на экране).
  8. Like
  9. Like
    Anatoliy отреагировална Кривяков Виталий в Возможно ли узнать, что программа написана на Delphi?   
    Можно, по куче признаков:
    1. classes.dex определенного размера
    2. firemonkey и embarcadero - часто встречаются в манифесте.
    3. Темный экран при старте.
    И.т.д.
  10. Like
    Anatoliy отреагировална POV в Артефакты при масштабировании   
    В общем эта дрянь имела место только для TabControl. Ему в событие Onchange надо добавить
      Application.ProcessMessages;
      TabControl1.Repaint;
     
  11. Like
    Anatoliy отреагировална A. Sharif в Получение acess-token от VK/FB/IG/Gle приложений   
    Все работает, авторизация в один клик, спасибо!! Немного помучился с настройками фейсбук-приложения и генерацией Хэш-ключа. Помогла инструкция https://stackoverflow.com/questions/5306009/facebook-android-generate-key-hash?noredirect=1&lq=1.
    Для Вконтакте тоже, вроде как, есть описание в документации. Буду пробовать)
  12. Like
    Anatoliy отреагировална munhauz в отправка письма с прекрепленным файлом   
    И так проблемма решилась 
     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
  13. Like
    Anatoliy отреагировална Fedor K в TWebBrowser и неверный ssl сертификат на сайте.   
    Причина такого поведения довольно простая - 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. Если кому потребуется помощь - пишите, я помогу ответами и примером.

  14. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в [DELPHI FMX Android] [6.0] Не удается загрузить SSL библиотеку   
    На андроиде с версии 6+ Гугл перешёл на boringSSL, которая не поддерживается инди
  15. Like
    Anatoliy отреагировална Andrey Efimov в Нужны на мобильной платформе строки, которые работают по стандарту языка pascal.   
    Отлично работает. Проверил на Андроиде в Berlin 10.1.2 и Tokyo 10.2.1, скрины ниже. К слову, в исходниках студии есть файлы в которых используется эта директива и всё прекрасно работает.
    С библиотекой pascalc не сталкивался, поэтому ничего конкретного не подскажу.
  16. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в Нужны на мобильной платформе строки, которые работают по стандарту языка pascal.   
    вы думаете проблема только в индексе? а то что кодировка уже не анси, это мелочи?
  17. Like
    Anatoliy отреагировална Alex7wrt в Нужны на мобильной платформе строки, которые работают по стандарту языка pascal.   
    Описанные вами отличия существуют, но сложностей они не вызывают.
    Достаточно единожды использовать конструкции для платформ вроде такой:
        {$IF DEFINED(MSWINDOWS)}         start_index:=1;     {$ELSE}         start_index:=0;     {$ENDIF}  
     
  18. Like
    Anatoliy отреагировална Alex7wrt в Объединение ячеек одного стоблца   
    Попробуйте через события TGrid.OnDrawColumnCell или TGrid.OnDrawColumnBackground.
    Там можно отрисовывать в ячейках то, что вам нужно
  19. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в Как включить горизонтальный скролл в TListView?   
    нету его там, не ищи. но если помучаться наверное можно сделать. там все расчеты сделаны на основе ширины контрола.
    заведи свою переменную с шириной и подставь вместо ширины контрола, ну и добавь скрол. потом отрисовку поменяй в зависимости от положения скрола.
    короче оно того не стоит)
  20. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в Высота Item, битва продолжается   
    так понял речь о LV, PullUp же встроен, достаточно включить в свойствах
  21. Like
    Anatoliy отреагировална Fedor K в TWebBrowser и неверный ssl сертификат на сайте.   
    Думаю вполне реально. Пример обхода этой проблемы есть  ссылка #1 и ссылка #2. Методика следующая:
    Добавляем в .plist из комментария разрешения. Открываем FMX.WebBrowser.Delegate.iOS и правим TWebViewDelegate.shouldStartLoadWithRequest, запрещая загрузку при получении invalid сертификата. Создаем экземпляр NSURLConnection и выполняем тот же запрос. В методе didReceiveAuthenticationChallenge доверяем сертификату. Выполняем загрузку страницы в webView заново. Is the issue still actual? If yes, please send to me the fmx.jar file (by default path: "C:\Program Files (x86)\Embarcadero\Studio\18.0\lib\android\release"). Thanks.
  22. Like
    Anatoliy отреагировална pndr.soft в Высота Item, битва продолжается   
    Победил.
    После добавления итемов необходимо добавить:
    list.Resize();
    list.Repaint();
  23. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в Что лучше: TIdHttp или TNetHTTPClient?   
    синхронно и асинхронно, смотря как настроить
  24. Like
    Anatoliy отреагировална Равиль Зарипов (ZuBy) в Получение acess-token от VK/FB/IG/Gle приложений   
    ну вот видишь, уже сам себе ответил. там в доках есть код, связанный с созданием собственного активити (если память не подводит, давно смотрел)
    но в делфи ты не сделаешь своё активити, так что задача почти нереализуема
  25. Like
    Anatoliy отреагировална Alex7wrt в Что лучше: TIdHttp или TNetHTTPClient?   
    Раньше использовал TIdHttp, затем перешёл на THttpClient.
    THttpClient и TNetHttpClient - по сути одно и то же, только последний является визуальным компонентом.
    Поэтому в вашем случае корректнее сравнивать THttpClient и TIdHttp.
    Конкретно для моих целей использование THttpClient предпочтительнее, поскольку он из коробки работает с https на всех платформах, а в случае TIdHttp для этого ещё нужно подключать ssl.
    Разницы в скорости работы не замечал.
×
×
  • Создать...