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

Вольдемар

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

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

  • Посещение

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

  1. Like
    Вольдемар отреагировална mmover в Memory TreeView   
    Самое простое : https://github.com/davidberneda/GenericTree
    Сам не пробовал, но давно использую похожую конструкцию.
  2. Thanks
    Вольдемар отреагировална Fedor K в ENetHTTPClientException   
    Мне кажется вся проблема в том, что идет удаление объекты до окончания операций. Учитывайте, что процесс выполняется асинхронно:
    begin //тут лишь создается поток, в котором выполняется запрос lHttp.Post(Url, lSendData); Result := ''; end; // Result := lResponse.StatusCode = 200; finally //вот здесь ошибка. Нельзя удалять объекты, если действие еще не завершилось. Вы можете узнать об завершении прцоессса в событии OnRequestCompleted lSendData.Free; lHttp.Free; end;  
     
  3. Like
    Вольдемар отреагировална 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
  4. Like
    Вольдемар отреагировална Andrey Efimov в Папки armeabi, armeabi-v7a и mips   
    Ознакомьтесь с информацией на страницах:
    Android Devices Supported for Application Development (Berlin)
    ABI Management - Supported ABIs
  5. Like
    Вольдемар отреагировална kami в Уничтожение TFrame   
    Я бы поменял их местами.
    Несколько странно сперва уничтожать объект, а потом обращаться к его полям и методам...
  6. Like
    Вольдемар отреагировална Tumaso в Концепция интерфейса приложения для Андроида   
    Эффекты смены фреймов можно и без TTabControl сделать, было бы желание 
  7. Like
    Вольдемар отреагировална #WAMACO в Вызов TPopup ломает поведение TWebBrowser   
    Тот случай, когда нужно перейти на Tokyo
  8. Like
    Вольдемар отреагировална Akad в TMemo постранично   
    У читалок есть много сложных загонов с выводом. Например из-за шрифтов, отступов и т.д. Если бы я просто отображал постранично текст,  бы сделал следующее: закачал бы в какой-нибудь stritglist весь файл, потом начал построчно рисовать в канву с переносом. И как только высота превышала бы максимум, создавалась бы следующая страница. Всё.
     
  9. Like
    Вольдемар отреагировална krapotkin в TMemo постранично   
    в мемо - лучше никак. 
    нужны подробности.
    для чего, что за "большой" файл?
  10. Like
    Вольдемар отреагировална 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.  
  11. Like
    Вольдемар отреагировална krapotkin в Мобильный клиент для сайта   
    А на чем сайт написан?? на PHP наверное.
    https://olddocs.phalconphp.com/ru/latest/reference/tutorial-rest.html
    https://github.com/2gis/2fingers
  12. Like
    Вольдемар отреагировална krapotkin в Мобильный клиент для сайта   
    предполагается что есть web-API. Например REST API или любое другое. Если нет - придется написать. Через API доступаем к данным из базы
    Эти данные визуализируем в своем приложении и изменяем так же через API
  13. Like
    Вольдемар отреагировална Andrey Efimov в Что лучше: TIdHttp или TNetHTTPClient?   
    Если не изменяет память, то:
    Компонент TNetHttpClient это просто обёртка над THttpClient. В этой обёртке и реализована асинхронность, посредством создания отдельного потока. Если по каким-то причинам не хочется использовать TNetHttpClient с асинхронным режимом, то берёте THttpClient и запихиваете в отдельный поток.
    На 100% точность не претендую, но когда стоял вопрос, что использовать в одном из приложений, выбор был сделан в пользу TNetHttpClient, т.к. уже всё, что нужно написали за нас (только использовать студию не ниже Berlin, т.к. в Seattle были какие-то проблемы с асинхронностью)
     
    p.s. Если приложение для мобильных устройств - то юзайте TNetHttpClient (THttpClient). С indy компонентами на моб. устройствах проблемы.
  14. Like
    Вольдемар отреагировална Alex7wrt в Что лучше: TIdHttp или TNetHTTPClient?   
    Раньше использовал TIdHttp, затем перешёл на THttpClient.
    THttpClient и TNetHttpClient - по сути одно и то же, только последний является визуальным компонентом.
    Поэтому в вашем случае корректнее сравнивать THttpClient и TIdHttp.
    Конкретно для моих целей использование THttpClient предпочтительнее, поскольку он из коробки работает с https на всех платформах, а в случае TIdHttp для этого ещё нужно подключать ssl.
    Разницы в скорости работы не замечал.
  15. Like
    Вольдемар отреагировална valdemar в Кнопка с картинкой   
    Там да, а на кнопке отображается 16х16 при любом размере загруженной картинки.
    Ну или можно использовать стили, и забыть image - как пережиток VCL
  16. Like
    Вольдемар отреагировална valdemar в Кнопка с картинкой   
    Не думаю.
    Да, действительно, только 16х16. Тогда советую использовать ImageControl1 вместо кнопки, чтобы была полноразмерная картинка.
  17. Like
    Вольдемар отреагировална Rusland в Почему зависает программа под Андроидом с TEdit?   
    Почитайте эту тему
  18. Like
    Вольдемар отреагировална haword в Обновление в Google Play   
    обычно люди с начало у гугля спрашивают а потом на форум идут. гугль сказал вот что - 
    protected String doInBackground(String... params) { try { newVersion = Jsoup.connect("https://play.google.com/store/apps/details?id=" + "package name" + "&hl=en") .timeout(30000) .userAgent("Mozilla/5.0 (Windows; U; WindowsNT 5.1; en-US; rv1.8.1.6) Gecko/20070725 Firefox/2.0.0.6") .referrer("http://www.google.com") .get() .select("div[itemprop=softwareVersion]") .first() .ownText(); } catch (IOException e) { e.printStackTrace(); } return newVersion; } то есть просто скачиваешь страницу с маркета, ищешь там определенный DIV и в нем и находишь последнюю версию на маркете. 
×
×
  • Создать...