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

Rusland

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

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

  • Посещение

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

    26

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

  1. Like
    Rusland отреагировална kami в Убить поток TThread кроссплатформено   
    С каких пор в Delphi перестали существовать TCriticalSection, TMutex, TEvent? Которые, кстати, работают кроссплатформенно, используя штатные средства, предоставляемые ОС.
  2. Like
    Rusland отреагировална dnekrasov в Indy IRC   
    var Data: TIdMultiPartFormDataStream; msResponse: TMemoryStream; sResponse: String; bts: TBytes; ... msResponse := TMemoryStream.Create; try FIdHTTP.Post([URL], Data, msResponse); SetLength(bts, msResponse.Size); msResponse.Position := 0; msResponse.Read(bts[0], msResponse.Size); sResponse := TEncoding.UTF8.GetString(bts); finally FreeAndNil(msResponse); end; Так я работаю с IdHTTP. Я думаю, что-то на подобии этого нужно и Вам реализовать
  3. Like
    Rusland отреагировална Данил Абдрафиков в Indy IRC   
    Используйте TEncoding
  4. Like
    Rusland получил реакцию от Anatoliy в Delphi + Android тормоза   
    Делать так:
    TThread.Synchronize(TThread.CurrentThread, procedure begin Label1.Text:=Значение; end); А Label лучше заменить на TText
  5. Like
    Rusland отреагировална Равиль Зарипов (ZuBy) в Плавающая кнопка   
    вот тут есть
  6. Like
    Rusland отреагировална Alex7wrt в Локальная рация, Android, пример   
    Сделал простой пример приложения рации в локальной сети под Android. Реализация через UDP. 
    Буду рад, если кому окажется полезным.
    Для начала/окончания сеанса связи нужно нажать на окружность

    Для проверки нужно 2 телефона
    unit Unit5; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.StdCtrls, IdUDPServer, IdBaseComponent, IdComponent, IdUDPBase, IdUDPClient, IdGlobal, IdSocketHandle, Androidapi.JNI.Media, Androidapi.JNI.JavaTypes, Androidapi.JNIBridge, AndroidApi.JNI, AndroidApi.Helpers, FMX.Objects, System.Math; type TForm1 = class(TForm) Circle: TCircle; procedure ServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); procedure FormCreate(Sender: TObject); procedure CircleTap(Sender: TObject; const Point: TPointF); end; TSendThread = class(TThread) protected procedure Execute; override; end; var Form1: TForm1; SendThread: TSendThread; Server: TIdUDPServer; audioRecord: JaudioRecord; audiotrack: JAudioTrack; recording: boolean; buffer_Size, port,ch_in, ch_out, format, freq, source: integer; implementation {$R *.fmx} procedure TSendThread.Execute; var buffer: TJavaArray<Byte>; begin buffer := TJavaArray<Byte>.create(buffer_size); while recording do begin audioRecord.read(buffer,0,buffer_size); Server.Broadcast(TIDBytes(TJavaArrayToTBytes(buffer)),port); end; buffer.Free; end; procedure TForm1.CircleTap(Sender: TObject; const Point: TPointF); begin recording:= not recording; if recording then begin Circle.Fill.Color:=TAlphaColors.Red; Server.OnUDPRead:=nil; audiorecord.startRecording; SendThread:=TSendThread.Create; end else begin Circle.Fill.Color:=TAlphaColors.Gray; audiorecord.stop; Server.OnUDPRead:=ServerUDPRead; end; end; procedure TForm1.FormCreate(Sender: TObject); begin buffer_size:=2048; freq:=8000; port:=5555; Server:=TIdUdpServer.Create(Form1); with Server do begin BufferSize:=buffer_size; DefaultPort:=port; BroadCastEnabled:=true; Active:=true; OnUDPRead:=ServerUDPRead; end; Circle.Width:=min(Screen.Width,Screen.Height)*0.7; Circle.Height:=Circle.Width; ch_in:=TJAudioFormat.JavaClass.CHANNEL_IN_MONO; ch_out:=TJAudioFormat.JavaClass.CHANNEL_OUT_MONO; format:=TJAudioFormat.JavaClass.ENCODING_PCM_16BIT; source:=TJMediaRecorder_AudioSource.JavaClass.MIC; audioRecord := TJAudioRecord.JavaClass.init(source, freq, ch_in, format, buffer_size); audiotrack:=TJAudioTrack.JavaClass.init(3, freq, ch_out, format, buffer_size,1); end; procedure TForm1.ServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); begin audiotrack.write(TBytesToTJavaArray(TBytes(AData)),0,Length(AData)); audiotrack.play; end; end.  
    radio.zip
  7. Like
    Rusland отреагировална krapotkin в Запуск приложения из текущего   
    procedure RunProgram(cmdStr:string; Wait:Boolean; ShowWindow:Word); var si:TStartupInfo; pi:TProcessInformation; s:string; begin FillChar(si, SizeOf(si), 0); si.cb := SizeOf(si); si.dwFlags:=STARTF_USESHOWWINDOW; si.wShowWindow := ShowWindow; s:=cmdStr; UniqueString(s); getlasterror; if not CreateProcess(nil, PChar(S), NIL, NIL, False, 0, NIL, NIL, si, pi) then showMessageFmt('Ошибка %d. %s',[getlasterror,SysErrorMessage(getlasterror)]); if wait then WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); end;  
  8. Like
    Rusland отреагировална estra в Доработка компонента для чтения штрих-кодов под RAD XE7   
    Там адаптировать нечего, всего 2 изменения в файле FMX.TKRBarCodeScanner.pas.
     
    1.
    // было uses System.Classes {$IFDEF IOS} ,FMX.TMSZBarReader {$ENDIF} {$IFDEF ANDROID} ,FMX.Platform, FMX.Helpers.Android, System.Rtti, FMX.Types, System.SysUtils, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, FMX.StdCtrls, FMX.Edit {$ENDIF} ; // стало uses System.Classes {$IFDEF IOS} ,FMX.TMSZBarReader {$ENDIF} {$IFDEF ANDROID} ,FMX.Platform, FMX.Helpers.Android, System.Rtti, FMX.Types, System.SysUtils, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, FMX.StdCtrls, FMX.Edit {$IF CompilerVersion >= 20} ,Androidapi.Helpers {$ENDIF} {$ENDIF} ; 2
    // было {$IFDEF ANDROID} function TTKRBarCodeScanner.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; begin Result := False; if FMonitorClipboard and (AAppEvent = aeBecameActive) then begin Result := GetBarcodeValue; end; end; {$ENDIF} // стало {$IFDEF ANDROID} function TTKRBarCodeScanner.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; begin Result := False; if FMonitorClipboard and (AAppEvent = {$IF CompilerVersion >= 20}TApplicationEvent.{$ENDIF}aeBecameActive) then begin Result := GetBarcodeValue; end; end; {$ENDIF}
  9. Like
    Rusland отреагировална Wovan2 в IdTCPClient-IdTCPServer управление соединением   
    To Rusland
    Тут, видимо, на месте уголков надо явно задать адрес сервера... Я, по крайней мере, так и сделал.
  10. Like
    Rusland отреагировална Fedor K в IdTCPClient-IdTCPServer управление соединением   
    Посмотрел ваш пример, все зависания и вылеты с ошибками связаны с обращением к пустым объектам, попыткой обработать все в одном обработчике. Исправить клиент дело не благодарное, поэтому сделал пример по работе с TCP сокетом с возможностью автоподключения (тык). Проверил на нескольких устройствах, полет нормальный.
    Основные замечания:
    Не используйте FormActivate событие, тем более на мобильной платформе. Его обработка замораживает приложение. В примере посмотрите вариант обхода. TIniFile нет смысла использовать каждый раз для считывания настроек. 1 раз считали при старте приложения и больше к файлу не обращаемся. Хранить настройки в компонентах (edSettingHost.Text и т.п.). Создание свойства отнимет максимум минуту, а выгоду даст существенную. TCP сокет соединения следуют принимать как асинхронные, а не как запрос-ответ. Это предусматривает получение команды сервером, какое-то выполнение и лишь потом отправка на клиент. Поэтому попробуйте отказаться от использования GetFromServer. Сервер только запускал для проверки клиента, пару раз ловил outofmemory и access violation, закрыться тоже не захотел по-хорошему. Поэтому желательно его тоже довести до ума.
  11. Like
    Rusland отреагировална Fedor K в IdTCPClient-IdTCPServer управление соединением   
    Можете мне сделать тестовый сервер и клиент, чтобы я смог у себя проверить? Тогда мой ответ будет более детальным. А пока:
    Какой вы объем данных шлете по соединению? Чем вызвана потребность использовать именно сокеты? TimeOut  никогда не ставьте большими. Indy работает по принципу блокировки сокета и всего потока в целом. Поэтому большое значение = зависание всего приложения = нежелательные результаты и зависание. Я ставил 100 мс для работы с маленькими пакетами. С такой задержкой доп. поток не обязателен. Если значения более 500 мс - нужно создавать отдельный поток и работать с сокетами в ней + синхронизация при обработке / отправке данных. TIdTCPClient на Andoid любит спать и не проверять входящий буфер. Поэтому вручную нужно вызывать по таймеру проверку типа: procedure T<какое-то имя класа>.Read; var sz : integer; lMsg : string; begin try TMonitor.Enter(Self); try if not Assigned(Client.IOHandler) then Exit; //Client = TIdTCPClient if Client.IOHandler.InputBufferIsEmpty then begin if not Client.IOHandler.CheckForDataOnSource() then exit; end; sz := Client.IOHandler.InputBuffer.Size; if sz <= 0 then exit; lMsg := Client.IOHandler.InputBuffer.ExtractToString(-1, IndyTextEncoding_UTF8); Client.IOHandler.InputBuffer.Clear; <какой-то обработчик входящего сообщения>; except on e : Exception do <какой-то обработчик ошибки>; end; finally TMonitor.Exit(Self); end; end; AntiFreeze - это мягко говоря "костыль" от Indy, использование его плохая практика. На мобильной платформе вряд ли он появится, хотя и реализуется не сложно.
  12. Like
    Rusland отреагировална Andrey Efimov в TBitmapListAnimation проблемы с отрисовкой в Android   
    Подобное поведение наблюдалось на Delphi 10.2. Вроде этот баг исправили в 10.2.1, хотя могу ошибаться... Если нет, то возвращайтесь пока на 10.1.2 (Berlin upd 2).
     
    О том как и когда ловить события я писал здесь: Очередь событий Delphi приложения на Android
    Обратите внимание на события: BecameActive, WillBecomeForeground, WillBecomeInactive, OnSaveState
  13. Like
    Rusland получил реакцию от Fedor K в TWebBrowser и неверный ssl сертификат на сайте.   
    Проверил - отлично работает! Спасибо
    PS. XCode 7.3.1, iPhoneSimulator9.3.sdk
  14. Like
    Rusland отреагировална Fedor K в [ANDROID] Смена USER-AGENT компонента Webbrowser   
    Если я правильно понимаю, это запись значения в справочник. Для работы с этим хранилищем есть такой враппер:
    https://www.dropbox.com/s/5q17zki83t1ivjq/AppProperties.pas?dl=0
    Попробуйте сделать так:
    TAppProperties.SaveStr(['UserAgent'], ['My User Agent 1.0']);  
  15. Like
    Rusland отреагировална Fedor K в Через NetHTTPClient передать фотографию на сервер   
    Не совсем верно. При использовании Indy нужно к проекту подключать библиотеки (libcrypto.so, libssl.so) для Android и  (libcrypto.a, libssl.a)iOS. Пример для A есть на форуме. Для iOS такие же телодвижения, библиотеки например здесь. 
    После всего это приложения прекрасно проходят проверки маркетов. Но все это добавляют лишнее телодвижения, размер приложения раздувается. И я бы рекомендовал использовать нативные компоненты, где это возможно. 
  16. Like
    Rusland отреагировална Akad в [ANDROID] Смена USER-AGENT компонента Webbrowser   
    А способ через настройки не работает?
    var WebBrowser: JWebBrowser; begin WebBrowser := GetField<JWebBrowser>('FJWebBrowser'); if (WebBrowser <> nil) then WebBrowser.getSettings.setUserAgentString(StringToJString(iUA)); end; https://forums.embarcadero.com/thread.jspa?threadID=236124
    Это естественно для анроида. Для вин через его апи и т.д.

     
  17. Like
    Rusland отреагировална 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);  
  18. Like
    Rusland отреагировална 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, и в дальнейшем ничего не мешает его спокойному уничтожению.
  19. Like
    Rusland отреагировална Andrey Efimov в Нужны на мобильной платформе строки, которые работают по стандарту языка pascal.   
    Отлично работает. Проверил на Андроиде в Berlin 10.1.2 и Tokyo 10.2.1, скрины ниже. К слову, в исходниках студии есть файлы в которых используется эта директива и всё прекрасно работает.
    С библиотекой pascalc не сталкивался, поэтому ничего конкретного не подскажу.
  20. Like
    Rusland отреагировална Andrey Efimov в Нужны на мобильной платформе строки, которые работают по стандарту языка pascal.   
    Рекомендую ознакомиться с официальной документацией:
    Migrating Delphi Code to Mobile from Desktop
    Zero-based strings (Delphi)
  21. Like
    Rusland отреагировална Fedor K в TWebBrowser и неверный ssl сертификат на сайте.   
    Я проверю свою догадку и отпишусь чуть позже. Есть шанс, что все также легко.
  22. Like
    Rusland отреагировална 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.
  23. Like
    Rusland отреагировална dmokrushin123 в Сборка приложения для IOS 11   
    Так и не разобрался как включить настройку для 64 бит чтобы была как для 32 бит, да и интерес пропал долго разбираться )
    В итоге создал новый проект и мигрировал из старого все что нужно было - собрал и установил на устройство.
    Да рабочая конфигурация IOS11 (64)+SDK10+XCode8, в конфигурации как в сообщении выше НЕ ПОШЛО (XCode 9.1 + SDK 11.1 + iOS 11.1 +RAD 10.2.1 (с патчем PAServer и IDE под iOS11) ) .
    В общем если бы мысль про 64 бита пришла в самом начале, то и вопроса и танцев с бубном не было бы.
     
     
     
     
     
     
     
     
  24. Like
    Rusland отреагировална kami в Сборка приложения для IOS 11   
    XCode 9.1 + SDK 11.1 + iOS 11.1 +RAD 10.2.1 (с патчем PAServer и IDE под iOS11)
    Собрано 64 битное приложение (Universal binary file) и оно РАБОТАЕТ!!!
    Мучился довольно долго, под 11.0 сборка не хотела идти категорически (валилось на лишних разрешениях в Provision profile, про них говорилось в окне Build делфи).
    Заново ставил патч, удалял SDK 11.0, накатывал заново - не хотело идти, приложение вроде запускалось и сразу закрывалось на IPAD mini.
    А с 11.1 прокатило сразу же. Я не знаю, почему - может, из-за свежего SDK, может из-за того, что оно ставилось "в чистую" (хотя я и 11.0 SDK удалял ручками из папки документов).
    Главное - есть результат. Если нужны какие-то подробности - пишите, постараюсь ответить (хотя с моей точки зрения - всё это были танцы с бубном).
  25. Like
    Rusland отреагировална pndr.soft в Высота Item, битва продолжается   
    Победил.
    После добавления итемов необходимо добавить:
    list.Resize();
    list.Repaint();
×
×
  • Создать...