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

Alex7wrt

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

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

  • Посещение

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

    31

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

  1. Like
    Alex7wrt получил реакцию от DimArt в Локальная рация, 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
  2. Like
    Alex7wrt отреагировална Евгений Корепов в IdUDPServer1UDPRead на Андроид   
    Не только должна, но и отлично работает. Вот пример:
    function TFormMain.CreateUDPServer : Boolean; Var I : Integer; begin Result:=False; IdUDPServer:=TIdUDPServer.Create; IdUDPServer.BroadcastEnabled:=True; IdUDPServer.OnUDPRead:=IdUDPServerUDPRead; for I := Low(UDPPortArray) to High(UDPPortArray) do begin IdUDPServer.Bindings.Clear; with IdUDPServer.Bindings.Add do begin IP:='0.0.0.0'; Port:=UDPPortArray[I]; end; try IdUDPServer.Active:=True; except end; if IdUDPServer.Active then begin FActiveUDPPort:=IdUDPServer.Bindings.Items[0].Port; IPMACLocalPair.Port:=IdUDPServer.Bindings.Items[0].Port; Result:=True; Exit; end; end; FActiveUDPPort:=-1; end; procedure TFormMain.IdUDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); Var S : String; begin if (IPMACLocalPair.IP.Equals(ABinding.PeerIP)) And (IPMACLocalPair.Port=ABinding.PeerPort) then exit; DateTimeToString(S, 'hh:nn:ss.zzz', Now); S:=S+' '+BytesToString(AData , IndyUTF8Encoding); S:=S+' | from '+ABinding.PeerIP+':'+ABinding.PeerPort.ToString; Memo.Lines.Insert(0,S); end; На UDPPortArray не обращайте внимание, это если порт занят, то используется другой (UDPPortArray : array [0..2] of Integer = (55771, 55772, 55773);). 
    IdUDPServer.BroadcastEnabled:=True; тоже не нужно, если не собираетесь широковещать.
    Большинство функций работы с TIdBytes доступны в юните idGlobal, как например BytesToString(AData , IndyUTF8Encoding) в моем коде.
  3. Like
    Alex7wrt отреагировална OnePeople в DX - minus (Win приложение для скачивания минусовок)   
    Программа для скачивания минусовок

     
    DX-minus b259.rar
  4. Like
    Alex7wrt отреагировална Tumaso в Кнопка с картинкой   
    Намекаете, что приложения не существует? Существует  


  5. Like
    Alex7wrt получил реакцию от Anatoliy в Нужны на мобильной платформе строки, которые работают по стандарту языка pascal.   
    Описанные вами отличия существуют, но сложностей они не вызывают.
    Достаточно единожды использовать конструкции для платформ вроде такой:
        {$IF DEFINED(MSWINDOWS)}         start_index:=1;     {$ELSE}         start_index:=0;     {$ENDIF}  
     
  6. Like
    Alex7wrt отреагировална Andrey Efimov в Нужны на мобильной платформе строки, которые работают по стандарту языка pascal.   
    Отлично работает. Проверил на Андроиде в Berlin 10.1.2 и Tokyo 10.2.1, скрины ниже. К слову, в исходниках студии есть файлы в которых используется эта директива и всё прекрасно работает.
    С библиотекой pascalc не сталкивался, поэтому ничего конкретного не подскажу.
  7. Like
    Alex7wrt отреагировална Pax Beach в Запись и сохранение голоса в течение 10 секунд после запуска Android сервиса (Пример)   
    Я реализовал пример работы с микрофоном и таймером в Android сервисе, как указано в теме вопроса.
    Каждый раз, когда вы отправляете в сервис StartCommand или сервис перезапускается, включается запись с микрофона, и сохраняется в каталог с музыков в файл "myrecord.3gp".
    Надеюсь, мой пример поможет вам создать новые полезные решения. В этом случае пожалуйста делитесь ими с участниками нашего сообщества.
    Для отладки своих программ на Android используйте запись в LOGI и чтение при помощи monitor.bat (PlatformSDKs\android-sdk-windows\tools).
     
    uses ... AndroidApi.JNI.Media, // JMediaRecorder AndroidApi.Timer, // Timer ...; Const TimerInterval = 1000; TimerCounterSecLimit = 10; type TDM = class(TAndroidService) ... private FTimerHandle: Integer; FRecording: Boolean; procedure StartRecord; procedure StopRecord; procedure StartTimer; procedure StopTimer; public FAudioRec: JMediaRecorder; end; procedure Log(const Fmt: string; const Params: array of const); overload; var Msg: string; M: TMarshaller; begin Msg := Format(Fmt, Params); LOGI(M.AsUtf8(Msg).ToPointer); end; procedure Log(const Source: string); overload; var M: TMarshaller; begin LOGI(M.AsUtf8(Source).ToPointer); end; procedure TDM.AndroidServiceCreate(Sender: TObject); begin FTimerHandle := 0; FTimerCounter := 0; FRecording := false; end; procedure TDM.AndroidServiceDestroy(Sender: TObject); begin StopTimer; StopRecord; end; function TDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin if Intent.getAction.equalsIgnoreCase(StringToJString('StopIntent')) then begin StopTimer; StopRecord; Result := TJService.JavaClass.START_NOT_STICKY; // don't reload service Log('- service stoped', []); end else begin if not FRecording then begin Log('... sound record to be started', []); StartRecord; StartTimer; end; Result := TJService.JavaClass.START_STICKY; // rerun service if it stops Log('+ Service started', []); end; end; procedure TDM.StartRecord; begin StopRecord; FAudioRec := TJMediaRecorder.Create; FAudioRec.setAudioSource(TJMediaRecorder_AudioSource.JavaClass.MIC); FAudioRec.setOutputFormat(TJMediaRecorder_OutputFormat.JavaClass.THREE_GPP); FAudioRec.setAudioEncoder(TJMediaRecorder_AudioEncoder.JavaClass.AMR_NB); FAudioRec.setOutputFile(StringToJString(TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp'))); try FAudioRec.Prepare(); FAudioRec.start; FRecording := True; Log('+ Start record to %s', [TPath.Combine(TPath.GetSharedMusicPath, 'myrecord.3gp')]); except on E: Exception do Log('- Error in mic recording: %s', [E.Message]); end; end; procedure TDM.StopRecord; begin if Assigned(FAudioRec) then begin if FRecording then begin FRecording := false; try FAudioRec.stop(); FAudioRec.release(); Log('- Mic recording is stoped'); except on E: Exception do Log('- Error in mic stop recording: %s', [E.Message]); end; end; end else begin FRecording := false; end; end; procedure TDM.WaitComplete(TimerId: Integer); begin if FTimerCounter < TimerCounterSecLimit then begin Log('+++ Timer is triggered %d time.', [FTimerCounter]); inc(FTimerCounter); end else StopTimer; end; procedure TDM.StartTimer; begin FTimerCounter := 0; if FTimerHandle = 0 then begin FTimerHandle := AndroidTimerCreate; AndroidTimerSetInterval(FTimerHandle, TimerInterval); end; AndroidTimerSetHandler(WaitComplete); Log('+ Timer started', []); end; procedure TDM.StopTimer; begin if FTimerHandle > 0 then begin Log('... MIC recording to be stopped'); StopRecord; AndroidTimerSetHandler(nil); Log('- Timer stoped', []); end; end; end.  
  8. Like
    Alex7wrt получил реакцию от Anatoliy в Объединение ячеек одного стоблца   
    Попробуйте через события TGrid.OnDrawColumnCell или TGrid.OnDrawColumnBackground.
    Там можно отрисовывать в ячейках то, что вам нужно
  9. Like
    Alex7wrt получил реакцию от Andrey Efimov в Что лучше: TIdHttp или TNetHTTPClient?   
    Раньше использовал TIdHttp, затем перешёл на THttpClient.
    THttpClient и TNetHttpClient - по сути одно и то же, только последний является визуальным компонентом.
    Поэтому в вашем случае корректнее сравнивать THttpClient и TIdHttp.
    Конкретно для моих целей использование THttpClient предпочтительнее, поскольку он из коробки работает с https на всех платформах, а в случае TIdHttp для этого ещё нужно подключать ssl.
    Разницы в скорости работы не замечал.
  10. Like
    Alex7wrt получил реакцию от Anatoliy в Что лучше: TIdHttp или TNetHTTPClient?   
    Раньше использовал TIdHttp, затем перешёл на THttpClient.
    THttpClient и TNetHttpClient - по сути одно и то же, только последний является визуальным компонентом.
    Поэтому в вашем случае корректнее сравнивать THttpClient и TIdHttp.
    Конкретно для моих целей использование THttpClient предпочтительнее, поскольку он из коробки работает с https на всех платформах, а в случае TIdHttp для этого ещё нужно подключать ssl.
    Разницы в скорости работы не замечал.
  11. Like
    Alex7wrt получил реакцию от Rusland в Что лучше: TIdHttp или TNetHTTPClient?   
    Раньше использовал TIdHttp, затем перешёл на THttpClient.
    THttpClient и TNetHttpClient - по сути одно и то же, только последний является визуальным компонентом.
    Поэтому в вашем случае корректнее сравнивать THttpClient и TIdHttp.
    Конкретно для моих целей использование THttpClient предпочтительнее, поскольку он из коробки работает с https на всех платформах, а в случае TIdHttp для этого ещё нужно подключать ssl.
    Разницы в скорости работы не замечал.
  12. Like
    Alex7wrt получил реакцию от Вольдемар в Что лучше: TIdHttp или TNetHTTPClient?   
    Раньше использовал TIdHttp, затем перешёл на THttpClient.
    THttpClient и TNetHttpClient - по сути одно и то же, только последний является визуальным компонентом.
    Поэтому в вашем случае корректнее сравнивать THttpClient и TIdHttp.
    Конкретно для моих целей использование THttpClient предпочтительнее, поскольку он из коробки работает с https на всех платформах, а в случае TIdHttp для этого ещё нужно подключать ssl.
    Разницы в скорости работы не замечал.
  13. Like
    Alex7wrt отреагировална sinuke в Игра в пятнашки - Fifteen Puzzle   
    это сообщение называется Toast
    использовал из библиотеки Ярослава - TfgToast
  14. Like
    Alex7wrt отреагировална Равиль Зарипов (ZuBy) в Игра в пятнашки - Fifteen Puzzle   
  15. Like
    Alex7wrt отреагировална haword в [Андроид]не видно картинки   
    в делфи делается так - 
                        li:= lv.Items.Add;
                        lii:=li.Objects.FindObjectT<TListItemImage>('Image');
                        lii.OwnsBitmap:=True;
    далее можно грузить картинку, если в потоке то 
                TThread.Synchronize(TThread.CurrentThread, procedure()
                begin
                   // присваивание битмапу картинки 
                            lii.Bitmap:= TBitmap.Create;
                            lii.Bitmap.SetSize(ItemBitmap.Width, ItemBitmap.Height);
                            lii.Bitmap.Clear(TAlphaColors.Null);
                            lii.Bitmap.CopyFromBitmap(ItemBitmap);
                   
                end
                );
  16. Like
    Alex7wrt получил реакцию от Rusland в Запуск Google Play из своего приложения   
    uses ..... FMX.Platform.Android, FMX.Helpers.Android, Androidapi.Helpers, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes, Androidapi.JNI.App, Androidapi.JNIBridge, Androidapi.JNI.Embarcadero, AndroidApi.JNI.Net, Androidapi.JNI.Util; ... var Intent: JIntent; begin Intent := TJIntent.Create; Intent.setAction(TJIntent.JavaClass.ACTION_VIEW); try Intent.setData(StrToJURI('market://details?id=name_of_app')); //если установлен google play except Intent.setData(StrToJURI('http://play.google.com/store/apps/details?id=name_of_app')); //иначе открываем ссылку в браузере end; TAndroidHelper.Context.startActivity(Intent); В uses есть даже лишнее, поскольку взял из  проекта, где были и другие функции под Android
  17. Like
    Alex7wrt отреагировална Равиль Зарипов (ZuBy) в Проиграть данные с буфера. Аналог WaveOutWrite для Android   
    на счёт Bass, обертка есть такая
  18. Like
    Alex7wrt отреагировална To_LED в Использование BASS в FMX   
    Может кому пригодится https://github.com/ersanyakit/FMX.Radio
  19. Like
    Alex7wrt отреагировална kami в настройки при чтении с Com порта, Windows   
    COM-порт это потоковая штуковина. Считайте, что с точки зрения компьютера работа с ком-портом это получение / отправка непрерывного потока данных.
    Ни компьютер, ни подключенное устройство не имеют ни малейшего представления о том, что вы ожидаете какой-то конкретный ограниченный по объему набор байт. Они отдают ровно то, что есть в буфере на текущий момент.
    Посему, правильно будет делать так:
    одна часть приложения постоянно что-то читает из порта и добавляет считанное в конец общего буфера.
    другая часть приложения выбирает с начала общего буфера данные до тех пор, пока не поймет, что "вот оно - сообщение полностью прочитано". И после этого считанное удаляет из начала буфера.
  20. Like
    Alex7wrt отреагировална GASCHE в настройки при чтении с Com порта, Windows   
    В синхронизации. С чего вы решили, что по ReadFile ваш прибор, подключенный к ком порту должен передать или иметь в буфере сом порта именно "правильную" строку? Думаю, надо после приема производить разборку принятой строки и формировать требуемую вам. 
  21. Like
    Alex7wrt получил реакцию от DMS в Внешний вид айтемов TListView   
    Вот так:

  22. Like
    Alex7wrt отреагировална Равиль Зарипов (ZuBy) в Как сделать Tarc ровным?   
    попробуйте вот эти компоненты
  23. Like
    Alex7wrt получил реакцию от Anatoliy в Внешний вид айтемов TListView   
    Вот так:

  24. Like
    Alex7wrt получил реакцию от Anatoliy в Load/Save StringGrid   
    sl->Strings[i]  или sl[i] http://docwiki.embarcadero.com/RADStudio/Berlin/en/Accessing_a_Particular_String
  25. Like
    Alex7wrt отреагировална kami в Вызов TPopup ломает поведение TWebBrowser   
    Исходный код TCustomWebBrowser.FormHandleCreated исправлен?
     
    На всякий случай - привожу сам код исправления. Файл FMX.WebBrowser.pas необходимо скопировать из исходников студии себе в проект, положив его рядом с dpr.
    И уже в нем сделать метод FormHandleCreated следующего вида (часть проверок 100% лишняя, но когда менял - подумал "пусть будет"):
    procedure TCustomWebBrowser.FormHandleCreated(const Sender: TObject; const Msg: TMessage); var WBService: IFMXWBService; begin if not Assigned(Self) then Exit; if not Assigned(Self.Root) then Exit; if Sender <> Self.Root.GetObject then Exit; if not(csDesigning in ComponentState) and TPlatformServices.Current.SupportsPlatformService(IFMXWBService, WBService) then // if not Assigned(FWeb) then begin if FWeb <> nil then WBService.DestroyWebBrowser(FWeb); FWeb := nil; // possibly, this not needed... FWeb := WBService.CreateWebBrowser; FWeb.SetWebBrowserControl(Self); FWeb.UpdateContentFromControl; FWeb.URL := FURL; FWeb.Navigate; end; end;  
×
×
  • Создать...