Alex7wrt

Пользователи
  • Публикаций

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

  • Посещение

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

    11

Весь контент Alex7wrt

  1. procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState); begin if key=vkHardwareBack then begin //Здесь делаем, что нужно key:=0; //Предотвращаем закрытие приложения end; end;
  2. Google Mobile Ads SDK

    Причем, строка в манифесте: <meta-data android:name="com.google.android.gms.version" android:value="4323000" /> появляется при включении Admob Service в Project->Options->Entitlement list и в последней версии студии 10.2.2, которая была выпущена недавно. Значит ли это, что Rad Studio не поддерживает Mobile Ads SDK выше этой версии? Или этот параметр ни на что не влияет, в том числе и на то, что Google перестанет поддерживать Mobile Ads SDK старше 7.0.0?
  3. Google Mobile Ads SDK

    Все же возникли сомнения на этот счет. Прочел разную инфу и уже не уверен в правильности своего ответа. Не могу понять, нужно обновлять переменную <meta-data android:name="com.google.android.gms.version" android:value="4323000" /> в манифесте или достаточно наличия последней версии SDK. Гугл говорит, что версии Mobile Ads SDK старше 7.0.0 поддерживаться не будут. Но сейчас он является частью Google Play Services. Если проект собран с последней версией Google Play Services, достаточно ли этого? Или же нужно менять и переменную com.google.android.gms.version в манифесте? Кто может подсказать?
  4. Чтобы не было красного крестика, нужно не только создать эмулятор в AWD менеджере, но и запустить его там же. В итоге на экране увидите окно, в котором запускается интерфейс Android. Когда он запустится, и появится рабочий стол Android, можно запускать установку приложения на эмулятор. Только учтите, что на относительно слабых системах эмулятор может запускаться довольно долго. Ну и Вообще для проверки работоспособности (работает/ не работает) легче воспользоваться установкой на реальный девайс.
  5. [Андроид] TAniIndicator

    Тогда TZNativeDrawFigureArc замените на TArc. Может на ваших целевых устройствах будет нормально отрисовываться.
  6. [Андроид] TAniIndicator

    Может быть вам пригодится - мой пример векторного подхода к AniIndicator без использования картинок и для различных разрешений экрана. Для отрисовки дуги использовал компонент Равиля на основе FMX.Graphics.Native, поскольку стандартные функции не красиво рисуют под Андроидом. Сам индикатор: unit newaniindicator; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Ani, FMX.Objects, FMX.Layouts, FMX.ZNativeDrawFigure; type TNewAniIndicator = class(TZNativeDrawFigureArc) Animation: TFloatAnimation; procedure AnimationProcess(Sender: TObject); procedure AnimationFinish(Sender: TObject); procedure IndicatorResize(Sender: TObject); procedure Start; procedure Stop; Constructor Create(AOwner: TComponent); override; Destructor Destroy; override; private active: boolean; public colors: array of TAlphaColor; end; implementation constructor TNewAniIndicator.Create(AOwner: TComponent); begin inherited Create(AOwner); Fill.Kind:=TBrushKind.None; Stroke.Cap:=TStrokeCap.Round; Stroke.Join:=TStrokeJoin.Round; Animation:=TFloatAnimation.Create(Self); with Animation do begin Parent:=Self; Duration:=1; StartValue:=-90; StopValue:=270; PropertyName:='StartAngle'; Interpolation:=TInterpolationType.Quadratic; OnProcess:=AnimationProcess; OnFinish:=AnimationFinish; end; OnResize:=IndicatorResize; end; destructor TNewAniIndicator.Destroy; begin Animation.Free; inherited; end; procedure TNewAniIndicator.IndicatorResize(Sender: TObject); begin Stroke.Thickness:=Width*0.1; end; procedure TNewAniIndicator.Start; begin active:=true; Stroke.Color:=colors[0]; Visible:=true; Animation.Start; end; procedure TNewAniIndicator.Stop; begin active:=false; Visible:=False; Animation.Stop; end; procedure TNewAniIndicator.AnimationProcess(Sender: TObject); begin EndAngle:=-0.0037*sqr(StartAngle)+0.667*StartAngle+90; //Функция сжатия/растяжения дуги end; procedure TNewAniIndicator.AnimationFinish(Sender: TObject); var i: byte; begin if active then begin i:=0; while colors[i] <> Stroke.Color do inc(i); if i=length(colors)-1 then Stroke.Color:=colors[0] else Stroke.Color:=colors[i+1]; Animation.Start; end; end; end. Далее в программе: ani:=TNewAniIndicator.Create(form1); with ani do begin Parent:=Form1; Width:=Form1.Width*0.2; Height:=Width; setlength(colors,6); colors[0]:=TAlphaColors.Red; colors[1]:=TAlphaColors.Orange; colors[2]:=TAlphaColors.Yellow; colors[3]:=TAlphaColors.Green; colors[4]:=TAlphaColors.Blue; colors[5]:=TAlphaColors.Violet; Start; end; newaniindicator.zip
  7. Порядок запуска TBitmapListAnimation  

    Если все же решили остановиться на BitmapListAnimation, то нарисуйте в графическом редакторе такой индикатор, который вам нравится, и устраивающий вас по размеру. Далее, напишите в Делфи простенькую программу, которая поворачивает это изображение на определенный угол в зависимости от того, сколько кадров анимации вам нужно. Если 30 кадров, то на угол 360/30 = 12 градусов. И сохраните этот массив из 30 картинок в одно изображение. Это и будет ваша заготовка для BitmapListAnimation. В дальнейшем, если решите заменить индикатор анимации, то будет уже легче это сделать с такой программкой. Все ИМХО конечно. Но когда-то делал именно так, правда все равно перешёл на векторный вариант, потому что хотел чтоб индикатор ещё и цвет менял после каждого оборота.
  8. [Андроид] TAniIndicator

    Я рисовал дугу, которая при вращении растягивается/сжимается с помощью TFloatAnimation и меняет цвет после каждого оборота. Вроде векторного подхода, норм для любого разрешения экрана.
  9. Google Mobile Ads SDK

    Думаю, что не должно быть.
  10. Google Mobile Ads SDK

    Насколько я понимаю, речь идет о том, какую версию Google Mobile Ads SDK вы используете. И манифест здесь ни при чем. Google Mobile Ads SDK сейчас является составной частью Google Play Services. И если вы регулярно обновляете SDK под Android, то все должно быть норм. Если ни так, поправьте меня.
  11. MacOS High Sierra (10.13) OpenSSL

    Для работы с https страницами используйте компоненты THttpClient или TNetHttpClient. Там ssl подключать не нужно, работает из коробки.
  12. Локальная рация, 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
  13. Локальная рация, Android, пример

    Думаю, что можно. Просто для моих целей достаточно общения в пределах одной сети. Единственное, что пока по моей оценке где-то 5% пакетов теряется. Пока не понял почему так.
  14. Описанные вами отличия существуют, но сложностей они не вызывают. Достаточно единожды использовать конструкции для платформ вроде такой: {$IF DEFINED(MSWINDOWS)} start_index:=1; {$ELSE} start_index:=0; {$ENDIF}
  15. Объединение ячеек одного стоблца

    Попробуйте через события TGrid.OnDrawColumnCell или TGrid.OnDrawColumnBackground. Там можно отрисовывать в ячейках то, что вам нужно
  16. class EIdHTTPProtocolException with message 'HTTP/1.1 400 Bad Request'

    Не знаю, поможет или нет, но когда я пользовался TIdHttp, то обычно делал так: Var str: string; .............. str:=IdHttp.Get(s); .............. То есть без TMemoryStream. TIdHttp.Get является функцией типа string. Поэтому TMemoryStream для загрузки результата не использовал. А вот в THttpClient как раз использую такую конструкцию. Может и не в этом дело, конечно, но сейчас нет возможности проверить точнее.
  17. Что лучше: TIdHttp или TNetHTTPClient?

    Раньше использовал TIdHttp, затем перешёл на THttpClient. THttpClient и TNetHttpClient - по сути одно и то же, только последний является визуальным компонентом. Поэтому в вашем случае корректнее сравнивать THttpClient и TIdHttp. Конкретно для моих целей использование THttpClient предпочтительнее, поскольку он из коробки работает с https на всех платформах, а в случае TIdHttp для этого ещё нужно подключать ssl. Разницы в скорости работы не замечал.
  18. В вашем приложении «Пятнашки» оно исчезает уже после того как приложение закрылось. То есть приложение уже закрыто, а надпись ещё висит. Хотелось бы без этого. Пока сделал все таки через TRectangle, TText и TFloatAnimation.
  19. А при реализации фишки с двойным нажатием кнопки "Назад" для выхода вы использовали какие-то системные функкции под Android? Хочу тоже такую сделать, но может быть, чем рисовать прямоугольники и делать анимацию, есть уже готовый системный метод?
  20. Добрый день В мобильном приложении используется следующая функция для чтения содержимого https страницы function geturlstring(url: string): string; var HTTP: THTTPClient; stream: tstringstream; begin try HTTP:=THTTPClient.Create; Stream:= TStringStream.Create('',TEncoding.UTF7); HTTP.Get(url, stream); Stream.Position:=0; Result:=stream.DataString; HTTP.Free; Stream.Free; except result:='error'; end; end; Почему-то в некоторых случаях, при подключении через WiFi, функция выдает 'error'. Хотя при проверке сам сайт с этим url открывается. Это вообще ссылка на гугловский сервис. Ошибку замечал например в WiFi сети метрополитена. Там подключение к WiFi двухэтапное - сначала открывается сервисная веб страница, нажимаешь ОК или что-то типа того, и WiFi подключается. В этом случае функция выдает ошибку, хотя браузер работает, и другие и приложения типа мессенджера и вайбера видят сеть.В мобильных сетях вроде работает нормально, там ошибок не замечал. В чем может быть проблема? Может ли это быть потому, что url относится к https протоколу?
  21. Рассылка в Facebook

    Можно ли средствами FireMonkey реализовать рассылку сообщений в Facebook со своего аккаунта? Сейчас приходится писать один и тот же пост много раз и рассылать по разным группам. Хотелось бы этот процесс облегчить. тематика - защита и устройство домашних животных. Выбор платформы не принципиален.
  22. Лично у меня такого никогда не было. Возможно, при установке студии при выборе устанавливаемых пакетов вы не поставили галочку в пункте "Android"?
  23. 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
  24. Пытаюсь считывать данные с ком порта (RS232). При считывании иногда происходит сдвиг строки на байт, из-за чего происходят ошибки при обработке поступающих данных: 2552525017500200333610166057255 25250175002001410166053255252 501750020034361016615725525250 1750020024101661532552525017 50020036361016635725525250175 002004410166353255252501750 02004036101651582552525017500 200841016515425525250175002 Тогда как правильно должно быть, чтобы каждая строка начиналась на 25. В сторонних прогах работы с ком портом всегда так и есть. В то же время, иногда после переключения ком порта считывание проиходит правильно, поэтому думаю, что ошибка может быть в настройках соединения с портом или задержках. Вот параметры работы ком порта, от изготовителя устройства: Вот как я настраиваю порт в программе: procedure TForm1.Button1Click(Sender: TObject); begin ComFile:=CreateFile('com2',GENERIC_READ,0,nil,OPEN_EXISTING,FILE_ATTRIBUTE_READONLY,0); if ComFile=INVALID_HANDLE_VALUE then begin ShowMessage('Не удалось открыть порт '); exit; end; SetupComm(ComFile,18,18); GetCommState(ComFile,DCB); with DCB do begin BaudRate:=57600; ByteSize:=8; Parity:=NoParity; StopBits:=OneStopBit; end; if not SetCommState(ComFile,DCB) then begin ShowMessage('Порт не настроен'); CloseHandle(ComFile); exit; end; StartComThread; end; procedure TCommThread.Execute; begin Repeat QueryPort; Sleep(100); Until Terminated; end; rocedure TCommThread.QueryPort; var MyBuff:array [0..17] of Char; i: byte; Begin all_buf:=''; FillChar(MyBuff,SizeOf(MyBuff),#0); ReadFile(ComFile,MyBuff,SizeOf(MyBuff),BytesRead,Nil); If BytesRead>0 Then Begin for i:=0 to length(Mybuff)-1 do begin all_buf:=all_buf+inttostr(ord(MyBuff[i])); end; // Form1.Memo1.Lines.Add(all_buf); End; end; Где может быть ошибка?