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

Alex7wrt

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

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

  • Посещение

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

    31

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

  1. Like
    Alex7wrt отреагировална krapotkin в Размер экрана 18/9   
    короче, сорян, наврал
    оказывается у жены Note 4,
    на нем тоже все зашибись
    у старшего сына 5, но до него вряд ли быстро доберусь)
  2. Like
    Alex7wrt отреагировална willi в Простой график для вывода точек и столбцов   
    Написал в XE10.1 простой модуль для вывода кривых на TImage  в виде графика - есть возможность вывода столбцов для диаграмм, меток с надписями и прочей мелочи.
    В виде компонента не оформлял...    Смысл: вводим массив точек - график сам подбирает область вывода чтобы влезли надписи и выводит с указанными параметрами и стилем кривые (имею в виду зависимости Y от X).
    Есть комментарии в коде - есть пример для тестов - см. проект https://github.com/willi-spb/arTrassing
    желательно тестирование, возможно я что-то упустил - сам модуль: https://github.com/willi-spb/arTrassing/blob/master/FMX.arCurveClasses.pas

  3. Like
    Alex7wrt отреагировална Евгений Корепов в NetHttpClient vs idHttp   
    Я уперся рогом и все таки смог найти решение для вас. Гугль любит разработчиков, и обычно оставляет им возможность пользоваться сервисами бесплатно. И в этот раз чутьё не подвело. Вот решение:
    unit Unit1; 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.ScrollBox, FMX.Memo, System.JSON, System.Net.HTTPClient, System.NetEncoding; type TForm1 = class(TForm) Memo1: TMemo; procedure FormShow(Sender: TObject); private { Private declarations } public { Public declarations } function GoogleTranslate(const AValue : String) : String; end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormShow(Sender: TObject); Var S : String; begin S:=GoogleTranslate('Hello world!'); Memo1.Lines.Add(S); end; function TForm1.GoogleTranslate(const AValue : String) : String; const ConstSourceLang = 'en'; ConstTargetLang = 'ru'; var AResponce : IHTTPResponse; FHTTPClient : THTTPClient; AAPIUrl : String; begin AAPIUrl:='https://translate.googleapis.com/translate_a/single?client=gtx&sl=' + ConstSourceLang + '&tl=' + ConstTargetLang + '&dt=t&q=' + TNetEncoding.URL.Encode(AValue); FHTTPClient:=THTTPClient.Create; FHTTPClient.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 6.1; ru-RU) Gecko/20100625 Firefox/3.6.6'; Result:='Translate Error : '; AResponce:=FHTTPClient.Get(AAPIUrl); if Not Assigned(AResponce) then begin Result:=Result + 'unknow.'; Exit; end; if AResponce.StatusCode <> 200 then begin Result:=Result + AResponce.StatusText; end; try Result:=TJSONArray(TJSONArray(TJSONArray(TJSONObject.ParseJSONValue(AResponce.ContentAsString)).Items[0]).Items[0]).Items[0].Value; except Result:=Result + 'error parse JSON.'; Exit; end; end; end. Подправил код, сделал покрасивее и убрал deprecated encode.
  4. Like
    Alex7wrt получил реакцию от Kitty в libbass.so не загружается.   
    Измените в Deployment RemotePath этого файла на assets\internal\
  5. Like
    Alex7wrt получил реакцию от #WAMACO в Audio Streaming   
    Под Android я тоже делал аудио чат родными средствами, но через Bass получилось лучше и проще. В частности, там буферизация из коробки, можно эффекты накладывать, например усиление голоса при записи через микрофон. Поэтому и предложил, ведь под Bass код, что под Android, что под iOS, один и тот же.
    Поделиться не сложно. Ниже надергал основную схему из того приложения, о котором говорил выше.  
    uses FMX.Radio.Bass; var BLoaded: boolean; chanPlay, ChanMic: Dword; avail, freq: word; buffer: TIDBytes; procedure TForm1.OnCreate(Sender: TObject); begin //Создаем UDP сервер UDP_Rec:=TIDUDPServer.Create; with UDP_Rec do begin DefaultPort:=UDP_RecPort; BufferSize:=1600; BroadcastEnabled:=true; Active:=true; end; freq:=16000; //Частота дискретизации setlength(buffer,UDP_Rec.BufferSize); BLoaded:=BASS_Init(-1, 44100, 0, nil, nil); //Подключаем библиотеку BASS_RecordInit(-1); //Инициализируем запись end; //Захват звука с микрофона procedure TForm1.Recording(Sender: TObject; const Point: TPointF); begin isrecording:=not isrecording; if isrecording then begin UDP_Rec.OnUDPRead:=nil; chanMic:=BASS_RecordStart(freq, 1, 0, nil, nil); VoiceThread:=TVoiceThread.Create; //Создание потока для отправки по UDP end end; //Передача буффера в потоке procedure TVoiceThread.Execute; begin while isrecording do begin try avail:=BASS_ChannelGetData(chanMic, nil, BASS_DATA_AVAILABLE); if avail>=UDP_Rec.BufferSize then begin //Если в буффере собралось не меньше 1600 байт, отправляем try BASS_ChannelGetData(chanMic, buffer, UDP_Rec.BufferSize); UDP_Rec.Broadcast(Buffer,UDP_RecPort); except end; end; finally sleep(20); end; end; BASS_ChannelStop(chanmic); BASS_StreamFree(chanmic); end; //Создание канала для воспроизведения звука из буффера: procedure TForm1.receiving(Sender: TObject); begin chanPlay:= BASS_StreamCreate(freq, 1, 0, STREAMPROC_PUSH, nil); UDP_Rec.OnUDPRead:=UDP_RecRead; BASS_ChannelPlay(chanPlay, false); end; //Получаем буффер из UDP procedure TForm1.UDP_RecRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); begin try BASS_StreamPutData(chanPlay, AData,length(AData)) except end; end; Bass.zip
  6. Like
    Alex7wrt получил реакцию от Виталий Иванов в Audio Streaming   
    Методом проб и ошибок обнаружил, что для речи запись с частотой дискретизации 16000 выдает практически такое же качество, как и 44100, но ощутимо лучше, чем 8000. При этом используется одноканальная запись (моно), что с учетом 16 бит на семпл дает 32 кБ/с (256 кбит/с), что не сильно нагружает WiFi сеть. Потерь нет (и это в UDP протоколе).
    Также, одна из причин, почему я не использую сжатие в данном приложении, это телефоны-приемники, которые у нас по большей части старые смартфоны с одноядерным процессорм. А в приложении кроме аудиочата есть и другие нагружающие фичи. Не хочется лишний раз нагружать проц и садить батарею, если и так все норм.
  7. Like
    Alex7wrt получил реакцию от Martifan в Audio Streaming   
    Под Android я тоже делал аудио чат родными средствами, но через Bass получилось лучше и проще. В частности, там буферизация из коробки, можно эффекты накладывать, например усиление голоса при записи через микрофон. Поэтому и предложил, ведь под Bass код, что под Android, что под iOS, один и тот же.
    Поделиться не сложно. Ниже надергал основную схему из того приложения, о котором говорил выше.  
    uses FMX.Radio.Bass; var BLoaded: boolean; chanPlay, ChanMic: Dword; avail, freq: word; buffer: TIDBytes; procedure TForm1.OnCreate(Sender: TObject); begin //Создаем UDP сервер UDP_Rec:=TIDUDPServer.Create; with UDP_Rec do begin DefaultPort:=UDP_RecPort; BufferSize:=1600; BroadcastEnabled:=true; Active:=true; end; freq:=16000; //Частота дискретизации setlength(buffer,UDP_Rec.BufferSize); BLoaded:=BASS_Init(-1, 44100, 0, nil, nil); //Подключаем библиотеку BASS_RecordInit(-1); //Инициализируем запись end; //Захват звука с микрофона procedure TForm1.Recording(Sender: TObject; const Point: TPointF); begin isrecording:=not isrecording; if isrecording then begin UDP_Rec.OnUDPRead:=nil; chanMic:=BASS_RecordStart(freq, 1, 0, nil, nil); VoiceThread:=TVoiceThread.Create; //Создание потока для отправки по UDP end end; //Передача буффера в потоке procedure TVoiceThread.Execute; begin while isrecording do begin try avail:=BASS_ChannelGetData(chanMic, nil, BASS_DATA_AVAILABLE); if avail>=UDP_Rec.BufferSize then begin //Если в буффере собралось не меньше 1600 байт, отправляем try BASS_ChannelGetData(chanMic, buffer, UDP_Rec.BufferSize); UDP_Rec.Broadcast(Buffer,UDP_RecPort); except end; end; finally sleep(20); end; end; BASS_ChannelStop(chanmic); BASS_StreamFree(chanmic); end; //Создание канала для воспроизведения звука из буффера: procedure TForm1.receiving(Sender: TObject); begin chanPlay:= BASS_StreamCreate(freq, 1, 0, STREAMPROC_PUSH, nil); UDP_Rec.OnUDPRead:=UDP_RecRead; BASS_ChannelPlay(chanPlay, false); end; //Получаем буффер из UDP procedure TForm1.UDP_RecRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); begin try BASS_StreamPutData(chanPlay, AData,length(AData)) except end; end; Bass.zip
  8. Like
    Alex7wrt получил реакцию от Виталий Иванов в Audio Streaming   
    Под Android я тоже делал аудио чат родными средствами, но через Bass получилось лучше и проще. В частности, там буферизация из коробки, можно эффекты накладывать, например усиление голоса при записи через микрофон. Поэтому и предложил, ведь под Bass код, что под Android, что под iOS, один и тот же.
    Поделиться не сложно. Ниже надергал основную схему из того приложения, о котором говорил выше.  
    uses FMX.Radio.Bass; var BLoaded: boolean; chanPlay, ChanMic: Dword; avail, freq: word; buffer: TIDBytes; procedure TForm1.OnCreate(Sender: TObject); begin //Создаем UDP сервер UDP_Rec:=TIDUDPServer.Create; with UDP_Rec do begin DefaultPort:=UDP_RecPort; BufferSize:=1600; BroadcastEnabled:=true; Active:=true; end; freq:=16000; //Частота дискретизации setlength(buffer,UDP_Rec.BufferSize); BLoaded:=BASS_Init(-1, 44100, 0, nil, nil); //Подключаем библиотеку BASS_RecordInit(-1); //Инициализируем запись end; //Захват звука с микрофона procedure TForm1.Recording(Sender: TObject; const Point: TPointF); begin isrecording:=not isrecording; if isrecording then begin UDP_Rec.OnUDPRead:=nil; chanMic:=BASS_RecordStart(freq, 1, 0, nil, nil); VoiceThread:=TVoiceThread.Create; //Создание потока для отправки по UDP end end; //Передача буффера в потоке procedure TVoiceThread.Execute; begin while isrecording do begin try avail:=BASS_ChannelGetData(chanMic, nil, BASS_DATA_AVAILABLE); if avail>=UDP_Rec.BufferSize then begin //Если в буффере собралось не меньше 1600 байт, отправляем try BASS_ChannelGetData(chanMic, buffer, UDP_Rec.BufferSize); UDP_Rec.Broadcast(Buffer,UDP_RecPort); except end; end; finally sleep(20); end; end; BASS_ChannelStop(chanmic); BASS_StreamFree(chanmic); end; //Создание канала для воспроизведения звука из буффера: procedure TForm1.receiving(Sender: TObject); begin chanPlay:= BASS_StreamCreate(freq, 1, 0, STREAMPROC_PUSH, nil); UDP_Rec.OnUDPRead:=UDP_RecRead; BASS_ChannelPlay(chanPlay, false); end; //Получаем буффер из UDP procedure TForm1.UDP_RecRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); begin try BASS_StreamPutData(chanPlay, AData,length(AData)) except end; end; Bass.zip
  9. Like
    Alex7wrt получил реакцию от rareMax в Audio Streaming   
    Под Android я тоже делал аудио чат родными средствами, но через Bass получилось лучше и проще. В частности, там буферизация из коробки, можно эффекты накладывать, например усиление голоса при записи через микрофон. Поэтому и предложил, ведь под Bass код, что под Android, что под iOS, один и тот же.
    Поделиться не сложно. Ниже надергал основную схему из того приложения, о котором говорил выше.  
    uses FMX.Radio.Bass; var BLoaded: boolean; chanPlay, ChanMic: Dword; avail, freq: word; buffer: TIDBytes; procedure TForm1.OnCreate(Sender: TObject); begin //Создаем UDP сервер UDP_Rec:=TIDUDPServer.Create; with UDP_Rec do begin DefaultPort:=UDP_RecPort; BufferSize:=1600; BroadcastEnabled:=true; Active:=true; end; freq:=16000; //Частота дискретизации setlength(buffer,UDP_Rec.BufferSize); BLoaded:=BASS_Init(-1, 44100, 0, nil, nil); //Подключаем библиотеку BASS_RecordInit(-1); //Инициализируем запись end; //Захват звука с микрофона procedure TForm1.Recording(Sender: TObject; const Point: TPointF); begin isrecording:=not isrecording; if isrecording then begin UDP_Rec.OnUDPRead:=nil; chanMic:=BASS_RecordStart(freq, 1, 0, nil, nil); VoiceThread:=TVoiceThread.Create; //Создание потока для отправки по UDP end end; //Передача буффера в потоке procedure TVoiceThread.Execute; begin while isrecording do begin try avail:=BASS_ChannelGetData(chanMic, nil, BASS_DATA_AVAILABLE); if avail>=UDP_Rec.BufferSize then begin //Если в буффере собралось не меньше 1600 байт, отправляем try BASS_ChannelGetData(chanMic, buffer, UDP_Rec.BufferSize); UDP_Rec.Broadcast(Buffer,UDP_RecPort); except end; end; finally sleep(20); end; end; BASS_ChannelStop(chanmic); BASS_StreamFree(chanmic); end; //Создание канала для воспроизведения звука из буффера: procedure TForm1.receiving(Sender: TObject); begin chanPlay:= BASS_StreamCreate(freq, 1, 0, STREAMPROC_PUSH, nil); UDP_Rec.OnUDPRead:=UDP_RecRead; BASS_ChannelPlay(chanPlay, false); end; //Получаем буффер из UDP procedure TForm1.UDP_RecRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); begin try BASS_StreamPutData(chanPlay, AData,length(AData)) except end; end; Bass.zip
  10. Like
    Alex7wrt получил реакцию от Равиль Зарипов (ZuBy) в Audio Streaming   
    Советую обратить внимание на библиотеку Bass. Буквально на днях решал похожую задачу под Android (аудио чат в пределах локальной сети) с использованием данной библиотеки. Она же доступна и под iOS.
  11. Like
    Alex7wrt отреагировална Maximus в Картинку с вебки зеркально отобразить   
    Не подойдёт? http://docwiki.embarcadero.com/Libraries/Berlin/en/FMX.Graphics.TBitmap.FlipHorizontal
  12. Like
    Alex7wrt отреагировална #WAMACO в GDPR, защита персональных данных   
    Ничего делать не надо. Обновление политики обработки персональных данных по рекламе головная боль Google, а не Ваша. 
  13. Like
    Alex7wrt отреагировална Barbanel в GDPR, защита персональных данных   
    Не было.
    Было только о том что собирает разработчик.
    Очень хороший пример описания того что можно в принципе собирать - в политике конфиденциальности инстаграма.
  14. Like
    Alex7wrt отреагировална Barbanel в GDPR, защита персональных данных   
    Как вариант, мое личное имхо:
    -один раз при старте новой версии программы отобразить окошко о том что вы никаких данных не собираете, однако данные собирает гугл ad-mob в соответствии со своей политикой
    -ставить где-нить у себя флажок о том что вы показали это окно, и следующий раз этого делать не нужно
    Для общего ознакомления можете погуглить и почитать какие именно он данные собирает (я сам не в курсе, мы не юзаем рекламу).
    Не могу сказать. По моим личным наблюдениям, такое окно выводят очень редко.
    Вернее, я ни разу не видел (пока еще ни разу) чтобы свежая версия программы (т.е. она была ранее установлена и просто обновилась через гугл плей) показывала мне такое окно.
    Сразу после установки программы - да, было пару раз.
  15. Like
    Alex7wrt получил реакцию от Ingalime в Не выбирается цвет кнопки   
    Кидаете на форму панель, нажимаете на нее правой кнопкой - > Edit Custom Style - > И там в стиле меняете свойство Fill
  16. Like
    Alex7wrt получил реакцию от Brovin Yaroslav в Не выбирается цвет кнопки   
    Кидаете на форму панель, нажимаете на нее правой кнопкой - > Edit Custom Style - > И там в стиле меняете свойство Fill
  17. Like
    Alex7wrt получил реакцию от Brovin Yaroslav в Не выбирается цвет кнопки   
    Если нужно менять цвет, то выбирайте TRectangle, как выше писали. Он полностью заменяет TPanel + имеет много возможностей по оформлению заливки и рамки, даже углы можно закруглить и т.п.
  18. Like
    Alex7wrt отреагировална Barbanel в Не выбирается цвет кнопки   
    Либо (что немного сложнее и дольше) присвойте кастомный стиль панели и задайте цвет в этом стиле.
  19. Like
    Alex7wrt отреагировална Barbanel в GDPR, защита персональных данных   
    Хы)
    Работаю в Гемании, пишем ПО для школ. Защита персональных данных здесь - первое правило.
    Этот закон реально задолбал уже всех.
    Вкратце:
    - выведите диалоговое окно как вам посоветовали, в нем вы должны уведомить пользователя какие данные вы собираете и для чего
    - если пользователь не дал вам согласие, вы не имеете права собирать любые данные с его устройства
    - вы имеете право хранить его данные только если это необходимо для правильного и полного предоставления услуги, или для предоставления отчетов в финансовые структуры
    - пользователь имеет право спросить вас, какие данные о нем вы храните и вы должны ответить пользователю в течении 40 дней
    - пользователь может затребовать у вас удалить его данные, и вы должны это сделать если данные не требуются для отчетности в фин структуры
     
    По хорошему нужно еще и спросить согласия пользователя, но этот пункт трактуется по-разному. Кто-то это делает, кто-то просто уведомляет и все.
    Под персональными данными понимается также:
    - емейл
    - IP
    - провайдер
    - любая инфа, которая позволяет идентифицировать пользователя
     
    PS: и куда только мир котиться...
  20. Like
    Alex7wrt получил реакцию от Barbanel в Не выбирается цвет кнопки   
    Если нужно менять цвет, то выбирайте TRectangle, как выше писали. Он полностью заменяет TPanel + имеет много возможностей по оформлению заливки и рамки, даже углы можно закруглить и т.п.
  21. Like
    Alex7wrt получил реакцию от Ingalime в Не выбирается цвет кнопки   
    Если нужно менять цвет, то выбирайте TRectangle, как выше писали. Он полностью заменяет TPanel + имеет много возможностей по оформлению заливки и рамки, даже углы можно закруглить и т.п.
  22. Like
    Alex7wrt получил реакцию от chellas88 в Не выбирается цвет кнопки   
    Если нужно менять цвет, то выбирайте TRectangle, как выше писали. Он полностью заменяет TPanel + имеет много возможностей по оформлению заливки и рамки, даже углы можно закруглить и т.п.
  23. Like
    Alex7wrt получил реакцию от Равиль Зарипов (ZuBy) в Вопросы по TChart   
    Предлагаю рисовать на канве. По-моему это более универсальный вариант.
    Я, например, так и рисую графики.
     
  24. Like
    Alex7wrt отреагировална Евгений Корепов в OnMouseLeave для заполненного ListBox, Windows   
    Проверяйте не в событии, а в таймере. Координаты в глобальной переменной   Screen.MousePos
  25. Like
    Alex7wrt отреагировална Евгений Корепов в OnMouseLeave для заполненного ListBox, Windows   
    Таймер, эдак милисекунд на 200. И в нем проверять координаты мыши, дальше уже арифметика.
×
×
  • Создать...