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

Alex7wrt

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

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

  • Посещение

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

    31

Ответы сообщества

  1. Пост Alex7wrt - сообщение в OnMouseEnter срабатывает при каждом перемещении мыши по контролу был отмечен как ответ   
    Так происходит потому что вы делаете проверку с помощью ShowMessage. При этом панель теряет фокус и любое движение мыши над ней снова вызывает OnMouseEnter.
    Проверяйте так: добавьте на форму компонент TText  и в обработчике панели OnMouseEnter напишите:
    text1.Text:=text1.Text+#13+'asdasd'; Вы увидите, что событие срабатывает корректно
  2. Пост 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
  3. Пост Alex7wrt - сообщение в Не выбирается цвет кнопки был отмечен как ответ   
    Если нужно менять цвет, то выбирайте TRectangle, как выше писали. Он полностью заменяет TPanel + имеет много возможностей по оформлению заливки и рамки, даже углы можно закруглить и т.п.
  4. Пост Alex7wrt - сообщение в Анимация движение button по кругу был отмечен как ответ   
    Задать для тех TButton, которые должны вращаться по окружности значение
    Position.Point:=PointF(Xc+R*cos(A+D[i]), Yc+R*sin(A+D[i])), где Xc, Yc - координаты центра, вокруг которого движется TButton, R - расстояние от этого центра до центральной точки TButton, A - параметр (угол), который линейно меняется (если нужна постоянная скорость) с помощью таймера либо TAnimation.
    Если элементов TButton несколько, то сдвигом A+D задается угловое смещение TButton относительно друг друга. Например, если всего N штук TButton, то Di=2*Pi/N*i.
    Xc, Yc и R легко выражается через координаты и размеры центра и TButton.
    P.S. Задача аналогична круговому вращению планет вокруг Солнца
  5. Пост Alex7wrt - сообщение в Контур TRectangle был отмечен как ответ   
    Если нужно убрать контур полностью, то 
    Rec_1.Stroke.Kind:=TBrushKind.None; Если нужно отобразить не все стороны, то
    Rec_1.Sides := [TSide.Top, TSide.Left, TSide.Right];  
  6. Пост Alex7wrt - сообщение в [Андроид] 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. Пост Alex7wrt - сообщение в Google Mobile Ads SDK был отмечен как ответ   
    Насколько я понимаю, речь идет о том, какую версию Google Mobile Ads SDK вы используете. И манифест здесь ни при чем. Google Mobile Ads SDK сейчас является составной частью Google Play Services. И если вы регулярно обновляете SDK под Android, то все должно быть норм.
    Если ни так, поправьте меня.

  8. Пост Alex7wrt - сообщение в Ошибка при подключении через WiFi, Android был отмечен как ответ   
    Вопрос решен.
    Как оказалось, some_url в строке 
    HTTP.Get('http://some_url', stream) перевели на https, из-за чего подключение по WiFi перестало работать...
  9. Пост Alex7wrt - сообщение в TPath Как программно указать TPathData был отмечен как ответ   
    Например так:
     
    var path: TPathData; .......... Path:=TPathData.Create; Path.Clear; Path.MoveTo(PointF(x[0],y[0])); for i:=1 to N do Path.LineTo(PointF(x[i],y[i])); Path.ClosePath;  
  10. Пост Alex7wrt - сообщение в Как отработать событие OnClick по TMediaPlayerControl, Windows был отмечен как ответ   
    Решил задачу с помощью таймера и функций getcursorpos() и getasynckeystate().
  11. Пост Alex7wrt - сообщение в как отловить перемещение формы по экрану, Windows был отмечен как ответ   
    После долгого поиска все-таки нашел тему на этом же форуме )). Хотя раньше искал, но не находил.
    Тема: http://fire-monkey.ru/topic/1452-kak-poimat-peremeschenie-formy/
     
    Суть решения - необходимо перекрыть виртуальный метод формы SetBounds, который выполняется каждый раз при перемещении формы
    procedure TCommonCustomForm.SetBounds(ALeft, ATop, AWidth, AHeight: Integer); virtual; Для этого в описании методов формы пишем
    type TForm1 = class(TForm) ........ procedure SetBounds(ALeft, ATop, AWidth, AHeight: integer); override; ....... end; и в теле процедуры выполняем необходимые действия
    procedure TForm1.SetBounds(ALeft, ATop, AWidth, AHeight: integer); begin  inherited; if assigned(form2) then begin form2.Left:=ALeft; form2.top:=ATop; end; end; В данном случае - присвоение второй форме координат первой.
  12. Пост Alex7wrt - сообщение в Как сделать скриншот с TMediaPlyerControl, Windows был отмечен как ответ   
    Нашел ошибку. Вот так работает:
    procedure MakeWindowScreenShot; var VCLBitmap: Vcl.Graphics.TBitmap; WindowRect: TRect; tmpStream: TMemoryStream; dc: HDC; begin VCLBitmap := Vcl.Graphics.TBitmap.Create; dc := GetDc(FMXHandletoHWND(form5.Handle)); try tmpStream:= TMemoryStream.Create; WindowRect:= Rect(0, 0, form5.Width, form5.Height); VCLBitmap.Width:= WindowRect.Width; VCLBitmap.Height:= WindowRect.Height; BitBlt(VCLBitmap.Canvas.Handle, WindowRect.Left, WindowRect.Top, WindowRect.Width, WindowRect.Height, dc, 0, 0, SRCCOPY); VCLBitmap.SaveToStream(tmpStream); tmpstream.Position:=0; form4.image1.bitmap.LoadFromStream(tmpStream); finally VCLBitmap.free; tmpStream.Free end; end;
  13. Пост Alex7wrt - сообщение в Как выровнять текст в TMemo по центру по вертикали? был отмечен как ответ   
    Нашел немного похожий вопрос на http://stackoverflow.com/questions/21836579/can-i-make-a-tmemo-size-itself-to-the-text-it-contains-firemonkey
     
    Используя код определения высоты TMemo:
    function get_memo_height(amemo:tmemo):single; var i:integer; astring: string; layout: ttextlayout; begin Layout := TTextLayoutManager.DefaultTextLayout.Create; astring:=''; for i:=0 to amemo.lines.count-1 do astring:=astring+amemo.lines[i]+chr(10); Layout.BeginUpdate; Layout.Text :=astring; Layout.WordWrap:= amemo.wordwrap; Layout.HorizontalAlign:= amemo.TextAlign; Layout.MaxSize:= PointF(amemo.width,maxint); Layout.VerticalAlign := TTextAlign.Leading; Layout.Font := amemo.Font; Layout.TopLeft := pointf(0,0); Layout.EndUpdate; result:=layout.textrect.bottom-amemo.Font.Size;; Layout.free; end; Memo.Height:=get_memo_height(Memo); в сочетании с 
    Memo.Align:= TAlignLayOut.VertCenter; Получаем эффект выравнивания текста Memo по центру вертикали родительского контрола
  14. Пост Alex7wrt - сообщение в Полигон был отмечен как ответ   
    Не помогает, но спасибо за совет!
     
    UPD. Возникла идея - зачем указывать прозрачность в FillColor, если можно указать ее в FillPolygon. Так вот,
    если не указывать прозрачность цвета в Fill.Color (то есть она равна 255), а в FillPolygon она равна 1, то рисует нормально, в остальных случаях - так, как на рисунке. То есть не получается задать прозрачность при отрисовке полигона без артефактов.
  15. Пост Alex7wrt - сообщение в Как определить выбранный на устройстве язык? был отмечен как ответ   
    Для Android:
    uses FMX.Platform; ......... var ls: IFMXLocaleService; lang: string; begin if TPlatformServices.Current.SupportsPlatformService(IFMXLocaleService, IInterface(ls)) then lang:=ls.GetCurrentLangID; В зависимости от языка переменная lang примет значения 'en', 'ru' и т.д.
     
    либо просто: 
    lang:=copy(SysLocale.DefaultLCID,1,2); В этом случае нужен модуль System.SysUtils. 
    Первый вариант, насколько я помню, выводит региональный код, а второй - код языка. В большинстве случаев они совпадают, но для  стран, в которых говорят на одном языке, они отличаются. Первый вариант возвратит код страны, второй - код языка. 
  16. Пост Alex7wrt - сообщение в Определение количества ядер процессора был отмечен как ответ   
    Нашел ответ - TThread.ProcessorCount. 
  17. Пост Alex7wrt - сообщение в [Android] Отслеживание сворачивания приложения был отмечен как ответ   
    Добрый день.
    Andrey Yefimov в своем блоге подробно описал получение событий жизненного цикла приложения, в том числе и потерю активности.
    http://delphifmandroid.blogspot.com/2013/10/blog-post.html
    function TForm1.HandleAppEvent(AAppEvent: TApplicationEvent; AContext: TObject): Boolean; begin case AAppEvent of TApplicationEvent.BecameActive: Log('Became Active'); TApplicationEvent.EnteredBackground: Log('Entered Background'); TApplicationEvent.WillBecomeForeground: Log('Will Become Foreground'); end; Result := True; end; procedure TForm1.FormCreate(Sender: TObject); var aFMXApplicationEventService: iFMXApplicationEventService; begin ............ if TPlatformServices.Current.SupportsPlatformService(IFMXApplicationEventService, IInterface(aFMXApplicationEventService)) then aFMXApplicationEventService.SetApplicationEventHandler(HandleAppEvent); ............ end;
  18. Пост Alex7wrt - сообщение в [Android] Подключение MediaPlayer с Android API был отмечен как ответ   
    Разобрался. Нужно объявлять объект типа JMediaPlayer.
    var Player: JMediaPlayer; ......................... Player:=TJMediaPlayer.Create; Player.setDataSource(StringToJString('URL_MP3_ФАЙЛА')); Player.prepare; Player.Start()
  19. Пост Alex7wrt - сообщение в [TGrid] Как заполнить TGrid данными? был отмечен как ответ   
    Тогда та же книга, та же глава. Смотрите события Grid-а OnSetValue, OnGetValue.
     
    UPD. Если Вы еще собираетесь менять цвет ячеек или оформлять их каким-то образом, то можно заполнять их данными в событии OnDrawColumnCell, после чего методом TGrid.Repaint обновлять содержимое.
  20. Пост Alex7wrt - сообщение в Можно ли перемещать элементы по форме был отмечен как ответ   
    Осипов. Delphi. Программирование для Windows, OS X, iOS и Android. стр. 76. Листинг 4.11. Перемещение объектов с помощью мыши.
  21. Пост Alex7wrt - сообщение в "File not found" на некоторых устройствах [Android] был отмечен как ответ   
    На разных устройствах могут быть недоступны некоторые пути папок
    http://delphifmandroid.blogspot.com/2014/02/deployment-manager.html
  22. Пост Alex7wrt - сообщение в Можно поставить Лайк самому себе. был отмечен как ответ   
    Вконтакте тоже можно лайкать свои посты.
    Мне кажется, лайкает ли кто свои посты - это вопрос, скажем так, -  на отношение к жизни ))
×
×
  • Создать...