Quantcast
Channel: Latest blog entries - Embarcadero Community
Viewing all 1683 articles
Browse latest View live

Delphi 10.2.3 is Now Available

$
0
0

Embarcadero has released today version 10.2.3 of RAD Studio, Delphi and C++Builder, that is Tokyo Update 3.

Official announcement: https://community.embarcadero.com/blogs/entry/announcing-rad-studio-10-2-3-release

Introductory video: https://www.youtube.com/watch?v=4n5AZdRx788 

DocWiki What's New page: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/10.2_Tokyo_-_Release_3

List of 100+ publicly reported bugs fixed: http://edn.embarcadero.com/article/44774

Among many features, one is fairly notable: "Inclusion of mobile support in Delphi and C++Builder Professional Edition". If you have Delphi Pro with active update subscription, you now have access to Android and iOS at no extra cost.


Read More

LIVE! With Boian Mitov of Mitov Software

RAD Studio 10.2.3リリースのお知らせ

$
0
0

この記事は、Sarina DuPontによるAnnouncing the Release of RAD Studio 10.2.3の抄訳です。

このたび、Delphi / C++Builder / RAD Studio 10.2.3のリリースを発表致しました。10.2 Tokyo, Release 3(10.2.3)は、Delphi 10.2 Tokyo、C++Builder 10.2 Tokyo、RAD Studio 10.2 Tokyoのアップデートリリースとなります。

RAD Studio 10.2.3の主な新機能:

  • CMakeコマンドラインサポート: CMakeは広く利用されているC ++ビルドツールです。RAD Studio 10.2.3では、RAD Studioのコンパイラを使用してコマンドラインでCMakeプロジェクトを構築するためのサポートを提供します。特にCMakeでNinjaの使用もサポートされているため、高速な並列ビルドが可能です。

  • C++Builderリネームリファクタリング: C ++ リネームリファクタリングでは、コードビューで識別子を右クリックしてプロジェクト全体に対して名前を変更することができ、コードの可読性を高め、変数名や型名変更するときのエラーや、プロジェクトを維持する労力を軽減できます。

  • Delphi / C++Builder Professional向けにモバイルサポートを追加: Delphi / C++Builder Professionalに10.2.3では、モバイルサポートが追加されました。これは、新規購入、アップデートサブスクリプションによるアップデートの双方に適用されます。従来は、Professional 版では別途Add-On Packとして販売されてきましたが、今回含まれるモバイルサポートにより、Delphi / C ++Builder Professionalの開発者は、WindowsとmacOSに加えて、iOSとAndroidをすべて単一のコードベースからターゲットにすることができます。

  • FireMonkey UIテンプレート:10.2.3には、FireMonkey(FMX)のマルチデバイス機能やベストプラクティスを紹介し、新しいユーザーをより早く始められるように設計された、多数の新しいFireMonkey UIテンプレートが含まれています。

  • Sencha Ext JSサポートのためのRAD Serverの拡張:10.2.3では、 Sencha Ext JSクライアント用のRAD Serverバックエンドの開発をさらに単純化し、静的なHTML、JS、CSSファイル(およびその他のファイル)を使用して、RAD Server 開発デバッグサーバーに接続できるようになりました。

アップデートには、製品のさまざまな領域の機能改善や100以上のバグ修正が含まれています。RAD Studio 10.2.3には、RAD Studio 10.2、10.2.1、10.2.2で追加してきた数多くの新機能や機能強化も含まれています。

10.2.3 Docwiki: http://docwiki.embarcadero.com/RADStudio/Tokyo/en/10.2_Tokyo_-_Release_3

日本では、2018年3月15日(木)に東京・秋葉原のUDX GALLERY NEXTで開催される「第35回 エンバカデロ・デベロッパーキャンプ」にて、10.2.3の詳細をご覧いただきます。


[YoutubeButton url='https://www.youtube.com/watch?v=4n5AZdRx788']
 

Read More

RAD Studio 10.2.3正式發佈

$
0
0

昨天美國正式發表了RAD Studio 10.2.3並且開放有軟體服務授權的客戶下, 10.2.3的新功能可以在下面的網頁中看到:

 

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/10.2_Tokyo_-_Release_3

 

10.2.3的新功能中我比較重視的是終於開始支援CMake, 這個功能是許多C/C++客戶經常詢問的功能, 現今許多第3C/C++函式庫也是使用CMake來建製, 因此支援CMake對於C++Builder是非常重要的. 10.2.3終於開了第1, 希望很快的在後續的RAD Studio版本能夠把CMake整合到IDE之中, 並且快藉由支援CMake而能夠支援重要的第3C/C++函式庫, 例如OpenCV, Dlib, ACE.

 

10.2.3新功能說明中詳細的說明了如何使用CMake, 在安裝完10.2.3之後在c:\Program Files (x86)\Embarcadero\Studio\19.0\cmake\目錄下會有必要的支援CMake相關檔案

 

接著請到 :

https://cmake.org/download/

並安裝CMake 3.1.x.

再到https://ninja-build.org/

並安裝Ninja 1.8.2

之後就可以使用CMake建製C++Builder專案, 詳情可參考:

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_CMake_with_C%2B%2B_Builder

 

另外10.2.3版的好功能之1就是它雖然會先解除安裝10.2.2, 但你在10.2.2版安裝的第3方元件10.2.3都會自動幫您回復到10.2.3版中而無需再重裝所有您使用的第3方元件, 可節省您大量的時間. 這一點我已驗證過了, 我個人使用的第3方元件在10.2.3版安裝之後立刻可使用, 個人的IDE設定也從10.2.2保留到10.2.3無需再次重新設定, 這是令我非常滿意的一點, 這次的昇級安裝是最順利的一次.

 

希望各位也能像我一樣安順利.


Read More

英巴正式发布RAD Studio 10.2.3

$
0
0

昨天美国正式发表了RAD Studio 10.2.3并且开放有软件服务授权的客户下载, 10.2.3的新功能可以在下面的网页中看到:

 

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/10.2_Tokyo_-_Release_3

 

10.2.3的新功能中我比较重视的是终于开始支持CMake, 这个功能是许多C/C++客户经常询问的功能, 现今许多第3C/C++函式库也是使用CMake来建制, 因此支持CMake对于C++Builder是非常重要的. 10.2.3终于迈开了第1, 希望很快的在后续的RAD Studio版本能够把CMake整合到IDE之中, 并且尽快藉由支持CMake而能够支持重要的第3C/C++函式库, 例如OpenCV, Dlib, ACE.

 

10.2.3新功能说明中详细的说明了如何使用CMake, 在安装完10.2.3之后在c:\Program Files (x86)\Embarcadero\Studio\19.0\cmake\目录下会有必要的支持CMake相关档案

 

接着请到 :

https://cmake.org/download/

下载并安装CMake 3.1.x.

再到https://ninja-build.org/

下载并安装Ninja 1.8.2

之后就可以使用CMake建制C++Builder项目, 详情可参考:

http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_CMake_with_C%2B%2B_Builder

 

另外10.2.3版的好功能之1就是它虽然会先卸载10.2.2, 但你在10.2.2版安装的第3方组件10.2.3都会自动帮您回复到10.2.3版中而无需再重装所有您使用的第3方组件, 可节省您大量的时间. 这一点我已验证过了, 我个人使用的第3方组件在10.2.3版安装之后立刻可使用, 个人的IDE设定也从10.2.2保留到10.2.3无需再次重新设定, 这是令我非常满意的一点, 这次的升级安装是最顺利的一次.

 

最后希望各位也能像我一样安装顺利.


Read More

Einladung zur Cross-Plattform Veranstaltung in Frankfurt - 18. April 2018

$
0
0

Schnelle, langlebige und kostengünstige Softwareentwicklung

Die Softwareentwicklung durchläuft zur Zeit in vielen Bereichen einen Wandel. Bestehende Anwendungen müssen mit immer neuen Plattformen kooperieren. Dazu kommt die Einbindung mobiler Geräte, dazu kommen die Herausforderungen diverser IoT (Internet der Dinge) Systeme sowie der Trend Software in der Cloud zu betreiben. Und über allen Bereichen schwebt das wichtige Thema Datensicherheit.

Die aktuelle IT-Landschaft besteht nicht nur aus komplett neuen Projekten, fast immer sind Legacy Systeme vorhanden und die Erfolge vieler unserer Kunden basiert insbesondere auf der langfristigen Sicherheit des Programmcodes. Anwendungen die vor vielen Jahren entwickelt wurden sind noch heute auf neuen Plattformen im Einsatz. Embarcadero steht mit seinen Produkten speziell für die langfristige Nutzung vorhandener Anwendungen und gleichzeitig die Modernisierung für heutige Anforderungen.

Wir laden Sie zu einem informativen Tag nach Frankfurt ein. Unsere Kunden stellen am Vormittag erfolgreiche Projekte aus der Praxis vor und wir stellen Ihnen die neuesten Versionen der Entwicklungswerkzeuge vor.

Neben dem neuen RAD Studio 10.2 Release 3 sehen Sie auch eine technische Präsentation der aktuellen Sencha Ext JS Version, das JavaScript- bzw. Ajax-Framework für interaktive Webanwendungen.

Einladung zu den DEVTRACKS

18. April 2018 - 9:00 bis 17:30

Frankfurt am Main

https://www.devtracks.de/ 

Die Veranstaltung ist für Sie kostenfrei.


Read More

Вышел новый релиз RAD Studio

$
0
0

Компания Embarcadero Technology объявила о выпуске новейшего релиза своего ведущего продукта для разработки кроссплатформенных приложений на основе единого кода - RAD Studio Tokyo release 3 с индексом 10.2.3

В соответствии с объявленными ранее планами, новый релиз включает логичное  расширение возможностей этого средства разработки, в частности касающихся составной части RAD Studio для создания приложений на языке C++ - C++Builder. Кроме расширения набора инструментов для C++, обновления относятся также к интеграции среды и инструментария разработки с внешними средами и библиотеками создания корпоративных WEB-приложений. 

С выходом этого релиза значительно повысилось качество и надежность работы как Delphi, так и C++Builder, добавились средства повышения производительности и комфорта разработчиков, была улучшена поддержка расширенных видео режимов.

О выходе новейшей версии было объявлено в блоге (на английском языке) https://community.embarcadero.com/blogs/entry/announcing-rad-studio-10-2-3-release 

Наших русско-язычных пользователей мы приглашаем на совместный семинар компаний Sencha и Embarcadero, где о всех новейших особенностях свежего режима будет рассказано на русском языке. Мы готовы к ответам на любые вопросы и открыты для свободного обмена мнениями. Еще можно успеть зарегистрироваться для участия https://goo.gl/aXJzuL 

 


Read More

Семинар Embarcadero и Sencha в Москве. Живое общение со специалистами

$
0
0

Уважаемые коллеги, дамы и господа! 

Компании Sencha, Embarcadero Technologies и Softline приглашают Вас принять участие в семинаре «Sencha и RADStudio – новые возможности», который состоится 15 марта 2018 г. в Москве. 

Мероприятие посвящено знакомству с решениями компании Sencha для создания кроссплатформенных, активно работающих с данными, надежных WEB-приложений для компаний любого уровня, а также новейшей версии Embarcadero RAD Studio Tokyo – 10.2.3 – решения для быстрой разработки нативных кроссплатформенных приложений для мобильных и облачных платформ с поддержкой REST-сервисов, устройств и технологий IoT. Этот релиз включает поддержку Linux и WEB-приложений, обеспечивает дальнейшее улучшение качества, стабильности и масштабируемости решений.

Мы расскажем о том, как союз Sencha и RAD Studio 10.2 обеспечивает:

• реализацию на практике актуальных трендов в разработке WEB-приложений. Будет показано какие коммерческие и технические преимущества дают WEB-технологии на пути к вершинам в бизнесе;

• улучшения, которые были сделаны в Sencha ExtJS 6.5.1 и запланированы в 6.6. Вы познакомитесь с добавленными в фреймворк мощными компонентами и динамическим загрузчиком пакетов, которые обеспечивают улучшенные загрузочные характеристики для огромных корпоративных приложений;

• разработку на Delphi для Linux серверных Интернет-приложений с применением технологий UniGUI, WebBroker, DataSnap, в том числе интеграцию с Apache, расширение возможностей RAD Server; 

• быструю реализацию проектов на примере создания Back-end в RAD Studio 10.2 и стыковки с ним web-клиентов, реализованных на Sencha ExtJS;

• повышение продуктивности работы разработчиков за счет усовершенствований и расширений среды разработки, инструментов управления и сборки проектов на C++, в том числе увеличенной доступной памяти для очень больших проектов, улучшенную работу с ресурсами, при сборке приложений, повышенный уровень оптимизации кода и возможности отладки в С++Builder;

• улучшение качества и надежности WEB-приложений с помощью Sencha Test 2.2. Будет показано как создавать надежные тесты при помощи Page Objects, визуализировать тестирование при помощи tree view и применять уникальные локаторы путем использования DOM Tree непосредственно из Sencha Studio;

• работу в браузере с миллионами записей. В примере будут показаны основные компоненты Ext JS, которые прекрасно подходят для создания индивидуализированных приложений BIG DATA; 

• и многое другое! 

Вы сможете задать любые вопросы и узнать о дальнейших планах по развитию портфеля решений Sencha и Embarcadero. Ни один вопрос не останется без внимания!

Дата и время: 15 марта (четверг), начало регистрации в 9.30. 

Участие в мероприятии бесплатное!  Ссылка для регистрации 

Количество мест ограничено, предварительная регистрация является обязательной!

Адрес и схема проезда:г. Москва, 3-я улица Ямского Поля, 26А, Radisson Blu Белорусская, зал «Моцарт+Бетховен» (10 мин. от м. Белорусская), схема проезда - https://yandex.ru/maps/-/CBeWE2DRsA . 


Read More

Mobile Support in Delphi and C++Builder 10.2.3 Professional Edition

$
0
0

New in 10.2 Tokyo Release 3 for Delphi and C++Builder Professional edition is the inclusion of mobile support for new purchases and customers on active Update Subscription. 

Previously sold as a separate add-on pack for Delphi and C++Builder Professional (or included as part of RAD Studio Pro or higher, or Delphi and C++Builder Enterprise & Architect), the included mobile support allows Delphi and C++ developers to target iOS and Android, in addition to Windows and macOS, all from a single codebase.

 

Develop Once and Click to Compile to Desktop and Mobile

With the FireMonkey multi-device application framework, you can build apps for smartphones, tablets, wearables like smart watches, and IoT devices that are natively compiled for iOS, Android, Windows and macOS using a single codebase. From the user interface code through the rest of the complete client software stack, your apps can access platform APIs, device sensors and services, and deliver the best app performance with native GPU and CPU support. Extend your existing Windows VCL apps to interface with other apps running on desktop, Android, iOS, and IoT devices.

 

FireUI Multi-Device Designer 

With the FireUI Multi-Device Designer, create user interfaces across multiple devices using a master form to share all user interface code, then optimize inherited views for each target platform and device. The FireUI Multi-Device Designer provides a set of predefined views, including Windows Desktop, Surface Pro Tablet, Mac Desktop, iPhone, iPad, Android Tablets and smartphones.

 

 

Multi-Device Preview

The Multi-Device Preview provides a design time view of what your application is going to look like on a wide range of devices. This gives you a great visual aid for developing your applications, allowing you to easily identify which user interfaces you may want to fine-tune for a specific form factor or device. The Multi-Device Preview window shows a preview of the current active form across all selected devices. Zoom in to see a detailed view of a specific device, or choose from different view modes to change the presentation of the devices in the Multi-Device Preview window.

 

FireUI App Preview

FireUI App Preview lets you view your FireMonkey application on your iOS, Android, Windows and Mac devices as you are designing the application in the Form Designer. Changes made in the Form Designer are broadcast to connected devices in real time. This feature uses our app tethering functionality as the underlying technology.

 

Download a 10.2.3 Trial today!

 


Read More

New in C++Builder 10.2.3: C++ Rename Refactoring

$
0
0

Yesterday, we released RAD Studio 10.2.3!  Over the next week, we'll be blogging about some of the new features.  Today I'd like to look at the introduction of rename refactoring for C++.

What is refactoring?

Over time, code grows and changes.  You need to maintain it: in fact, one sign of a good programmer is keeping the codebase clean: well organised, well separated with clean interfaces between segments.  Refactoring is the process of rearranging code to move or restructure it to keep it well organised.

You can do all this manually.  But much of this can be automated.

Rename Refactoring

One useful automatable refactoring is renaming elements in your code: methods, variables, types and so forth.  Perhaps you come across a misnamed variable while looking for something else: a clean coder will rename it, there and then, always keeping code accurate.  Or, perhaps your code has grown, and your Foo class needs to be split up: you might start by renaming it FooAbstract before creating a couple of subclasses and moving methods into them. For all of these, you can manually search and replace, but you may get false positives - not all Foo-s refer to the same class.

Better is to have IDE tooling that is aware of the language and rename all references. It does the work for you, and you know it is correct because the items that are identified to be renamed are done so through language- and project-aware analysis.

This is exactly what we've implemented in RAD Studio 10.2.3.

Rename Refactoring in 10.2.3

In 10.2.3, you can right-click on an identifier (method, type, variable, etc) in the editor and in the popup menu that appears, select Refactor > Rename.

Then, in the dialog that appears, enter a new name:

Check the 'Preview changed before applying' checkbox to have a look at the changed it will make before applying them. Or, if you wish, uncheck this and it will rename immediately.  If you leave it checked, you'll see the Apply Patch pane appear:

Scroll through the list and check what it plans to change.  You can click the cube refactoring icon on the toolbar to apply the rename.

Either way, if you preview the changes first or uncheck the checkbox and apply immediately when clicking Ok, the rename will be applied!

Technical info

In 10.2.3, we have the core of a new C++ language analysis and database in the IDE. This is based around Clang, and so your project should be using the Clang compilers. This builds an AST cache for your project(s). In this release, it's used only for rename refactoring, and is updated only when you invoke rename refactoring. That means the first time you rename something that is shard by multiple files (ie not a local variable, but a common class, say) it will build the cache, but thereafter it will only need to build the changed files since last time.

You can rename any common identifier, like class or other type names, fields, methods, and variables. There are a few caveats, such as not being able to rename inside a macro that is disabled (an #ifdef that is not defined) - this is because it uses the compiler itself. This guarantees correctness, and means that renaming only sees what the compiler sees.

Renaming works at the project level.

We're focusing on improving the IDE's tooling in several ways. Rename refactoring is just the first step!

 

 


Read More

New in C++Builder 10.2.3: a new Win32 compiler front-end, bcc32x

$
0
0

Yesterday we released RAD Studio 10.2.3, and we have a number of new C++Builder features. I wrote earlier about rename refactoring for C++, but today I also want to mention one small but useful one for our power users: a new compiler driver called bcc32x.

It's a minor addition, but useful.

Our compilers

In 10.2.3, we ship a number of compilers.

First, our classic compilers: the C++ compilers that users often know as the Borland compiler, bcc32.  This is bcc32 for Win32, and bccosx for macOS 32-bit.

Second, our Clang-enhanced compilers, our current generation. These are bcc32c for Win32, bcc64 for Win64, bccaarm for Android, bcciosarm for iOS32, and bcciosarm64 for iOS64. All of these are based on Clang, and extended with our own enhancements. All of these apart from bcc32c support a subset of Clang flags on the command line. bcc32c has a different command-line interface, ie supports a different set of flags: it shares the command line flags with classic bcc32. This is great for backwards compatibility, and creates an excellent upgrade path from classic bcc32 to bcc32c for users building for Win32 and wanting to move forward, but it means that we have an inconsistency: not all our Clang-based compilers support the same command line interface.

This incompatibility makes it difficult to create build scripts or use tools that call the command-line compilers that can target all our modern compilers, or even just all our modern Windows compilers. That different command-line interface for Win32 in the form of bcc32c gets in the way.

Command line consistency

Using the same command line flags for both classic bcc32 and modern bcc32c is very important: it makes it very easy for you to upgrade to the new compiler and still use your existing build scripts or similar, largely unchanged.

But we also want to have a consistent set of command line flags for all our modern compilers.

The answer: a new Win32 compiler driver. The driver is the command line tool: it is the compiler front-end, what you normally think of as the command line compiler (say, bcc32c.exe or bcc64.exe.) This new driver, bcc32x, is identical to bcc32c except it supports the Clang command line flags in common with all our other Clang-enhanced compilers.

It is added in addition to bcc32c.  bcc32c is really important and will remain.  Apart from the command line flags, the two are identical.

Hooray for consistency!

bcc32c bcc64 bcc32x

Questions

  • Is this the promised C++17 compiler?
    • No, not yet. It is coming though!
  • Do I need to change anything?
    • No.  But you can if you want. For example, if you have build scripts or a continuous integration tool that ignores msbuild and calls the compilers directly, and say you're building for both Win32 and Win64, you can clean up your script or configuration to use very similar or the same usage for both targets.
  • Sure about that?
    • Very sure.  We still ship the classic compiler and having bcc32c compatible with it is very important as an upgrade path.
  • Which of the two (bcc32c or bcc32x) does the IDE use?
    • Actually, neither.  The IDE calls the compiler through a DLL, bypassing the command line flags altogether. The flags it prints out in the Build tab are the equivalent of what it calls in direct code internally.
  • Why did you do this?
    • Consistency.  Now all Clang-enhanced compilers share a compatible set of command-line flags, you can drive them all the same way.
  • Okay, but was there some other reason to do this?
    • Yes! The specific reason we did this in 10.2.3 is that we added CMake support. That calls our command-line compilers. More on CMake in an upcoming post - it's very exciting news!

 

 


Read More

Media file meta-data on Windows in Delphi.

$
0
0

Here’s a little Déjà vu for regular readers of my blog.

One of my customers emailed me with an interesting problem this morning.
“I need to be able to peek into a video file, specifically a .mp4 file, and determine if it’s PAL or NTSC.”
This seemed like a fun challenge, so I thought I’d write a helper class to solve it..

The Problem.

The above excerpt is from a blog that I posted a few days ago (here), in which I was able to determine the media file attributes for an mp4 file on Android.
I was very pleased with myself for having written the code sample, and supplied a link to the blog post to my customer. Unfortunately, that customer then replied to my email with words akin to “Who said anything about Android?!”  – Realizing that in my morning haste I’d confused two customers and created a solution for the wrong platform, I was of course suitably embarrassed.

My customer wanted to retrieve this information for a media file on the Windows platform!

The Solution

Finding information on a media file format on Windows did not appear to be as obvious as it was on Android. The solution that I came up with involves a much earlier post on my blog about integrating the Windows Media Player ActiveX control.  Using the type library created by importing the ActiveX player control, it’s possible to interrogate any video loaded into a video player.  This doesn’t mean that the video player has to be visible either, it can be created at run-time, interrogated, and disposed without ever being placed on a form.

This is not necessarily the best, or ideal solution – if you have a better idea, please get in touch!  (Please don’t suggest ffmpeg).
This solution does work however, and so I’ve re-packaged the same sample application as I built for Android, but this time with the Windows code added in using conditional defines…

MediaExtractor-take2

Conclusion

Always verify your customers requirements before starting work! ?

Thanks for Reading!


Read More

Fix for Google Play Services Dex error in 10.2.3

$
0
0

AdMob by GoogleIf you installed 10.2.3 over 10.2.2 you may see an error similar to the one found below relating to dex and google-play-services.dex.jar when targeting Android. There were some changes in 10.2.3 to update it to use AdMob SDK version 7, and there is a workaround on the DocWiki page for migrating existing apps to 10.2.3. You can use that workaround for your new projects, or if you installed 10.2.3 over 10.2.x then there may be some files you need to clean up . . . 

If you go to C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\debug (see picture above) you will find that two of these jar/dex files are not like the others. With a date from December of 2017, while the rest are dated for March of 2018. They are left behind from 10.2.2 and the earlier version of AdMob. The suspect jar/dex files are found in both the lib\android\debug and lib\android\release folders. Delete them from both locations:

  • Delete the following files (or remove and back them up if you are the paranoid cautious type)
    • C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\debug\google-play-services.dex.jar
    • C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\debug\google-play-services.jar
    • C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\release\google-play-services.dex.jar
    • C:\Program Files (x86)\Embarcadero\Studio\19.0\lib\android\release\google-play-services.jar

You may need to restart the IDE.

If you made a clean uninstall/reinstall then you shouldn't have this error. 

Here is the full dump of the error text. . . . 

[Exec Error] The command "C:\Users\Public\Documents\Embarcadero\Studio\PlatformSDKs\android-sdk-windows\build-tools\27.0.3\dx.bat" --dex --output="C:\Users\[user]\Documents\Embarcadero\Studio\Projects\Recording\Android\Debug\classes.dex" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\android-support-v4.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\cloud-messaging.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\fmx.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-analytics-v2.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-billing.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-licensing.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-ads-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-analytics-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-base-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-identity-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-maps-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-panorama-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-plus-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-wallet-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services.dex.jar" " exited with code 2.

    UNEXPECTED TOP-LEVEL EXCEPTION:

    com.android.dex.DexException: Multiple dex files define Lcom/google/ads/AdRequest$ErrorCode;
        at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)
        at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)
        at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)
        at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
        at com.android.dx.merge.DexMerger.merge(DexMerger.java:198)
        at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:506)
        at com.android.dx.command.dexer.Main.runMonoDex(Main.java:336)
        at com.android.dx.command.dexer.Main.runDx(Main.java:291)
        at com.android.dx.command.dexer.Main.main(Main.java:247)
        at com.android.dx.command.Main.main(Main.java:94)

    c:\program files (x86)\embarcadero\studio\19.0\bin\CodeGear.Common.Targets(894,5): error MSB3073: The command "PATH C:\Program Files\Java\jdk1.8.0_60\bin;C:\Users\Public\Documents\Embarcadero\InterBase\redist\InterBaseXE7\IDE_spoof;C:\Users\Public\Documents\Embarcadero\InterBase\redist\InterBaseXE7\IDE_spoof;S:\Binaries\Delphi;C:\Program Files (x86)\Embarcadero\Studio\19.0\bin;C:\Users\Public\Documents\Embarcadero\Studio\19.0\Bpl;C:\Program Files (x86)\Embarcadero\Studio\19.0\bin64;C:\Users\Public\Documents\Embarcadero\Studio\19.0\Bpl\Win64;C:\Users\Public\Documents\Embarcadero\Studio\19.0\PlatformSDKs\android-sdk-windows\platform-tools;C:\Program Files\Java\jdk1.7.0_80\bin;C:\Utils\java2op;C:\Users\Public\Documents\Embarcadero\Studio\19.0\Bpl;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\WinMerge;C:\Program Files\PuTTY\;C:\Users\Dubten\AppData\Local\Microsoft\WindowsApps;;C:\Users\Dubten\AppData\Local\Programs\Fiddler & "C:\Users\Public\Documents\Embarcadero\Studio\19.0\PlatformSDKs\android-sdk-windows\build-tools\26.0.2\dx.bat" --dex --output="S:\DelphiWorlds\Applications\Default\Android\Debug\classes.dex" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\android-support-v4.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\cloud-messaging.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\fmx.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-analytics-v2.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-billing.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-licensing.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-ads-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-analytics-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-base-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-identity-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-maps-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-panorama-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-plus-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services-wallet-7.0.0.dex.jar" "c:\program files (x86)\embarcadero\studio\19.0\lib\Android\Debug\google-play-services.dex.jar" " exited with code 2.

Done building target "BuildClassesDex" in project "Project1.dproj" -- FAILED.

Done building project "Project1.dproj" -- FAILED.

Build FAILED.


Read More

Google Cloud Shell Network Details

$
0
0

Marco Cantu’s blog post about Running a Delphi Linux Application on Google Cloud Shell got me wondering more about the Google Cloud Shell, specifically around the networking. First of all, is the IP address public?

jim@cloudshell:~$ hostname -I
172.18.0.1 172.17.0.2
jim@cloudshell:~$ curl icanhazip.com
35.199.148.57

So the private IP is different from the public IP. I’ll need to test to see if it is mapped with NAT or something. Seems unlikely though. Google offers public facing computers as part of their cloud services, so it makes sense that you would use those instead.

Next question is around bandwidth.

curl -s https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py | python -

Results in . . .

Retrieving speedtest.net configuration...
Testing from Google Cloud (35.199.148.57)...
Retrieving speedtest.net server list...
Selecting best server based on ping...
Hosted by Mimosa Networks (San Jose, CA) [17.60 km]: 40.662 ms
Testing download speed........
Download: 322.69 Mbit/s
Testing upload speed........
Upload: 260.94 Mbit/s

322.69 Mbit/s down and 260.94 Mbit/s up is really impressive! So if you have a task that requires a lot of bandwidth and then condenses it down to a smaller digest, it would be a really useful platform.


Read More

New in 10.2.3: CMake Support

$
0
0

A very exciting feature in C++Builder 10.2.3 is support for using CMake with our compilers.  Let's dig in!

This post is the first in a series on CMake, and will cover:

  • What CMake is
  • How to write a CMakeLists.txt file
  • How to build a project on Windows

What is CMake?

You can think of CMake as a platform-independent, compiler-independent, project format for C++ apps and libraries.

CMake uses a file called CMakeLists.txt.  This is a plain text, human-editable, description of a project: the files that need to be built, the project name(s), dependencies, etc.  Here's an example:

.
cmake_minimum_required (VERSION 3.10)
project (MyProjectName)
 
add_executable(MyProjectName one.cpp two.cpp Cell.cpp three.cpp)

This says:

  • This file works with CMake 3.10 (that's ten not one) or higher
  • There is a project called MyProjectName
  • And to build MyProjectName.exe, build one.cpp, two.cpp, and three.cpp

This is a simple example. A CMakeLists.txt file is more akin to the project group in C++Builder than a project, because it can specify several projects, dependencies among them, etc.

This is completely compiler-independent.  CMake knows how to build the above project as well with cc on Solaris as gcc on Linux as clang on Mac.  Naturally, sometimes you do need to set vendor- or platform-specific settings, and you can do that as well.  We do, for example to specify linking against the VCL or FMX runtime, which is very specific to C++Builder, or to link with the dynamic runtime, which has equivalents for other compilers but is still specific to us in implementation.

CMake has good documentation, but I think it's a bit opaque if you don't already know CMake. Personally, I recommend reading Jeff Pershing's blog series on CMake: How to Build a CMake-Based Project and Learn CMake's Scripting Language in 15 Minutes.  There's a wealth of well-explained material there that will make you a CMake expert in no time.

Advantages of CMake Support for C++Builder

Many third-party open source C++ libraries come packaged as CMake projects.  In the past, to use these you'd have to create a C++Builder project for them, which is manual work.  Now, you can just build them on the command line right away.

This makes it significantly easier for you to use other common libraries in your projects.

One secondary item is that we support using Ninja with CMake. This allows parallel building. We already support parallel compilation in C++Builder, but I'll cover Ninja in a followup blog post.

What have we added?

We have added: Support for using CMake to build with all of C++Builder's Clang-based command-line compilers: for Win32, Win64, iOS32, iOS64, and Android.

(You could already use CMake with the classic compiler.)  

Using CMake for Windows

Installation

  1. Download and install CMake.  When installing, make sure you choose the option to add CMake to the system path.  If you don't, you'll have to specify the full path the CMake each time you want to use it.
  2. Optionally, but highly recommended, download Ninja.  This is a plain EXE: place it somewhere on your system and add that location to the system path manually.
  3. Install C++Builder 10.2.3 :)
  4. There is one very important installation step.  Do not miss this or you will get strange error messages. We have updated the Windows-Embarcadero.cmake file compared to the version currently shipped with CMake. So, open
    C:\Program Files (x86)\Embarcadero\Studio\19.0\cmake
    And copy and paste Windows-Embarcadero.cmake to:
    C:\Program Files\CMake\share\cmake-3.11\Modules\Platform
    (3.11 is the CMake version.)  Back the file up first.

If you do not do this final step, you will get a rather puzzling error message when running CMake, something like:

.
-- Check for working C compiler: C:/Program Files (x86)/Embarcadero/Studio/19.0/bin/bcc64.exe -- broken

CMake Error at C:/Program Files/CMake/share/cmake-3.11/Modules/CMakeTestCCompiler.cmake:52 (message):

  The C compiler
    "C:/Program Files (x86)/Embarcadero/Studio/19.0/bin/bcc64.exe"
  is not able to compile a simple test program.

  It fails with the following output:
    [ -- Long compiler command line omitted -- ]

    error: invalid integral value 'd' in '-Od'

  CMake will not be able to correctly generate this project.

If you see this, copy over Windows-Embarcadero.cmake as above. We hope that soon, perhaps 10.3, we will be able to support CMake out of the box without needing to ship an updated configuration file.

Example Windows CMakeLists.txt

Above, I showed a very simple CMakeLists.txt to demonstrate the concept.  Let's look at one for a real project.  This is for a FireMonkey Windows application I built for CodeRage last year.

.
cmake_minimum_required (VERSION 3.10)
project (Mazes)

set_embt_target("FMX" "DynamicRuntime")
 
add_executable(Mazes CppMazes.cpp Algorithms.cpp Cell.cpp DistanceDijkstra.cpp Grid.cpp MainForm.cpp)

Looks very similar, doesn't it? There is one addition: an Embarcadero-specific line, set_embt_target.  This macro specifies whether to link with the VCL or FMX, the dynamic runtime, or as a package. These can be combined and are listed in our documentation.

If you are building a VCL application, just write,

.
set_embt_target(VCL)

Which does not link against the dynamic runtime (because it was not specified) but does link against the VCL.

In normal CMake projects, you need to specify WIN32 in the add_executable call, which specifies that it is not a console app (ie sets a PE flag and uses WinMain.) If you specify the VCL or FMX, you don't need to do this; we automatically do. You can override it and specify console if you need.

Want to find more - how to build a shared library, or a package, or...?  We have six sample CMakeLists.txt files in our documentation.

Building for Windows

All the above is just background - all you really need to know is here, two command lines!

You have CMake installed and you have a CMakeLists.txt file. Building is very straightforward: call cmake, specifying that you want to use bcc64 or bcc32x as the C and C++ compiler.  That's it.  CMake automatically looks for the CMakeLists.txt file, and based on the compiler you specify knows if it's Win32 or Win64.

For example,

.
cmake -DCMAKE_C_COMPILER=bcc32x.exe -DCMAKE_CXX_COMPILER=bcc32x.exe -G Ninja

or,

.
cmake -DCMAKE_C_COMPILER=bcc64.exe -DCMAKE_CXX_COMPILER=bcc64.exe -G Ninja 

This will run CMake and use the Ninja generator, that is, generate the files that Ninja needs to build.  More on Ninja or using other generators in another post.  This process only need to be run once; you can run it again to update when your project changes, such as adding a new file. You do not need to run it every time to build, just once.

To build, call ninja:

.
ninja 

That's it.  Simple!  You will see ninja build for a short while, and find the executable in your base folder.

Using CMake for iOS and Android

More info about targeting iOS and Android in the next post, tomorrow! 

Overview

Using CMake is actually really simple.  Install it, make sure there is a CMakeLists.txt file, and call cmake.  Thereafter, build with a single word: ninja.

This lets you build third party C++ libraries easily: download and run cmake. Or, you can build your own projects if you write a CMakeLists.txt file.  Not only does this make it really easy to use other C++ libraries or code, but there are other benefits to using generators like ninja too (speed, for example.)  Compatibility and being able to integrate well with the wider C++ world is very important to us, making it easy for you to use libraries and code from elsewhere, and easy for people to use C++Builder.  We're very excited to support CMake -- and have much more to tell you!

  • More info about targeting iOS and Android in the next post, tomorrow!
  • More on Ninja, on Monday!

Don't forget to read what else is new in 10.2.3.


Read More

How to Transfer Images via DataSnap REST Part 3

C++ Builder 10.2.2: DataSet Mapping to JSON for JavaScript client support

$
0
0

Introduction

In C++Builder 10.2.2, Embarcadero has added a new component to the FireDAC BatchMove architecture, to support generating JSON data from database tables, in an easy and flexible way.

RAD Studio (Delphi and C++ Builder) has offered support for JSON in different ways and for a long time. From the JSON system unit (originally part of the DBX space) to the DataSnap table mapping (also via DBX) and to FireDAC tables to JSON mapping, there are many ways to interact with JSON data structures. As an enhancement, in the 10.2.2 release, we now added the capability to map a dataset to a custom JSON structure -- the FireDAC JSON support produces a FireDAC specific structure,metadataa data, and record status information.

Important to note is the C++ Builder 10.2.2 Enterprise and above edition includes a RAD Server free deployment license ($5000 value) to allow you to use RAD Server as your backend, and consider using Sencha ExtJS for your Web Clients!

Embarcadero’s first step in simplifying the use of Delphi and C++ Builder RAD Server as a backend for Sencha EXTJS JavaScript applications is offering a better way to produce the JSON data from a database table.

While we have built this support for the scenario of using RAD Server, FireDAC, and ExtJS, the same component and technology can be used for any web service architecture written in Delphi and C++Builder (even pure and simple WebBroker), any dataset other than FireDAC, and any JavaScript client. It is a completely open and a fairly flexible solution. But it certainly works great for our specific scenario of RAD Server backend and Sencha ExtJS Web Client!

A RAD Server package Application

1. Create a File | New Items| C++ Builder Projects | EMS Package

CBuilderEMSPackage

2. Select “Create a package with resource

CBuilderEMSPackageResource

3.  Resource name = employee    File type = select “Data Module

CBuilderResourceName

4. Select only the GET Endpoint.  For this example we will only show how to implement the GET endpoint to return data from a database table:

CBuilderGET

5. Click Finish.

6. On the generated Data Module form, add these 5 components from the tool palette:

FDConnection - to establish a connection to a DBMS and to manage associated datasets.

FDQuery - to execute SQL queries, browse the result sets, and edit the result set records.

FDBatchMove - to move data between text files and tables using datasets.

FDBAtchMoveDataSetReader - to define the source dataset from which to load information using TFDBatchMove.

FDBAtchMoveJSONWriter - is the base abstract class for all batch move JSON reader and JSON writer classes.

FDBatchMove

 Configure the components, like this:

      object EmployeeConnection: TFDConnection

    Params.Strings = (

      'ConnectionDef=EMPLOYEE')

  end

      object EmployeeTable: TFDQuery

    Connection = EmployeeConnection

    SQL.Strings = (

      'SELECT * FROM EMPLOYEE')

  end

      object FDBatchMoveDataSetReader1: TFDBatchMoveDataSetReader

     DataSet = EmployeeTable

  end

  object FDBatchMoveJSONWriter1: TFDBatchMoveJSONWriter

    DataDef.Fields = <>

  end

  object FDBatchMove1: TFDBatchMove

    Reader = FDBatchMoveDataSetReader1

    Writer = FDBatchMoveJSONWriter1

    Mappings = <>

    LogFileName = 'C:\Desktop\Data.log'

  end

With this configuration in place, all you need to do to produce the JSON is connect the output to the JSON writer and execute the batch move operation!

C++ Builder implementation

So far we added to an EMS package an "employee" resource, and we can implement its Get operation with the following C++ stream-based code:

#include <memory>  //for STL auto_ptr class

void TEmployeeResource1::Get(TEndpointContext* AContext, TEndpointRequest* ARequest, TEndpointResponse* AResponse)

{

 

   FDBatchMoveJSONWriter1->JsonWriter = AResponse->Body->JSONWriter;

   FDBatchMove1->Execute();

}

The above code is using the JSONWriter property. With this code the data is written directly to the HTML response, reducing the work and the memory consumption!

Start your C++ Builder RAD Server:

CBuilderRADServer

And call your REST Endpoint for the GET:  http://localhost:8080/employee.

You will get this JSON Array returned for the InterBase Employee table data:

CBuilderGETEndpointCall

This is great that C++ Builder 10.2.2 added this new DataSet Mapping to JSON for JavaScript client support!  And this is only a first initial step of the support that Embarcadero RAD Studio, C++ Builder, and Delphi is planning to simplify the use of C++ Builder and RAD Server as the backend for JavaScript and ExtJS applications. More support will be made available soon. Stay tuned!

[DownloadButton Product='RAD' Caption='Click here to get started with a Free Trial of RAD Studio ']

 


Read More

New in 10.2.3: FireMonkey UI Templates - Login Screens

$
0
0

Delphi, C++Builder and RAD Studio 10.2.3 include 18 new FireMonkey UI templates, designed to highlight FMX's multi-device capabilities, showcase best practices, and help new users get started quicker. They showcase UI paradigms that mobile application developers need in today’s applications. 

This blog post focuses on the three new login screen GUI templates, available for download in GetIt (Tools > GetIt Package Manager > Sample Applications). Each of the three templates uses one of the premium FireMonkey multi-platform styles.


Read More

RAD Server Support for Web Files in RAD Studio 10.2.3

$
0
0

The RAD Server (formerly EMS) platform is evolving to be a better backend for JavaScript applications, including of course those built with Ext JS. In the 10.2.2 release we improved support for returning JSON data based on the result of database queries, as covered in http://blog.marcocantu.com/blog/2017-december-dataset-mapping-json.html.

In RAD Studio 10.2.3, we have added to RAD Server the ability to act as a Web Server, with the support for mapping URLs to folders and returning the content of files like HTML, JS, CSS, graphic, and more. This is a handy feature when using the local development and debugging version, so you don't need to configure both the web service and a separate web server for development, testing and debugging. We do not recommend using this approach for deployment: in that case RAD Server is deployed as a Web Server (Apache or IIS) plugin and the Web Server would of course support file mapping.

How do you configure RAD Server to return files? There is a new section in the EMS.INI file (notice this is a global configuration, not per module) when you can add virtual folders:

[Server.PublicPaths] ;# Identify directories that contain public files, such as .html ;# ;# The following entries define two different virtual directories ("images" and "content") ;# that may be used to access static files. The "directory" value indicates the physical ;# location of the static files. The optional "default" value indicates a file ;# that will be dispatched by default when browsing to the root of the virtual directory. ;# The optional "mimes" value is an array of MIME file type masks. And optional "extensions" ;# value is an array of file extensions. Only these files will be accessible from this directory. Path1={"path": "images", "directory": "C:||web||images||", "default": "index.html", "mimes": ["image/*"]} Path2={"path": "content", "directory": "C:||web||content||", "default": "index.html", "extensions": ["js", "html", "css"]}

In this case I have two folders, one with images and one with HTML content, and also a default file with the URL refers to the folder as a whole. So I can now create a JavaScript application invoking a server method. To keep things simple, I've used a minimal jQuery application:

$(document).ready(function(){ $("button").click(function(){ $.ajax({url: "/xyz", success: function(result){ $("#div1").html(result); }}); }); });

RAD Server JS + Service

Get RAD Server Content

Result

When clicking on the button, the JS app will call the /xyz resource of the RAD Server project and display the result. This is the application in action in a browser (with the RAD Server log below):

Of course, our focus is to help build applications that use Ext JS as the client and RAD Server as the server. I'll make sure to follow uo with such a demo soon.


Read More

RAD Studio and Internet Message Format

$
0
0

Introduction

The RFC-2822 standard specifies a syntax for text messages that are sent between computer users, within the framework of "electronic mail" messages.  The RFC-2822 specifies lines should be no longer than 78 characters, and the MIME spec RFC-2045, says:

The encoded output stream must be represented in lines of no more than 76 characters each.  All line breaks or other characters not found in Table 1- The Base64 Alphabet must be ignored by decoding software.

 

RAD Studio and TNetEncoding.Base64.

RAD Studio (Delphi and C++ Builder) follows the RFC-2822 and RFC-2045 specs!

For example, given this Delphi code:

 procedure TForm55.Button1Click(Sender: TObject);
var
  S: string;
begin
  S := 'jfdlksjflkasjdlfow7r89fpsduf87s8fy4387rhfofldsajfhasddlsihjsldhjlsdhlfhjsdafhjsadh';
  Memo1.Text :=  TNetEncoding.Base64.EncodeBytesToString(TEncoding.GetEncoding('ISO-8859-1').GetBytes(S));
end;

TEncodingBase64

You will notice that this produces a #13#10 in the middle.

Delphi and/or C++ Builder is automatically wrapping at 76 characters per line (TBase64Encoding.kCharsPerLine.)  You can override this in one of the constructors and pass 0: TBase64Encoding.Create(0) where 0 means don't wrap lines.

Delphi and C++ Builder does this because it's a net encoding and base64 is used for representing binary in, eg, email; Recalling that the RFC-2822 specifies lines should be no longer than 78 characters and the MIME spec RFC-2045, and it says: “The encoded output stream must be represented in lines of no more than 76 characters each.  All line breaks or other characters not found in Table 1- The Base64 Alphabet must be ignored by decoding software.” 

We see that Delphi and C++ Builder matches the spec accurately!

This is completely valid.  RAD Studio (Delphi and/or C++ Builder) creates 100% valid MIME base64 encoded text! 

Compared to this corresponding .NET code, which (unlike Delphi or C++ Builder) does not put anything in the middle:

Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(Key1+ ":" + Secret1))

 

[DownloadButton Product='RAD' Caption='Start Your RAD Studio FREE Trial Today']


Read More
Viewing all 1683 articles
Browse latest View live


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>