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

Rusland

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

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

  • Посещение

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

    26

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

  1. Like
    Rusland отреагировална rareMax в Синтез речи (text-to-speech)   
    ни с ЯП, ни с ОС Вы не угадали
    https://github.com/jimmckeeth/FireMonkey-Android-Voice
    Есть и для делфи и для плюсов. Пользуйтесь
  2. Like
    Rusland отреагировална RoschinSpb в Разделение платформозависимого кода по файлам   
    Нет, там перестают работать все навороты редактора (кодкомплит, переходы по клику, хэльпинсайд)
  3. Like
    Rusland отреагировална RoschinSpb в Нарезка картинки в ImageList   
    Обидеть художника каждый может.
    Не каждый может убежать.
    При двойном клике на картинке в Selected Image появляется обычный редактор MultiresBitmap, немодальный. Вы можете перемещать прямоугольник и видеть как меняются его координаты, и размеры в масштабе 1. Можно загружать и несколько общих картинок, главное, чтобы все лежало на своих местах с учетом масштабов. 

    Также Вы можете менять координаты и размеры и видеть как перемещается выделенный прямоугольник. Если навести мышь на картинку, то появляются две кнопочки, с помощью которых можно перемещать прямоугольник пошагово (на значение ширины и высоты). Любые изменения сразу же отображаются во всех окошках. 

    Вроде и статьи написаны, и видео выложено, если ни чего не помогает, можно воспользоваться более удобными профессиональными редакторами (напр. Photoshop) и подготовить изображение, где все картинки уложены в свои клеточки. Тогда при добавлении этого изображения оно будет автоматически нарезано на одинаковые прямоугольники.
  4. Like
    Rusland отреагировална FeLDMARShaL в Недавние изменения в публикации   
    В общем было принято решение, перейти на гарантировано рабочие компоненты, при их использовании пришлось подключать библиотеку для параллельного программирования, но теперь наши потребности они полностью удовлетворяют, хоть гораздо менее удобные чем купленные RTC компоненты.
    Пример как мы будем работать с новыми компонентами (авторизация на нашем ресурсе):
    procedure TForm2.Button1Click(Sender: TObject); var   psw: String; begin  psw := '123';  TTask.Run(procedure     var       NetHTTPClient: TNetHTTPClient;       AContentStream: TStringStream;       ContentStream: String;       sha1: String;       IdHashSHA1: TIdHashSHA1;       aURL: String;     begin       try         NetHTTPClient := TNetHTTPClient.Create(nil);         try           AContentStream := TStringStream.Create;           try             IdHashSHA1 := TIdHashSHA1.Create;             try               sha1 := LowerCase(IdHashSHA1.HashBytesAsHex(TidBytes(Bytesof(psw))));               NetHTTPClient.Accept := 'text/html, application/xhtml+xml, */*';               NetHTTPClient.ContentType := 'application/x-www-form-urlencoded';               NetHTTPClient.AcceptEncoding := 'UTF-8';               aURL := 'json=yes&' +                       'CompanyID=40&' +                       'ModernLogin=' + URL_Encode('{"phone":"XXXXXXXXXX","pwd":"'+sha1+'"}');               NetHTTPClient.Execute('GET', 'XXXXXXXXX/index.php?'+aURL, nil, AContentStream);               //ДОБАВИТЬ все потенциально возможные ошибки связанные с сетью               //ДОБАВИТЬ общий счетчик кол-во незавершенных потоков для операция начала и конец ожидания загрузки данных по сети               AContentStream.Position := 0;               ContentStream := AContentStream.DataString;               TThread.Synchronize(nil, procedure()                 begin                   //ДОБАВИТЬ обработчик возможных ошибок в ответе                   Form2.WorkWithAnswer(ContentStream);                 end               );             finally               FreeAndNil(IdHashSHA1);             end;           finally             FreeAndNil(AContentStream);           end;         finally           FreeAndNil(NetHTTPClient);         end;       except         on E: Exception do         begin           //ДОБАВИТЬ обработку ошибка в главном потоке         end;       end;     end   ); end;  
  5. Like
    Rusland отреагировална chaplin.u@gmail.com в Вопрос Администратору! Какие планы на Россию?   
    Да печально что фирма в прошлом году обьявила про движение в сторону мобильных платформ а в этом свернула на Линукс сервера. Так и не сделали компилятор под Х86
     
  6. Like
    Rusland отреагировална #WAMACO в Крякнутая версия XE8   
    Абсолютно согласен! У меня есть приятель, который достаточно обеспеченный человек (выше намного по доходам среднего жителя России), так вот у нас с ним постоянные споры за кружкой пива! Он говорит, я принципиально даже 10 рублей не заплачу за любой софт, пользуется всем софтом крякнутым! И обратная сторона, знакомый с доходом 60-70 тыс.рублей, копит, откладывает, но всегда покупает лицензию! Так что вот так...
    Ну а стоимость, дело относительное... iPhone - дорогой? дорогой! но можно обойтись! Но я жду iPhone 7 и готов заплатить столько сколько надо!  Delphi Professional - дорогая? Дорогая, но если это применяется в работе и отбивается, то почему нет!
    Потребность определяет все!
  7. Like
    Rusland отреагировална Камышев Александр в События при переходе в спящий режим и выходе из него   
    Rusland, вот обсуждение 
    и код оттуда 
     
    BroadcastReceiver:= TCSBroadcastReceiver.Create(nil); BroadcastReceiver.OnReceive:= BroadcastReceiverOnReceive; BroadcastReceiver.RegisterReceive; BroadcastReceiver.Add('android.intent.action.PHONE_STATE'); BroadcastReceiver.Add('android.intent.action.NEW_OUTGOING_CALL'); а если попробовать: 
    BroadcastReceiver.Add('android.os.action.POWER_SAVE_MODE_CHANGED');  
  8. Like
    Rusland получил реакцию от Kitty в отправить файл на google disk   
    Евгений Корепов, интереснее когда напрямую из программы отсылается файл. 
    https://developers.google.com/drive/v2/reference/ 
  9. Like
    Rusland отреагировална enatechno в List box ошибка при создание ListBox1.AddObject();   
    Воспроизводится под Windows и в Seattle и в Berlin.
    1). Добавьте в листбокс 50 TMetropolisUIListBoxItem.
    2). Проскрольте листбокс.
    3). Кликните по любому айтему.
    4). Закройте программу.

    Сбой происходит при закрытии программы: в секции финализации FMX.Forms, а именно в TStyleCache.Clear.
    Если заменить TMetropolisUIListBoxItem на TListBoxItem, сбой не происходит.
    tst_Listbox.zip
  10. Like
    Rusland отреагировална Евгений Корепов в ListView фильтрация здорового человека (не курильщика)   
    Возникла задача поиска (фильтрации) в ListView по нескольким критериям. К примеру нужно искать по Item.Text, Item.Detail и Item.Date['Category']. Пошел путем, ранее подсказанным на этом форуме - правкой "function TListViewItems.ApplyFilter: Boolean" в FMX.ListView.pas. Передавать строку поиска хотел в строке типа "Text=Пеньки&Detail=по три рубля&Category=Осиновые", но быстро понял что код превращается в одноразовую кашу, а хотелось сделать красиво и на будущее.
    Сделал так - добавил еще один тип "TFilterPredicateEx = TPredicate<TListViewItem>;", к существующему "TFilterPredicate = TPredicate<string>;" в TListViewItems. Ну и далее по списку добавил аналоги к переменным, функциям и property.
    Смысл в том чтобы вместо обычного бутылочного горлышка в фильтации:
    ListView.Items.Filter:= function(X: string): Boolean begin Result := AFilterText.IsEmpty or X.ToLower.Contains(AFilterText.ToLower); end; иметь мощный инструмент с доступом ко всем плюшкам TListViewItem. Теперь это выглядит вот так:
    type TListViewFilterEx = record Category : String; Name : String; end; ... Var AFilter : TListViewFilterEx; // это для удобства хранения фильтров в одном месте ... AFilter.Category:='Береза'; AFilter.Name:='Пеньки'; AListView.Items.FilterEx:= function(X: TListViewItem): Boolean begin Result:= (AFilter.Category.IsEmpty or X.Data['Category'].AsString.ToLower.Contains(AFilter.Category.ToLower)) And ((AFilter.Name.IsEmpty or X.Text.ToLower.Contains(AFilter.Name.ToLower)) or (AFilter.Name.IsEmpty or X.Detail.ToLower.Contains(AFilter.Name.ToLower))); end; Подозреваю что все это можно было сделать с помощью хелперов, но до их освоения руки никак не дойдут. Если кто то сделает хелпер, дабы не править FMX.ListView.pas, буду очень благодарен.
    Внимание! FMX.ListView.pas от Delphi XE8, к другим версиям думаю не подойдет.
    Прилагаю дополненный FMX.ListView.pas к сообщению.
    FMX.ListViewWithFilterEx.zip
  11. Like
    Rusland отреагировална Равиль Зарипов (ZuBy) в Version Control   
    Добрый день!
    Дошли руки до Version Control, назрели пару вопросов
    Пользуетесь ли вы VC? Каким именно из представленных в IDE?  Я пытался использовать GitHub, опишу шаги
    Регистрация/Авторизация Создал репозицтории (рис 1) Получил ссылку https://github.com/rzaripov1990/ModernListView.git нажав на  Clone or download  Как настроить описано тут http://docwiki.embarcadero.com/RADStudio/Berlin/en/Git_Integration_in_the_IDE IDE -> Project Manager -> <НазваниеПроекта> -> ПКМ -> Add to Version Control -> Git Вот структура файлов моего проекта (рис 2) Открывается окно с файлами для импорта (рис 3) Жмём Import В окне сообщении видим  IDE -> Project Manager -> <НазваниеПроекта> -> ПКМ -> Git -> Push - From Project Directory В окне сообщении видим  В репозитории так ничего и не попало Что я сделал не так?
  12. Like
    Rusland получил реакцию от Kitty в События при переходе в спящий режим и выходе из него   
    No Pe, cмотрите статью Ефимова Андрея http://delphifmandroid.blogspot.com/2013/10/blog-post.html
  13. Like
    Rusland отреагировална Andrey Efimov в Возможна работа с паролем в Tzipfile?   
    По ссылке, в первом посте, я как раз упоминал Zip4J, более того даже пример выкладывал. Но Zip4J подходит для андроида.
    Про Winsoft, опять же с того момента, когда писал заметку, ничего не изменилось, всё также не понятно за что платить им, если они используют в своём компоненте только эту либу, проще скачать её и добавить в проект самостоятельно. Пример использования можно глянуть тут Расширенные возможности работы с zip файлами, бесплатно и без СМС (заметка негодования, так что можно не читать, просто скачать пример
     
    p.s. Тут похоже ТС'у желательно найти универсальную либу, но я таких не встречал.
  14. Like
    Rusland отреагировална Brovin Yaroslav в Product Roadmap August 2016   
    In February, we provided a detailed view of our Product Roadmap and we committed to update this Roadmap every six months to provide our many customers with good visibility into what is to come. As requested by many of you, we are moving to more updates and one larger release per year. 
    We have an exciting plan* that we will continue to fine tune to reflect customer and MVP requirements and input. One change from before is RAD Studio 10.1 Berlin Update 2 that will provide required support for Windows 10 Anniversary Edition, with specific support for the Windows Desktop Bridge, also known as Centennial. This update will also include new Win10 Anniversary Styles and UX controls.
    While we continue to make excellent progress on Godzilla, we want to keep up-to-date with Microsoft developments.  To further expand our Windows 10 support, Update 2 will also include new Windows 10 Anniversary Edition styles and user interface controls.
    As it was already discussed, the plan is to go back to a yearly release cycle, and offer 2 or 3 updates with additional features and support for new versions of the operating systems released during that time frame. This is an overall view of the roadmap, followed by some detailed comments by the three RAD Studio Product Managers: Marco, David, and Sarina.

    * Features are not committed until completed and released. All of the features mentioned in this article are subject to change, due to technical reasons or changes in priorities.
    More Details from Marco 
    Marco focuses on the Delphi language and personality, Delphi RTL, the VCL, Database and Web Technologies, and RAD Server
    Over the last couple of years, we have made tremendous progress with Delphi. As I speak with many MVPs and customers, I find that many new features incorporated in Seattle and Berlin are not so well known, starting with the extensive support for WinRT APIs on Windows 10. We delivered Windows 10 support for VCL in a timely way and plan to continue working in this direction, supporting new features in Windows 10 Anniversary Edition, as described earlier. 
    The most exciting new feature on the roadmap is the coming Linux support, which we’ll soon start previewing. Having the ability of taking your server side code (Apache extensions, console applications, WebBroker projects, DataSnap server, RAD Server modules, custom middle-tier architectures), keep your data access components and deploy on Linux on-premise machines or cloud instances, will open up new possibilities for Delphi developers -- and C++Builder ones as well.
    In the meantime we won’t forget improving the Delphi language. The main feature coming is support for nullable types, but we are also considering a rather long list of enhancements to the syntax, somehow minor changes that will improve the way you write code, its readability and expressiveness. 
    Here are some more roadmap details focused on Delphi, VCL and RAD Server:
    Berlin Update 2
    Windows Desktop Bridge (aka Centennial) deployment support, for building APPX files directly from the IDE, in a similar way of our mobile deployment support QuickEdit properties, making it faster to do everyday tasks in the VCL designer, by providing rapid access to the most commonly used properties of standard controls New Windows 10 CalendarView VCL control, matching the UX of the native WinRT calendar view controls (but entirely written in VCL code) New VCL Styles for Windows 10 Anniversary Edition  Godzilla
    Delivering Delphi compiler and RTL for Linux Server 64bit Integrated delivery of Konopka Controls Further overhaul of VCL visual design experience, with the inclusion of designers from Konopka Controls in the core VCL design experience New Windows 10 VCL controls including date and time pickers and additional customized panels FireDAC Linux support and drivers update on all platforms, for a large numbers of supported database engines Large-memory enable standalone Delphi compilers The Linux version of RAD Server, with Apache integration, along with the ability to create Linux RAD Server API modules in Delphi and C++, some RAD Server Console UI enhancements and the Multi-Tenancy Capability Godzilla Updates
    Quality and performance improvements New VCL controls under evaluation Improved code migration tools For RAD Server, ActiveDirectory support for login and AD synchronization for accounts, plus Kerberos authentication for clients Carnival
    Apple macOS 64-bit compiler and toolchain Delphi language support for Nullable types Delphi language syntax enhancements Carnival Updates
    Quality and performance improvements Further Windows 10 support More Details from David
    David focuses on the C++ language, including compilers and linkers, on the multi-platform debuggers, and the RAD Studio IDE
    We have some great plans for C++Builder over the next couple of releases that I believe will make C++ readers very happy. We have been focusing on platform support recently, such as with the Linux Server work making its debut in Godzilla. That gives us great support for solving practical user needs - providing cross-platform support natively, compiling natively at all levels, with the same UI and other frameworks. No-one else is doing that to the level we do.  But the cost of focusing on that has been lagging on C++ language support and so from our strong platform foundation, we’re now going to improve that.
    We plan to upgrade our Clang-based compilers to be based on Clang 3.9, and that will start with the Windows compilers with other platforms added soon after. In addition, we’re going to remain up to date with Clang: each release we will have compilers based very close to the head stable version of Clang.  That means we - and you our customers - can have your cake and eat it too: not only will you have better cross-platform support and cross-platform frameworks than other IDEs, but the C++ language support will be right up there as well.
    We also want to open up a little bit from the closed silo we sometimes have with our IDE, and we’re starting this by looking into CMake support for our compilers, and also some degree of IDE integration. Let me know what you think here - we are evaluating what to support, and it’s not limited to only CMake. As well as tools, we’re also considering many of the common C++ libraries. Feedback on all of these is welcome.
    Finally, we have some great plans for our debuggers, with ongoing work to start using LLDB on more platforms and improve its integration with our extensions and IDE. We want to end up using LLDB on many if not all platforms where we also use Clang and LLVM.
    As some smaller but very important details, in Berlin’s Update 2, we will deliver rename refactoring for C++, which should be very useful. We’re also actively improving our IDE features, such as code completion, and the linker. Both these are things that we hear need work, and so we will focus on. All up I think we have some very nice items to deliver soon that will make long-time users happy, and some great features coming over the next year.
    Berlin Update 2
    Rename refactoring Properties support in Win64 C++ debugger Godzilla
    Delivering Linux Server 64 Godzilla Updates
    CMake support: inbuilt support for bcc32c and bcc64 in CMake itself (we will work with them, and/or write patches); some IDE support, extent to be decided Upgrading to Clang 3.9 Win64 and Win32 initially Full C++17 support Other platforms over next few releases Plan to stay constantly up to date with Clang – not fall behind like with Clang 3.3. End goal is all platforms rolling forward just behind the Clang head. Carnival
    Significant debugger improvements for iOS64, OSX64 – use LLDB on these platforms with basic BCC extensions and Delphi support Further Clang 3.9 / 3.x platforms Ongoing, and Carnival Future
    Improved LLDB support – full extension, Delphi support; use on more platforms (iOS64, OSX64, Win64, Win32…) Ongoing linker work More Details from Sarina
    Sarina focuses on FireMonkey, the components libraries UX and styles, the installation experience, plus demos and documentation
    Over the last couple of years, we have added a lot of great features to the FireMonkey framework. This includes the FireUI Multi-Device Designer, Behavior Services, FireUI Live Preview, native controls and many other features and enhancements that enable our customers to quickly build applications for multiple form factors and target platforms. One of the key themes in the FireMonkey roadmap is the expansion of our native controls support. We currently have Z-Order support on both iOS and Windows, and support native presentation for various UI controls on both platforms.
    As you can see in our FireMonkey roadmap below, we have plans to extend our Z-Order support to both Android and Mac OS. As part of our roadmap, we are also planning on adding native presentation support for a range of UI controls on both Android and Mac OS. I think you will like the new native rendering support for TGrid on iOS which will be introduced in Update 1. Grid like layouts are popular in tablet applications given the additional screen real estate. They also offer a very flexible UI for enterprise apps where a table like layout may be preferred and features like column reordering, column resizing and text input are often required. I provided a sneak peek in a recent blog post.
    Berlin Update 1
    Native presentation support for TGrid on iOS FireMonkey bug fixes  Berlin Update 2
    New FireMonkey styles for Windows 10 Anniversary Edition  FireMonkey bug fixes  Deployment support for latest versions of supported operating systems  Godzilla
    FireMonkey native rendering support for Android, Phase 1: Z-Order Manager FireMonkey refactoring work  Deployment support for latest versions of supported operating systems  Radiant Shapes component library Various FireMonkey enhancements  Godzilla Updates
    FireMonkey native rendering support for Android, Phase 2 & 3 : Native presentation for various UI controls, including TEdit, TMemo etc. Additional FireMonkey styles Update advertising component to support additional advertising services FireMonkey bug fixes  Carnival
    Native presentation for additional UI controls on Android FireMonkey native rendering support for Mac OS, Phase 1: FireMonkey Z-Order Manager FireMonkey native rendering support for Mac OS, Phase 2: Native presentation for various UI controls, including TEdit and TMemo Additional FireMonkey controls, including platform specific controls Deployment support for latest versions of supported operating systems  FireMonkey maps support on Desktop Carnival Updates
    Native presentation support for additional UI controls on Mac OS (TListView, TGrid etc.) Native presentation support for additional UI controls on iOS, Android and Windows  FireMonkey bug fixes and other enhancements   We are excited about the current RAD Studio roadmap and what lies ahead. We know the plans don’t cover everything you are expecting, but rest assured there will be many other features delivered along with the main ones highlighted in this document. It is also possible that some of the features will be delivered earlier than listed above. 
    If you have specific questions or feedback,  please let us know, reaching any of the PM over email. You can also log ideas and feature requests at quality.embarcadero.com.
    These plans and roadmap represent our intentions as of this date, but our development plans and priorities are subject to change. Accordingly, we can’t offer any commitments or other forms of assurance that we’ll ultimately release any or all of the above-described products on the schedule or in the order described, or at all. These general indications of development schedules or “product roadmaps” should not be interpreted or construed as any form of a commitment, and our customers’ rights to upgrades, updates, enhancements and other maintenance releases will be set forth only in the applicable software license agreement. 
     
    Просмотр полной статьи
  15. Like
    Rusland получил реакцию от Kitty в Кнопка с картинкой   
    К обычному Button можно подсоединить ImageList с картинками и указать ему ImageIndex.
    IconButton.zip
  16. Like
    Rusland получил реакцию от Vitaldj в Кнопка с картинкой   
    К обычному Button можно подсоединить ImageList с картинками и указать ему ImageIndex.
    IconButton.zip
  17. Like
    Rusland отреагировална Belov.V. в После активации TSearchBox не возвращается индекс нового добавленого элемента   
    Готового решения на просторах интернета не нашел. То, что напридумывал сам, оформил в виде хелпера к TListBox. Может кому пригодится.
    Реализовал только необходимые мне методы. И только для режима MultiSelectStyle=None
    Самое главное, что так индекс возвращается корректно.
    unit ListBoxHelper; interface uses FMX.Controls, FMX.Types, System.SysUtils, FMX.ListBox, FMX.SearchBox; // Создаем Helper для класса TListBox type TListBoxHelper = class helper for TListBox function ResetFilter : string; // возвращает старый фильтр function GetSearchBox : TSearchBox; // возвращает SearchBox function AddAndClearSelect(const S : string) : integer; // добавить, ничего не выбирать, фильтр очистить function AddAndSelect(const S : string) : integer; // добавить, выбрать, фильтр очистить function AddAndSaveOldSelect(const S : string) : integer; // добавить, сохранить выбор, фильтр очистить function AddAndSaveOldView(const S : string) : integer; // добавить, сохранить выбор и фильтр, вернуть номер добавленного в отфильтрованном списке, или -1 если не попадает в фильтр procedure DeleteItem(const i : integer = -1); // удалить по индексу. если индекс не указан то удалить выбранный end; implementation function TListBoxHelper.GetSearchBox : TSearchBox; var Child : TControl; FxmChild : TFmxObject; begin Result := nil; for Child in self.Controls do for FxmChild in Child.Controls do if FxmChild is TSearchBox then Exit( TSearchBox( FxmChild ) ); end; function TListBoxHelper.ResetFilter : string; var s : TListBoxItem; sb : TSearchBox; begin Result := EmptyStr; s := Selected; sb := GetSearchBox; if Assigned( sb ) then begin Result := sb.Text; sb.Text := EmptyStr; end; if Assigned( FilterPredicate ) then FilterPredicate := nil; if Assigned( s ) then ItemIndex := s.Index; end; function TListBoxHelper.AddAndClearSelect(const S : string) : integer; begin ClearSelection; ResetFilter; Result := Items.Add( s ); end; function TListBoxHelper.AddAndSelect(const S : string) : integer; begin Result := AddAndClearSelect( s ); if Result <> -1 then ItemIndex := Result; end; function TListBoxHelper.AddAndSaveOldSelect(const S : string) : integer; var sel : TListBoxItem; begin sel := Selected; Result := AddAndClearSelect( s ); if Assigned( sel ) then ItemIndex := sel.Index end; function TListBoxHelper.AddAndSaveOldView(const S : string) : integer; var sb : TSearchBox; iSel, iNew : TListBoxItem; flt : string; begin iSel := Selected; iNew := nil; ClearSelection; sb := GetSearchBox; flt := ResetFilter; // Result := Items.Add( s ); if Result <> -1 then iNew := ItemByIndex( Result ); // if flt <> EmptyStr then begin sb.Text := flt; if Assigned( iNew ) then Result := iNew.Index; end; if Assigned( iSel ) then ItemIndex := iSel.Index; end; procedure TListBoxHelper.DeleteItem(const i : integer = -1); var sb : TSearchBox; flt : string; iSel, iDel : TListBoxItem; begin if i > Count-1 then Exit; sb := GetSearchBox; if i > -1 then begin iSel := Selected; iDel := ItemByIndex( i ); end else begin iSel := nil; iDel := Selected; end; flt := ResetFilter; if Assigned( iDel ) then Items.Delete( iDel.Index ); // if flt <> EmptyStr then sb.Text := flt; if Assigned( iSel ) then ItemIndex := iSel.Index; end; end. Еще на XE7 есть глюк в режиме Sorted := True, при добавить одинаковые значения (или несколько одинаковых) и сразу выделении одного через IntemIndex.
    Но пока на выявление закономерностей и борьбу нет времени.
    ListBoxHelper.zip
  18. Like
    Rusland отреагировална Pax Beach в Получение GPS координат из сервиса   
    Rusland, спасибо за пример 2.
    Много времени потратил на изучение работы из под сервиса.
    В итоге, в Berlin в сервисе отлично работает JLocationManager и JLocationListener.
     
  19. Like
    Rusland получил реакцию от Pax Beach в Получение GPS координат из сервиса   
    На радостях что сервис теперь может автоматически стартовать после перезагрузки системы (спасибо Ефимову Андрею), решил что пора научится получать координаты GPS через сервис.
     
    Вариант 1.
     
    Как-то я уже пробовал это сделать прицепив к dfm TLocationSensor, но был крах.
    Сегодня я прочитал вот такую статейку где говорится как раз об этом - крошится из-за того что в System.Android.Sensors используется Activity, которое null (у нас же сервис, а не простое приложение) 
    и предлагается решение в виде внесения изменение в System.Android.Sensors и System.Sensors.
    Я внес указанные изменения (сами файлы в patch.zip прикрепил к сообщению), скачал их Демо пример отсюда, положил вышеуказанные файлы в папку patch, но при компиляции выдает 3 ошибки вида:
    на строки соответственно
    Попробуйте кто-нибудь скомпилировать у себя пожалуйста. Пример должен быть рабочий по идее...
     
    тогда я решил действовать по другому:
     
    Вариант 2.
     
    Я вспомнил что можно обойтись без TLocationSensor и использовать LocationListener.
    В сервисе  сделал так:
    unit Unit2; interface uses System.SysUtils, System.Classes, System.Android.Service, AndroidApi.JNI.GraphicsContentViewText, Androidapi.JNI.Os, Androidapi.JNI.App, Androidapi.JNI.Location,Androidapi.JNIBridge,Androidapi.JNI.JavaTypes,Androidapi.Helpers, // для координат AndroidApi.Log; // лог смотреть через monitor.bat type TLocationListener = class; TAndroidServiceDM = class(TAndroidService) function AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; private { Private declarations } FLocationManager: JLocationManager; locationListener: TLocationListener; public destructor Destroy; override; { Public declarations } procedure StartLocator(); procedure onLocationChanged(Location: JLocation); end; TLocationListener = class(TJavaLocal, JLocationListener) private [weak] FParent: TAndroidServiceDM; public constructor Create(AParent: TAndroidServiceDM); procedure onLocationChanged(Location: JLocation); cdecl; procedure onProviderDisabled(provider: JString); cdecl; procedure onProviderEnabled(provider: JString); cdecl; procedure onStatusChanged(provider: JString; status: Integer; extras: JBundle); cdecl; end; var AndroidServiceDM: TAndroidServiceDM; implementation {%CLASSGROUP 'FMX.Controls.TControl'} {$R *.dfm} function TAndroidServiceDM.AndroidServiceStartCommand(const Sender: TObject; const Intent: JIntent; Flags, StartId: Integer): Integer; begin StartLocator(); Result:=TJService.JavaClass.START_STICKY; end; destructor TAndroidServiceDM.Destroy; begin if Assigned(locationListener) then FLocationManager.removeUpdates(locationListener); inherited; end; procedure TAndroidServiceDM.onLocationChanged(Location: JLocation); var M: TMarshaller; begin if Assigned(Location) then begin Logi(M.AsUtf8('LogLatitude '+ Location.getLongitude.ToString).ToPointer); Logi(M.AsUtf8('LogLongitude '+Location.getLongitude.ToString).ToPointer); end; end; procedure TAndroidServiceDM.StartLocator(); var LocationManagerService: JObject; GPSLocation, NetworkLocation: JLocation; begin if not Assigned(FLocationManager) then begin LocationManagerService := SharedActivityContext.getSystemService(TJContext.JavaClass.LOCATION_SERVICE); FLocationManager := TJLocationManager.Wrap((LocationManagerService as ILocalObject).GetObjectID); if not Assigned(locationListener) then locationListener := TLocationListener.Create(self); FLocationManager.requestLocationUpdates(TJLocationManager.JavaClass.GPS_PROVIDER, 10000, 0, locationListener, TJLooper.JavaClass.getMainLooper); FLocationManager.requestLocationUpdates(TJLocationManager.JavaClass.NETWORK_PROVIDER, 10000, 0, locationListener, TJLooper.JavaClass.getMainLooper); end; GPSLocation := FLocationManager.getLastKnownLocation(TJLocationManager.JavaClass.GPS_PROVIDER); NetworkLocation := FLocationManager.getLastKnownLocation(TJLocationManager.JavaClass.NETWORK_PROVIDER); onLocationChanged(GPSLocation); onLocationChanged(NetworkLocation); end; constructor TLocationListener.Create(AParent: TAndroidServiceDM); begin inherited Create; FParent := AParent; end; procedure TLocationListener.onLocationChanged(Location: JLocation); begin FParent.onLocationChanged(Location); end; procedure TLocationListener.onProviderDisabled(provider: JString); begin end; procedure TLocationListener.onProviderEnabled(provider: JString); begin end; procedure TLocationListener.onStatusChanged(provider: JString; status: Integer; extras: JBundle); begin end; end. После старта приложения, через несколько секунд оно морозится и система спрашивает "Подождать?". 
    Расстановка breakpoint-ов мне не помогла, ошибка случается раньше Segment fault 11.
     
    Пример в архиве ASARservRepair2.zip прикрепляю.
    Посмотрите пожалуйста в чем может быть проблема?
    ASARservRepair2.zip
    patch.zip
  20. Like
    Rusland отреагировална DirtyBorov в Альтернатива для TTask   
    Хочу поделится своим модулем, некой альтернативой TTask, которой я пользуюсь уже довольно продолжительное время.  Возможно кому то будет полезно. 
    AsyncTask это глобальная функция в модуле, которая возвращает интерфейс IAsyncTask. По этой причине нет нужды специально создавать объект и заботится о его удалении.
    Пример использования:
    procedure GetAsyncRequest(const aUrl: string); var LResult: string; begin AsyncTask.Run( procedure begin // это основной метод потока, он не синхронизирован. От сюда нельзя обращатся к визуальным компонентам // или переменным вне функции без синхронизации (если необходимо) LResult := HttpRequest.Get(aUrl); end, procedure begin // Эта процедура выполнится при успешном завершении потока (без exception). // Процедура синхронизированна, по этому тут можно обращатся к любым визуальным компонентам ShowMessage(LResult); end, procedure(E: Exception) begin // Эта процедура выполнится только если во время работы потока произошла ошибка ShowException(E); end, procedure begin // Эта процедура выполнится в любом случае (после завершения потока), в не зависимости была ошибка или нет ShowMessage(LResult); end ); // обратите внимание, что обязательно задать только первую процедуру, остальные можно не указывать или передать вместо них nil. Например так: AsyncTask.Run( procedure begin ... end, nil, procedure(E: Exception) begin ShowException(E); end);  
    Async.Task.pas.zip
  21. Like
    Rusland получил реакцию от zairkz в Повтор акции C++Builder® 10.1 Berlin Starter Edition   
    Это просто способ завлечь потенциальных программистов, подсадить их на C++Builder. Расчет на то что на Starter все равно ничего путного  написать нельзя... поэтому купят версию Pro или выше.
    Странно что не проводят аналогичные акции на Delphi Starter.
  22. Like
    Rusland получил реакцию от GregGirya в Как записать видео на Андроиде?   
    Вот нашел код для записи видео (проверил - работает):
    unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, Androidapi.JNI.GraphicsContentViewText, System.Messaging, // TMessageManager FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls, FMX.Controls.Presentation; type TForm1 = class(TForm) BtnRecord: TButton; Label1: TLabel; procedure BtnRecordClick(Sender: TObject); private { Private declarations } procedure HandleActivityMessage(const Sender: TObject; const M: TMessage); function OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; public { Public declarations } FMessageSubscriptionID:integer; end; var Form1: TForm1; const RECORD_VIDEO = 9; implementation {$R *.fmx} uses System.IOUtils, Androidapi.JNI.Provider, Androidapi.JNI.App, Androidapi.JNI.Net, Androidapi.JNIBridge, Androidapi.Helpers, Androidapi.JNI.JavaTypes, Androidapi.JNI.Os; procedure TForm1.BtnRecordClick(Sender: TObject); var VideoIntent: JIntent; videoUri: Jnet_Uri; AFile: JFile; FileName: TFileName; begin FMessageSubscriptionID := TMessageManager.DefaultManager.SubscribeToMessage( TMessageResultNotification, HandleActivityMessage); VideoIntent := TJIntent.JavaClass.init( TJMediaStore.JavaClass.ACTION_VIDEO_CAPTURE ); if ( VideoIntent.resolveActivity( SharedActivityContext.getPackageManager() ) <> nil) then begin FileName := TPath.Combine( TPath.GetSharedDocumentsPath, 'recording.mp4'); // см. /storage/sdcard0/Documents AFile:=TJFile.JavaClass.init( StringToJString(FileName)); videoUri:=TJnet_Uri.JavaClass.fromFile(AFile); VideoIntent.putExtra( TJMediaStore.JavaClass.EXTRA_OUTPUT, TJParcelable.Wrap((videoUri as ILocalObject).GetObjectID)); SharedActivity.startActivityForResult(VideoIntent, RECORD_VIDEO); end; end; procedure TForm1.HandleActivityMessage(const Sender: TObject; const M: TMessage); begin if M is TMessageResultNotification then OnActivityResult( TMessageResultNotification(M).RequestCode, TMessageResultNotification(M).ResultCode, TMessageResultNotification(M).Value); end; function TForm1.OnActivityResult(RequestCode, ResultCode: Integer; Data: JIntent): Boolean; begin Result := False; TMessageManager.DefaultManager.Unsubscribe( TMessageResultNotification, FMessageSubscriptionID); FMessageSubscriptionID := 0; if RequestCode = RECORD_VIDEO then begin if ResultCode = TJActivity.JavaClass.RESULT_OK then begin TThread.Queue(nil, procedure begin Label1.Text:='recording completed'; Invalidate; end); end; end; end; end. Пишет стандартной программой и сохраняет под названием recording.mp4
    Если нужно просто писать видео, то подойдет. 
  23. Like
    Rusland получил реакцию от Евгений Корепов в [Android] WebBrowser и Javascript   
    Оказывается есть возможность вызывать javascript:
    WebBrowser1.EvaluateJavaScript('alert("OK")');  
  24. Like
    Rusland отреагировална dnekrasov в Создание и коррекция кастомных стилей в XE8   
    Сделайте Background контейнером для Content-а.

  25. Like
    Rusland отреагировална enatechno в Создание и коррекция кастомных стилей в XE8   
    Похоже Вы разместили Rectangle 'background' поверх других контролов. Попробуйте нажать на нем правой кнопкой мыши и в контекстном меню выбрать Control -> Send To Back
×
×
  • Создать...