Таблица лидеров


Популярный контент

Показан контент с высокой репутацией за 20.04.2018 во всех областях

  1. 4 балла
  2. 4 балла
    Тут в процессе работы над одним проектом понадобилось узнать IP адрес устройства. Очень не хотелось включать дополнительные разрешения приложению. Думал ограничится одним "Доступ в Интернет". Вот как это можно сделать: С помощью TIdUDPServer посылаем широковещательное сообщение, с помощью того же TIdUDPServer сами получаем его и в ABinding узнаем с какого IP оно пришло. Таким образом мы узнаем IP адрес интерфейса с маршрутом по умолчанию. Вот код, все просто: unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, IdGlobal, IdSocketHandle, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer; const ConstUDPSendString = 'dfgb2hd3f6gbf'; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private declarations } FUDPServer : TIdUDPServer; FMyIP : String; procedure OnUDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); procedure GetMyIP; public { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin GetMyIP; end; procedure TForm1.GetMyIP; begin FMyIP:=''; FUDPServer:=TIdUDPServer.Create; FUDPServer.DefaultPort:=46734; FUDPServer.BroadcastEnabled:=True; FUDPServer.OnUDPRead:=OnUDPServerUDPRead; FUDPServer.Active:=True; FUDPServer.Broadcast(ConstUDPSendString, FUDPServer.DefaultPort); end; procedure TForm1.OnUDPServerUDPRead(AThread: TIdUDPListenerThread; const AData: TIdBytes; ABinding: TIdSocketHandle); begin AThread.Synchronize(AThread, procedure begin if BytesToString(AData).Equals(ConstUDPSendString) and FMyIP.IsEmpty then FMyIP:=ABinding.PeerIP; end ); end; end.
  3. 3 балла
    Brovin Yaroslav

    [FGX Native] Полноценная поддержка Z-Order

    Работа над библиотекой продолжается полным ходом. Идет пополнение основных компонентов. Вот очередь добралась и до выдвигаемой панели Drawer. Новый контрол появился на палитре компонентов DrawerLayout. На видео выше продемонстрирована работа этого компонента. Отдельно стоит обратить внимание на скорость запуска приложения, плавность работы компонентов, а так же на полноценную поддержку Z-Order. 2018_03_21_03_46_52.mp4
  4. 3 балла
    Sergiy_83

    OnClick срабатывает не всегда!

    Сделал то что надо на основе progressbar, получилось еще красивее. Основа – rectangle, на ней progressbar у него HitTest = false и выравнивание по горизонтали. На rectangle повесил три события OnMouseDown, OnMouseMove и OnMouseLeave. У первых двух код устанавливает Value прогресбара в соответствии координатой пальца по оси X. OnMouseLeave это основное действие которое выполняется после того как палец ушел за пределы или отрыв в любом месте. В моем случае это перемотка по файлу. Rectangle полезен когда progressbar узкий, для удобства использования. Цвет ему прозрачный, закруглить углы и получается довольно симпатичный контрЛ.
  5. 3 балла
    МихаилЪ чайковЪ

    Tlabel Click

    lblCompanyMail.HitTest := True; Есть такая строчка у вас?
  6. 2 балла
    Brovin Yaroslav

    [FGX Native] FlexBox, Йога и AspectRatio

    О чем эти слова?!?! Да все о том же, о гибкой системе выравнивания FlexBox и об используемой реализации этой системы Yoga. На этот раз решаем задачу сохранения пропорций в размерах контролов. Представьте себе. что ваши встраиваемые изображения должны всегда сохранять соотношение сторон 16 к 9. Чтобы такого добиться в VCL и частично в FMX, вам придется написать код. Хоть он и простой, но написать его придется. в FGX Native введено новое свойство AspectRatio для Size. Его основная идея задать соотношение ширины к высоте контрола. А дальше система выравнивания сама все сделает за вас и при изменении ширины или высоты контрола (в зависимости от других настроек) автоматически вычислит высоту или ширину и сохранит пропорцию.
  7. 2 балла
    Новый компонент TfgApplicationEvents для централизованного мониторинга вашего мобильного приложения. Отслеживает изменение системных событий вашего приложения и предоставляет эти данные в одном месте. 1. OnApplicationStateChanged - Произошла смена состояния приложения 2. OnException - произошла ошибка в приложении 3. OnLowMemory - мало оперативной памяти 4. OnScreenOrientationChanged - изменилась ориентация экрана P.S. События будут пополняться.
  8. 2 балла
    Первый вариант нового компонента TfgCollectionView имеющий потрясающие возможности по гибкому созданию любого списка. Гибкий, как FMX TListBox и гораздо быстрее TListView. Создавайте любое количество стилей отображения элементов списка из любых компонентов FGX. А затем просто связывайте, какой стиль должен использовать тот или иной элемент списка. На приведенном ниже скриншоте и видео, вы можете наблюдать прокрутку списка из 100 элементов, написанного без единой строчки кода. Но это еще не все, полностью каркасная архитектура компонента позволяет создавать различные варианты размещения элементов. Начиная от отображения в строку, в столбец, по сетке и заканчивая своим кастомным размещением элементов. Поразительная скорость работы достигается за счет отображения только видимых элементов. Screenrecorder-2018-03-26-01-52-41-383.mp4
  9. 2 балла
    Расширен функционал компонента кнопки TfgButton: - Добавлена поддержка картинок - Теперь можно указывать, как располагать картинку относительно текста TfgButton.ImageLocation - Гибкие настройки параметров отображения текста на кнопе (шрифт, размер, стиль), цвета для разных состояний кнопки, а также поддержка тени TfgButton.TextSettings. Дополнительно: - Обновлены иконки запуска приложения для Андроида Delphi-Java мост: - Исправлена ошибка, которая не позволяла передавать nil значения в Android API - Улучшена утилита генерации делфи хедеров по Android Api. Теперь по объёму генерируемые хедеры получаются чуть меньше
  10. 2 балла
    Кроме Align = Top, установите еще свойство Top = 10000, что бы они добавлялись заведомо ниже всех существующий элементов. Если не устанавливать Top, то по умолчанию позиция у всех будет 0 и порядок элементов будет зависеть от погрешности вычислений Single.
  11. 2 балла
    Здравствуйте. Shift+Ctrl+C Delphi-Default-IDE-Shortcut-Keys.pdf
  12. 2 балла
    Здравствуйте. Это баг, я сообщил о нём ещё в мае (RSP-14928 и RSP-14929), в тех. поддержке предложили временное решение (ответ ниже). (Тема В TEdit стирается предыдущий текст аналогичная). find FMX.Platform.Android.pas find procedure TTextServiceAndroid.SetCaretPosition(const Value: TPoint); change code to: procedure TTextServiceAndroid.SetCaretPosition(const Value: TPoint); var SelStart, SelEnd: Integer; begin if FCaretPosition <> Value then begin FCaretPosition := Value; CalculateSelectionBounds(SelStart, SelEnd); if (FTextView <> nil) and not FInternalUpdate then PlatformAndroid.SynchronizeOnUIThread( procedure begin //Fix By [龟山]Aone(1467948783) //https://quality.embarcadero.com/browse/RSP-14928 // if (SelEnd - SelStart) > 0 then // FTextView.setSelection(SelStart, SelEnd) // else FTextView.setCursorPosition(CaretPosition.X); end); end; end;
  13. 1 балл
    Brovin Yaroslav

    [FGX Native] ShowMessage

    Работа над API продолжается. В этот раз руки дошли до асинхронной реализации ShowMessage. Впереди еще диалоговые формы ввода строковых данных и классический MessageDlg.
  14. 1 балл
    Евгений Корепов

    Поток на клиенте

    Накидал вам пример с использование потокобезопасной очереди. Логика работы такая - поток получает данные и заталкивает их в очередь, в главной форме, в таймере (можно изменить на OnIdle), проверяем очередь на наличие данных, если данные есть, то обрабатываем их. Обратите внимание на процедуру создания очереди - FQueue:=TThreadedQueue<TRec_Data>.Create(100, 1000, 10); где первый параметр размер очереди (100), второй таймаут заталкивания данных в очередь (1000мс = 1сек), третьй таймаут вытаскивания из очереди (10 мс - маленький, чтоб таймер у нас не подвисал в ожидании). Вот код проекта целиком unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, System.Generics.Collections, IdTCPClient, IdGlobal, FMX.Controls.Presentation, FMX.ScrollBox, FMX.Memo; type TRec_Data = record Flag: array[0..20] of char; end; TMyThread = class(TThread) private Progress: string; Client : TIdTCPClient; FQueue : TThreadedQueue<TRec_Data>; protected procedure Execute; override; public constructor Create(const AQueue : TThreadedQueue<TRec_Data>); destructor Destroy; override; end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private { Private declarations } FQueue : TThreadedQueue<TRec_Data>; FMyThread : TMyThread; Timer : TTimer; procedure OnTimer(Sender: TObject); public Memo1: TMemo; { Public declarations } end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.FormCreate(Sender: TObject); begin FQueue:=TThreadedQueue<TRec_Data>.Create(100, 1000, 10); Timer:=TTimer.Create(Self); Timer.Interval:=100; Timer.OnTimer:=OnTimer; Timer.Enabled:=True; FMyThread:=TMyThread.Create(FQueue); FMyThread.Start; end; procedure TForm1.FormDestroy(Sender: TObject); begin if Assigned(FMyThread) then begin FMyThread.Terminate; FMyThread.WaitFor; FMyThread.Free end; if Assigned(Timer) then Timer.Free; if Assigned(FQueue) then FQueue.Free; end; procedure TForm1.OnTimer(Sender: TObject); Var ARec : TRec_Data; begin // while FQueue.PopItem(ARec) = TWaitResult.wrSignaled do или if FQueue.PopItem(ARec) = TWaitResult.wrSignaled then Form1.Memo1.Lines.Insert(0, ARec.Flag); end; constructor TMyThread.Create(const AQueue : TThreadedQueue<TRec_Data>); var Rec: TRec_Data; Buffer: TIdBytes; begin inherited Create(true); FQueue:=AQueue; Client := TIdTCPClient.Create(nil); Client.Host := '127.0.0.1'; Client.Port := 6000; Client.Connect; // Передаем данные if Client.Connected = True then begin Rec.Flag := 'addUser'; Buffer := RawToBytes(Rec, SizeOf(Rec)); Client.IOHandler.Write(Buffer); end; end; destructor TMyThread.Destroy; begin if Assigned(Client) then Client.Free; inherited; end; procedure TMyThread.Execute; var Rec: TRec_Data; Buffer: TIdBytes; begin while Not Terminated do begin if Client.Connected then begin Client.IOHandler.ReadBytes(Buffer, SizeOf(Rec)); BytesToRaw(Buffer, Rec, SizeOf(Rec)); Progress := Rec.Flag; // Synchronize(SetProgress); FQueue.PushItem(Rec); end else Client.Connect; TThread.Sleep(10); end; end; end. Так же обратите внимание, я переписал ваш метод Execute на правильный. В вашей реализации, поток завершался при потере соединения.
  15. 1 балл
    Попробуй так v: TVertScrollBox v.ScrollTo(0,0,False); v.ScrollBy
  16. 1 балл
    Гумар Садиков

    Failure [INSTALL_FAILED_OLDER_SDK]

  17. 1 балл
    Гумар Садиков

    Сканирование папок

    unit Unit3; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,System.IOUtils, FMX.ListView.Types, FMX.ListView; type TForm3 = class(TForm) ListView1: TListView; procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form3: TForm3; implementation {$R *.fmx} {$R *.NmXhdpiPh.fmx ANDROID} procedure TForm3.FormCreate(Sender: TObject); var LList: TStringDynArray; // Cписок .JPG файлов LItem: TListViewItem; // Cписок .JPG файлов path: string; // Папки в которой будем искать файлы i: Integer; begin if TDirectory.Exists('/storage/') then path := '/storage/' else path := '/sdcard/'; try LList := TDirectory.GetFiles(path, '*.JPG', TSearchOption.soAllDirectories); except ShowMessage('Произошла ошибка !'); Exit; end; ListView1.BeginUpdate; try for i := 0 to Length(LList) - 1 do begin LItem := ListView1.Items.Add; LItem.Text := TPath.GetFileNameWithoutExtension(LList); LItem.Detail := LList; end; finally ListView1.EndUpdate; end; end; end. 0_3.rar
  18. 1 балл
    wamaco

    unauthorized access to "libqslite.so"

    Видимо использовать более свежую версию студии! Со времен XE7 много воды утекло, многое поправили.
  19. 1 балл
    Доброго времени суток ! Вопрос #1 Как назначить обработчик событий OnTap, OnGesture элементу стиля ? Либо, как еще отловить событие нажатие на элемент стиля, не путая скроллинг и tap? Подозреваю, что подобный подход не приемлем : ListBoxItem.StylesData['Rectangle.OnTap'] := TValue.From<TNotifyEvent>(..Myprocedure_OnTap...) ListBoxItem.StylesData['Rectangle.OnGesture'] := TValue.From<TNotifyEvent>(..Myprocedure_OnGesture...) Потому как, TNotifyEvent = procedure(Sender:TObject) of object; Вопрос #2. Насколько известно, android не различает скроллинг и tap. А как с этим в IOS ? Заранее благодарю
  20. 1 балл
    Задачу решил. Вот измененная процедура, ну и добавил вытягивание параметра sound private Builder buildNotification(String msgTitle, String msgText, String msgSound, PendingIntent contentIntent) { int icon = this.mContext.getApplicationContext().getApplicationInfo().icon; Builder mBuilder = new Builder(this.mContext); mBuilder.setSmallIcon(icon); mBuilder.setTicker(msgTitle); mBuilder.setContentTitle(msgTitle); mBuilder.setContentText(msgText); mBuilder.setContentIntent(contentIntent); // savage if (msgSound == "") { mBuilder.setSound(RingtoneManager.getDefaultUri(2)); } else { mBuilder.setSound(Uri.parse("android.resource://" + this.mContext.getPackageName() + "/raw/"+msgSound)); } // return mBuilder; } Звуковой файл надо добавить в Deployment Расположение res/raw/ При формировании push-сообщения имя файла указывается без расширения. К примеру, если звуковой файл был event1.mp3, то в пуше посылаем "sound":"event1" Во вложении патченый файл. Сборка fmx.jar и classes.dex как в этой теме NotificationPublisher.zip
  21. 1 балл
    wamaco

    Delphi 10.2.3, AdBanner, Java, trouble

    embarcadero выпустили патч исправляющий эту ошибку RAD Studio 10.2.3 Android Push Notification PatchThis patch resolves an issue with push notifications on Android due to missing files. It fixes the following publicly reported issue: RSP-20137 English, French, German and Japanese Available only to registered users of RAD Studio, Delphi, C++Builder 10.2 (Professional or higher) and All-Access
  22. 1 балл
    Равиль Зарипов (ZuBy)

    Реализовать свою маску в Edit

    uses maskUtils Edit1.Text := MaskDoFormatText('000.000.000.000;#0',Edit1.Text, #0);
  23. 1 балл
    Точка используется в языке Delphi, в С++ это будет в данном случае "::" ScrollBar1->Align = TAlignLayout::Client P.S. По скольку начиная с ХЕ6 требуется обязательное указание пространства имен для перечислимых типов, нужно обязательно указывать namespace.
  24. 1 балл
    Хороший вопрос. Не все знают, что в RAD Studio XE5 входит дизайнер растровых стилей для VCL (BitmapStyleDesigner), который также позволяет автоматически создавать стили для FireMonkey. Этот дизайнер находится в папке Bin/bitmapStyleDesigner.exe и содержит внутри себя автоматическую конвертацию любого VCL стиля в FireMonkey. Этот дизайнер также предназначен для внесения правок в стандартные системные стили андроида и йос. Чтобы получить системный стиль Android Dark, Android Light, iOS, iOS 7 нужно: 1. Выбрать дефолтный требуемый стиль: 2. Сохранить стиль как стиль FireMonkey: А дальше использовать файл стиля в своих приложениях.
  25. 1 балл
    Добрый вечер, Перемещение контрола можно сделать двумя способами: Используя обычный набор событий OnMouseDown, OnMouseMove, OnMouseUp. Использовать для перемещения жесты. 1. Реализация с использованием событий мыши Эти события реализованы для всех платформ. В том числе они эмулируются на мобильных платформ, где понятия мыши, как такового нету. Это означает, что их можно использовать для реализации перетаскивания контрола. Это можно сделать, например, следующим образом: а) Создаем форму и кидаем на нее картинку. Я назвал ее DraggableImage. б) Заводим два поля. TForm5 = class(TForm) DraggableImage: TImage; procedure DraggableImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); procedure DraggableImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); procedure FormCreate(Sender: TObject); procedure DraggableImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); private FStartPos: TPointF; FPressed: Boolean; end; FStartPos - начальная локальная позиция мыши внутри нашего контрола (картинки), когда пользователь зажал кнопку мышки или опустил палец на экран. FPressed - флаг для сигнализирования, что пользователь опустил палец (зажал кнопку мыши) на нашу картинку и до текущего момента не снял с экрана. в) В конструкторе формы для перетаскиваемого контрола ОБЯЗАТЕЛЬНО задаем AutoCapture = True. Это позволит контролу генерировать события перемещения мыши, даже если курсор мыши ушел за локальные границы контрола. procedure TForm5.FormCreate(Sender: TObject); begin DraggableImage.AutoCapture := True; end; г) В момент нажатия на картинку сохраняем локальную позицию мыши и задаем флаг FPressed = True procedure TForm5.DraggableImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin FPressed := True; FStartPos := TPointF.Create(X, Y); end; д) В момент отпускания кнопки мыши или убирания пальца с экрана сбрасываем флаг FPressed: procedure TForm5.DraggableImageMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Single); begin FPressed := False; end; е) И собственно меняем позицию картинки, когда мы ведем мышкой по картинке: procedure TForm5.DraggableImageMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Single); var MoveVector: TVector; begin if FPressed then begin // Вычисляем локальное смещение относительно первоначальной позиции MoveVector := TVector.Create(X - FStartPos.X, Y - FStartPos.Y, 0); // Вычисляем смещение в координатах формы, чтобы учесть изменение // координат при смещении родительских контролов MoveVector := DraggableImage.LocalToAbsoluteVector(MoveVector); if DraggableImage.ParentControl <> nil then MoveVector := DraggableImage.ParentControl.AbsoluteToLocalVector(MoveVector); // Перемещаем картинку на вычисленный вектор // Для RAD Studio XE5 DraggableImage.Position.Point := DraggableImage.Position.Point + MoveVector.ToPointF; // Для новых версий // DraggableImage.Position.Point := DraggableImage.Position.Point + TPointF(MoveVector); end; end; Этот кусок стоит прокомментировать, чтобы корректно выполнить перетаскивание контролу обязательно нужно вычислять смещение в абсолютных координатах формы. Причина в том, что если контрол повернут или входит один в другой, то нужно учитывать смещения всей цепочки родительских контролов до формы. Поэтому мы вначале вычисляем смещение в локальных координатах, затем вычисляем его в абсолютных координатах формы. А затем обратно переводим в локальные координаты родительского контрола. После чего изменяем позицию контрола на вычисленное смещение. Такой подход используется, в частности, в контроле TSelection, который так же можно перемещать мышкой или пальцем. P.S. Чтобы лучше понять это, нарисуйте на листке бумаги положения контрола и попробуйте вручную выполнить этот алгоритм с преобразованием координат. Собственно говоря, такой подход отлично работает везде и не требует использования системы жестов. 2. Реализация с использованием жестов Этот способ будет работать только на мобильных платформах, поскольку нужный жест Pan (если я правильно помню) не поддерживается под Windows. Поэтому в целом, первый вариант является универсальным и лучшим решением.
Эта таблица лидеров рассчитана в Москва/GMT+03:00