Alex7wrt
-
Постов
508 -
Зарегистрирован
-
Посещение
-
Победитель дней
31
Ответы сообщества
-
Пост Alex7wrt - сообщение в OnMouseEnter срабатывает при каждом перемещении мыши по контролу был отмечен как ответ
Так происходит потому что вы делаете проверку с помощью ShowMessage. При этом панель теряет фокус и любое движение мыши над ней снова вызывает OnMouseEnter.
Проверяйте так: добавьте на форму компонент TText и в обработчике панели OnMouseEnter напишите:
text1.Text:=text1.Text+#13+'asdasd'; Вы увидите, что событие срабатывает корректно
-
Пост 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
-
Пост Alex7wrt - сообщение в Не выбирается цвет кнопки был отмечен как ответ
Если нужно менять цвет, то выбирайте TRectangle, как выше писали. Он полностью заменяет TPanel + имеет много возможностей по оформлению заливки и рамки, даже углы можно закруглить и т.п.
-
Пост 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. Задача аналогична круговому вращению планет вокруг Солнца
-
Пост Alex7wrt - сообщение в Контур TRectangle был отмечен как ответ
Если нужно убрать контур полностью, то
Rec_1.Stroke.Kind:=TBrushKind.None; Если нужно отобразить не все стороны, то
Rec_1.Sides := [TSide.Top, TSide.Left, TSide.Right];
-
Пост 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
-
Пост Alex7wrt - сообщение в Google Mobile Ads SDK был отмечен как ответ
Насколько я понимаю, речь идет о том, какую версию Google Mobile Ads SDK вы используете. И манифест здесь ни при чем. Google Mobile Ads SDK сейчас является составной частью Google Play Services. И если вы регулярно обновляете SDK под Android, то все должно быть норм.
Если ни так, поправьте меня.
-
Пост Alex7wrt - сообщение в Ошибка при подключении через WiFi, Android был отмечен как ответ
Вопрос решен.
Как оказалось, some_url в строке
HTTP.Get('http://some_url', stream) перевели на https, из-за чего подключение по WiFi перестало работать...
-
Пост 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;
-
Пост Alex7wrt - сообщение в Как отработать событие OnClick по TMediaPlayerControl, Windows был отмечен как ответ
Решил задачу с помощью таймера и функций getcursorpos() и getasynckeystate().
-
Пост 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; В данном случае - присвоение второй форме координат первой.
-
Пост 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; -
Пост 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 по центру вертикали родительского контрола
-
Пост Alex7wrt - сообщение в Полигон был отмечен как ответ
Не помогает, но спасибо за совет!
UPD. Возникла идея - зачем указывать прозрачность в FillColor, если можно указать ее в FillPolygon. Так вот,
если не указывать прозрачность цвета в Fill.Color (то есть она равна 255), а в FillPolygon она равна 1, то рисует нормально, в остальных случаях - так, как на рисунке. То есть не получается задать прозрачность при отрисовке полигона без артефактов.
-
Пост 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.
Первый вариант, насколько я помню, выводит региональный код, а второй - код языка. В большинстве случаев они совпадают, но для стран, в которых говорят на одном языке, они отличаются. Первый вариант возвратит код страны, второй - код языка.
-
Пост Alex7wrt - сообщение в Определение количества ядер процессора был отмечен как ответ
Нашел ответ - TThread.ProcessorCount.
-
Пост 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; -
Пост Alex7wrt - сообщение в [Android] Подключение MediaPlayer с Android API был отмечен как ответ
Разобрался. Нужно объявлять объект типа JMediaPlayer.
var Player: JMediaPlayer; ......................... Player:=TJMediaPlayer.Create; Player.setDataSource(StringToJString('URL_MP3_ФАЙЛА')); Player.prepare; Player.Start() -
Пост Alex7wrt - сообщение в [TGrid] Как заполнить TGrid данными? был отмечен как ответ
Тогда та же книга, та же глава. Смотрите события Grid-а OnSetValue, OnGetValue.
UPD. Если Вы еще собираетесь менять цвет ячеек или оформлять их каким-то образом, то можно заполнять их данными в событии OnDrawColumnCell, после чего методом TGrid.Repaint обновлять содержимое.
-
Пост Alex7wrt - сообщение в Можно ли перемещать элементы по форме был отмечен как ответ
Осипов. Delphi. Программирование для Windows, OS X, iOS и Android. стр. 76. Листинг 4.11. Перемещение объектов с помощью мыши.
-
Пост Alex7wrt - сообщение в "File not found" на некоторых устройствах [Android] был отмечен как ответ
На разных устройствах могут быть недоступны некоторые пути папок
http://delphifmandroid.blogspot.com/2014/02/deployment-manager.html
-
Пост Alex7wrt - сообщение в Можно поставить Лайк самому себе. был отмечен как ответ
Вконтакте тоже можно лайкать свои посты.
Мне кажется, лайкает ли кто свои посты - это вопрос, скажем так, - на отношение к жизни ))