Anatoliy
-
Постов
176 -
Зарегистрирован
-
Посещение
Активность репутации
-
Anatoliy отреагировална OnePeople в DX - minus (Win приложение для скачивания минусовок)
Программа для скачивания минусовок
DX-minus b259.rar
-
Anatoliy отреагировална RoschinSpb в [Delphi Berlin FMX Win32] Как реализовать двойной клик на ячейке в StringGrid?
Потому, что Х3 как определить то, что находится в гриде под курсором (обычная ячейка, недоступная ячейка, редактор ячейки, заголовок, пустое место), особенно в момент скроллирования на телефоне где и мыши-то нет. И ХЗ когда менять выделенную ячейку до срабатывания события, после срабатывания события, после первого клика, или после второго. И ХЗ как реагировать самому гриду на клик, если пользователь сам уже что-то сделал...
Поэтому в дизайнер введены другие события например OnSelectCell, OnCellDblClick, которые срабатывают в таком порядке
OnSelectCell
OnSelChanged
OnCellClick
OnCellDblClick
-
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']);
-
Anatoliy отреагировална Fedor K в Через NetHTTPClient передать фотографию на сервер
Не совсем верно. При использовании Indy нужно к проекту подключать библиотеки (libcrypto.so, libssl.so) для Android и (libcrypto.a, libssl.a)iOS. Пример для A есть на форуме. Для iOS такие же телодвижения, библиотеки например здесь.
После всего это приложения прекрасно проходят проверки маркетов. Но все это добавляют лишнее телодвижения, размер приложения раздувается. И я бы рекомендовал использовать нативные компоненты, где это возможно.
-
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);
-
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, и в дальнейшем ничего не мешает его спокойному уничтожению.
-
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 (должно быть не меньше чем максимальное количество одновременно видимых картинок на экране).
-
Anatoliy отреагировална #WAMACO в Не отображаются картинки в TListView когда программа запущена на Android
ownerBitmap := true;
-
Anatoliy отреагировална Кривяков Виталий в Возможно ли узнать, что программа написана на Delphi?
Можно, по куче признаков:
1. classes.dex определенного размера
2. firemonkey и embarcadero - часто встречаются в манифесте.
3. Темный экран при старте.
И.т.д.
-
Anatoliy отреагировална POV в Артефакты при масштабировании
В общем эта дрянь имела место только для TabControl. Ему в событие Onchange надо добавить
Application.ProcessMessages;
TabControl1.Repaint;
-
Anatoliy отреагировална A. Sharif в Получение acess-token от VK/FB/IG/Gle приложений
Все работает, авторизация в один клик, спасибо!! Немного помучился с настройками фейсбук-приложения и генерацией Хэш-ключа. Помогла инструкция https://stackoverflow.com/questions/5306009/facebook-android-generate-key-hash?noredirect=1&lq=1.
Для Вконтакте тоже, вроде как, есть описание в документации. Буду пробовать)
-
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
-
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. Если кому потребуется помощь - пишите, я помогу ответами и примером.
-
Anatoliy отреагировална Равиль Зарипов (ZuBy) в [DELPHI FMX Android] [6.0] Не удается загрузить SSL библиотеку
На андроиде с версии 6+ Гугл перешёл на boringSSL, которая не поддерживается инди
-
Anatoliy отреагировална Andrey Efimov в Нужны на мобильной платформе строки, которые работают по стандарту языка pascal.
Отлично работает. Проверил на Андроиде в Berlin 10.1.2 и Tokyo 10.2.1, скрины ниже. К слову, в исходниках студии есть файлы в которых используется эта директива и всё прекрасно работает.
С библиотекой pascalc не сталкивался, поэтому ничего конкретного не подскажу.
-
Anatoliy отреагировална Равиль Зарипов (ZuBy) в Нужны на мобильной платформе строки, которые работают по стандарту языка pascal.
вы думаете проблема только в индексе? а то что кодировка уже не анси, это мелочи?
-
Anatoliy отреагировална Alex7wrt в Нужны на мобильной платформе строки, которые работают по стандарту языка pascal.
Описанные вами отличия существуют, но сложностей они не вызывают.
Достаточно единожды использовать конструкции для платформ вроде такой:
{$IF DEFINED(MSWINDOWS)} start_index:=1; {$ELSE} start_index:=0; {$ENDIF}
-
Anatoliy отреагировална Alex7wrt в Объединение ячеек одного стоблца
Попробуйте через события TGrid.OnDrawColumnCell или TGrid.OnDrawColumnBackground.
Там можно отрисовывать в ячейках то, что вам нужно
-
Anatoliy отреагировална Равиль Зарипов (ZuBy) в Как включить горизонтальный скролл в TListView?
нету его там, не ищи. но если помучаться наверное можно сделать. там все расчеты сделаны на основе ширины контрола.
заведи свою переменную с шириной и подставь вместо ширины контрола, ну и добавь скрол. потом отрисовку поменяй в зависимости от положения скрола.
короче оно того не стоит)
-
Anatoliy отреагировална Равиль Зарипов (ZuBy) в Высота Item, битва продолжается
так понял речь о LV, PullUp же встроен, достаточно включить в свойствах
-
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.
-
Anatoliy отреагировална pndr.soft в Высота Item, битва продолжается
Победил.
После добавления итемов необходимо добавить:
list.Resize();
list.Repaint();
-
Anatoliy отреагировална Равиль Зарипов (ZuBy) в Что лучше: TIdHttp или TNetHTTPClient?
синхронно и асинхронно, смотря как настроить
-
Anatoliy отреагировална Равиль Зарипов (ZuBy) в Получение acess-token от VK/FB/IG/Gle приложений
ну вот видишь, уже сам себе ответил. там в доках есть код, связанный с созданием собственного активити (если память не подводит, давно смотрел)
но в делфи ты не сделаешь своё активити, так что задача почти нереализуема
-
Anatoliy отреагировална Alex7wrt в Что лучше: TIdHttp или TNetHTTPClient?
Раньше использовал TIdHttp, затем перешёл на THttpClient.
THttpClient и TNetHttpClient - по сути одно и то же, только последний является визуальным компонентом.
Поэтому в вашем случае корректнее сравнивать THttpClient и TIdHttp.
Конкретно для моих целей использование THttpClient предпочтительнее, поскольку он из коробки работает с https на всех платформах, а в случае TIdHttp для этого ещё нужно подключать ssl.
Разницы в скорости работы не замечал.