[{"data":1,"prerenderedAt":5801},["ShallowReactive",2],{"\u002Fmodernising\u002Fwindows-on-arm":3,"all-content-pages":215},{"id":4,"title":5,"body":6,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":187,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":196,"extension":197,"isTrackOverview":198,"meta":199,"navigation":201,"order":202,"path":203,"personaTags":204,"routeGroup":207,"seo":208,"sourceDoc":209,"status":210,"stem":211,"summary":212,"urgencyHook":213,"__hash__":214},"content\u002Fmodernising\u002Fwindows-on-arm.md","Windows on Arm",{"type":7,"value":8,"toc":186},"minimark",[9,14,23,28,31,53,56,87,94,98,105,126,145,149,169,173,180],[10,11,13],"h1",{"id":12},"windows-on-arm-in-rad-studio","Windows on Arm in RAD Studio",[15,16,17,18,22],"p",{},"RAD Studio supports ",[19,20,21],"strong",{},"Windows on Arm (WoA)"," through Delphi's Arm64EC toolchain, giving teams a practical way to target modern ARM-based Windows devices without rewriting their applications.",[24,25,27],"h2",{"id":26},"why-woa-matters-beyond-the-compiler","Why WoA matters beyond the compiler",[15,29,30],{},"Windows on Arm is not just another target checkbox. It reflects a broader shift in enterprise endpoint strategy:",[32,33,34,41,47],"ul",{},[35,36,37,40],"li",{},[19,38,39],{},"Device strategy is changing",": procurement teams increasingly evaluate battery life, thermals, always-on connectivity, and AI-capable hardware classes.",[35,42,43,46],{},[19,44,45],{},"Mixed fleets are becoming normal",": IT teams are planning for x64 and Arm devices to coexist, especially during refresh cycles.",[35,48,49,52],{},[19,50,51],{},"Compatibility expectations are rising",": business users expect line-of-business apps to \"just work\" on whichever managed Windows device they receive.",[15,54,55],{},"For software teams, the practical implication is simple: if WoA readiness is postponed until a major rollout, timelines become constrained by dependency and packaging surprises. Starting validation early keeps the transition controlled, predictable, and low risk.",[57,58,59,64],"info",{},[15,60,61],{},[19,62,63],{},"Why this is important",[32,65,66,81,84],{},[35,67,68,69,72,73,76,77,80],{},"You can build for ",[19,70,71],{},"Win32",", ",[19,74,75],{},"Win64 (x86-64)",", and ",[19,78,79],{},"Win64 (Arm)"," from the same codebase.",[35,82,83],{},"Arm64EC supports a phased adoption path where mixed dependency scenarios are more manageable.",[35,85,86],{},"Native WoA builds help you align with new Windows device classes while keeping delivery risk low.",[88,89],"content-image",{"alt":90,"caption":91,"size":92,"src":93},"RAD Studio installer showing Windows on Arm as a target option","RAD Studio installer with Windows on Arm available as a platform option.","full","\u002Fimages\u002Fwindows-on-arm\u002Finstall_arm.webp",[24,95,97],{"id":96},"what-this-means-for-existing-projects","What this means for existing projects",[15,99,100,101,104],{},"For most teams, Windows on Arm is best handled as a ",[19,102,103],{},"progressive extension"," of modernisation work you are already doing:",[106,107,108,114,120],"ol",{},[35,109,110,113],{},[19,111,112],{},"Stabilize your baseline first"," (Unicode, 64-bit, data access, and third-party compatibility).",[35,115,116,119],{},[19,117,118],{},"Confirm package compatibility"," (runtime packages, third-party binaries, native bindings, installers).",[35,121,122,125],{},[19,123,124],{},"Add a WoA build target"," and include Arm devices in regression and deployment testing.",[127,128,129,134],"tip",{},[15,130,131],{},[19,132,133],{},"First validation pass",[32,135,136,139,142],{},[35,137,138],{},"Start with one representative VCL or FMX application and compile for the Arm target.",[35,140,141],{},"Focus first on external dependencies (DLLs, SDK wrappers, drivers, install\u002Fupdate tooling).",[35,143,144],{},"Validate startup time, key workflows, and memory profile on at least one real WoA device.",[24,146,148],{"id":147},"what-rad-studio-specifically-provides","What RAD Studio specifically provides",[32,150,151,157,163],{},[35,152,153,156],{},[19,154,155],{},"Delphi Arm64EC support in RAD Studio"," for native WoA executables.",[35,158,159,162],{},[19,160,161],{},"Incremental migration potential"," for teams that still depend on x64-oriented components.",[35,164,165,168],{},[19,166,167],{},"Existing project reuse",": many Win64 Delphi applications can be evaluated and moved forward with targeted validation instead of full redesign.",[24,170,172],{"id":171},"official-references","Official references",[174,175],"linkpreview",{"description":176,"icon":177,"title":178,"url":179},"RAD Studio Florence 13.1 introduces a new native target platform for Delphi: Windows on Arm.","doc","Native Delphi Arm64EC Toolchain","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FARM64EC",[174,181],{"description":182,"icon":183,"title":184,"url":185},"Embarcadero announcement blog for RAD Studio 13.1, including Windows on Arm positioning and upgrade context.","link","Announcing RAD Studio 13 Florence Update 1","https:\u002F\u002Fblogs.embarcadero.com\u002Fannouncing-the-availability-of-rad-studio-13-florence-update-1\u002F",{"title":187,"searchDepth":188,"depth":188,"links":189},"",2,[190,191,192,193],{"id":26,"depth":188,"text":27},{"id":96,"depth":188,"text":97},{"id":147,"depth":188,"text":148},{"id":171,"depth":188,"text":172},"Talk to a specialist",null,"RAD Studio supports Windows on Arm (WoA) through Delphi's Arm64EC toolchain, giving teams a practical way to target modern ARM-based Windows devices without rewriting their applications.","md",false,{"slug":200},"windows-on-arm",true,5,"\u002Fmodernising\u002Fwindows-on-arm",[205,206],"modern windows","post-unicode","modernising",{"title":5,"description":196},"journeys\u002Fwindows_on_arm.md","pending-review","modernising\u002Fwindows-on-arm","RAD Studio includes Windows on Arm support so teams can target new Windows device classes with native performance.","Enterprise Windows fleets are diversifying toward ARM-based devices; validating WoA now reduces future delivery and support risk.","NGf4-jXOugRfHpicmfuSWqQf9a2UAAy1ZoR7nuTIE0Q",[216,407,808,1224,1276,1568,1937,2053,2489,3595,3879,4298,4466,4498,5357,5606],{"id":217,"title":218,"body":219,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":395,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":227,"extension":197,"isTrackOverview":198,"meta":396,"navigation":201,"order":398,"path":399,"personaTags":400,"routeGroup":207,"seo":402,"sourceDoc":403,"status":210,"stem":404,"summary":405,"urgencyHook":187,"__hash__":406},"content\u002Fmodernising\u002Fadding-linux.md","Adding Linux Support",{"type":7,"value":220,"toc":389},[221,225,228,246,250,257,264,269,283,301,305,312,317,328,332,338,342,345,366,375,378],[10,222,224],{"id":223},"expand-your-code-base-with-linux-development-in-rad-studio","Expand Your Code Base with Linux Development in RAD Studio",[15,226,227],{},"Whether you're building robust server-side applications or designing desktop apps, RAD Studio lets Delphi developers target the Linux platform with the same tools they use for Windows. Here's how you can make the most of it:",[57,229,230,235],{},[15,231,232],{},[19,233,234],{},"Who this page is for",[32,236,237,240,243],{},[35,238,239],{},"Teams expanding backend\u002Fserver workloads beyond Windows-only hosting.",[35,241,242],{},"ISVs that need broader deployment options for customer environments.",[35,244,245],{},"Developers exploring Linux targets with existing Delphi codebases.",[24,247,249],{"id":248},"server-development-on-linux","Server Development on Linux",[15,251,252,253,256],{},"With the growing demand for scalable and secure server solutions, extending your applications to run on Linux servers is a strategic move. RAD Studio provides you with the tools needed to develop and deploy powerful server-side applications on Linux, ",[19,254,255],{},"leveraging the same code base you're already using for Windows",". This means you can maintain consistency, reduce duplication, and streamline your development process, all while expanding your market reach to include Linux-based environments.",[15,258,259,260,263],{},"The benefit of recompiling is ",[19,261,262],{},"speed and performance over scripted languages"," and lower code development and maintenance costs from a single code base. For many applications it can be as simple as adding a new Target Platform and recompiling!",[174,265],{"description":266,"icon":177,"title":267,"url":268},"Official documentation covering how to set up Linux targets, cross-compilation, and the PAServer deployment workflow.","Linux Application Development in RAD Studio","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FLinux_Application_Development",[270,271,272,280],"youtube",{},[15,273,274],{},[275,276,277],"a",{"href":277,"rel":278},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=BvBbLfdQnAY",[279],"nofollow",[15,281,282],{},"Linux Migration for Delphi Developers",[127,284,285,290],{},[15,286,287],{},[19,288,289],{},"First Linux milestone",[32,291,292,295,298],{},[35,293,294],{},"Start with one backend executable that has minimal platform-specific dependencies.",[35,296,297],{},"Recompile and validate deployment scripts on Linux early.",[35,299,300],{},"Add observability (logging\u002Fmetrics) before broad rollout to production workloads.",[24,302,304],{"id":303},"fmx-linux-for-desktop-applications","FMX Linux for Desktop Applications",[15,306,307,308,311],{},"If you're developing desktop applications, ",[19,309,310],{},"RAD Studio's FMX Linux support"," is a game-changer. FMX Linux is popular for Desktop and also Kiosk applications. By migrating to Linux, you can take advantage of its reliability and cost-effectiveness while maintaining the rich, responsive cross-platform user interfaces that FireMonkey (FMX) is known for. If you are not using FMX today, your VCL skills will feel immediately at home. Its foundation copies the VCL concepts, making it very familiar to existing developers wanting to ramp up to multi-platform UI development quickly.",[174,313],{"description":314,"icon":177,"title":315,"url":316},"FMXLinux provides capabilities for building GUI applications for Linux, extending RAD Studio’s (Delphi Edition) FireMonkey cross-platform framework.","FireMonkey for Linux","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FFireMonkey_for_Linux",[270,318,319,325],{},[15,320,321],{},[275,322,323],{"href":323,"rel":324},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=uotHK_UNINo",[279],[15,326,327],{},"How to create a real Linux app step by step guide",[24,329,331],{"id":330},"why-isvs-should-consider-linux","Why ISVs Should Consider Linux",[15,333,334,337],{},[19,335,336],{},"Independent Software Vendors (ISVs) can greatly benefit from adding Linux"," to their supported platforms. The demand for cross-platform solutions is higher than ever, and being able to deliver your software on both Windows and Linux opens up new revenue streams. RAD Studio simplifies this process by allowing you to write your code once and deploy it across multiple platforms with minimal changes.",[24,339,341],{"id":340},"cross-platform-development","Cross-Platform Development",[15,343,344],{},"RAD Studio's cross-platform libraries are designed to work consistently across Windows, Linux, macOS, and mobile platforms. By using these libraries, you can keep your applications behaving the same way and performing reliably, regardless of the target platform.",[15,346,347,348,353,354,358,359,362,363,365],{},"To make your migration even smoother, the RAD Studio RTL contains a number of ",[275,349,352],{"href":350,"rel":351},"https:\u002F\u002Fdocwiki.embarcadero.com\u002FLibraries\u002Fen\u002FMain_Page",[279],"cross-platform libraries",". Anything starting ",[355,356,357],"code",{},"System."," e.g. ",[355,360,361],{},"System.Classes"," is cross-platform. The same can be said for ",[355,364,357],{}," classes wherever possible. This approach minimizes the need for conditional defines and ensures that your code remains clean, maintainable, and compatible across both Windows and Linux.",[367,368,369],"warning",{},[15,370,371,374],{},[19,372,373],{},"Cross-platform caution","\nIf your code relies on inline assembly or Windows-only APIs in core modules, plan a small isolation\u002Frefactor pass before broad Linux rollout. Keeping platform-specific code at the edges reduces long-term maintenance cost.",[15,376,377],{},"By using RAD Studio's cross-platform capabilities, you can confidently extend your applications to include Linux, reach more users, and keep your software relevant on the platforms your customers expect.",[57,379,380],{},[15,381,382,383,388],{},"Don't forget that ",[275,384,387],{"href":385,"rel":386},"https:\u002F\u002Fwww.embarcadero.com\u002Fproducts\u002Finterbase",[279],"InterBase",", Embarcadero's robust and scalable database solution, is fully cross-platform, offering the same powerful features on Windows, Linux, macOS, iOS and Android. This makes it easier than ever to manage your data across all your applications, regardless of the platform.",{"title":187,"searchDepth":188,"depth":188,"links":390},[391,392,393,394],{"id":248,"depth":188,"text":249},{"id":303,"depth":188,"text":304},{"id":330,"depth":188,"text":331},{"id":340,"depth":188,"text":341},"See Enterprise Edition features",{"slug":397},"adding-linux",7,"\u002Fmodernising\u002Fadding-linux",[401,205],"rest\u002Fapi",{"title":218,"description":227},"journeys\u002Fadding_linux.md","modernising\u002Fadding-linux","Why Linux matters as the de facto standard for server\u002Fbackend, and how to reach it by simply adding a new target platform.","gBS6GqsWujEkIHJCg_A8OQImRic6KAdmC85rpFmlSGQ",{"id":408,"title":409,"body":410,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":187,"ctaSecondaryLink":195,"ctaSecondaryType":187,"description":417,"extension":197,"isTrackOverview":198,"meta":798,"navigation":201,"order":800,"path":801,"personaTags":802,"routeGroup":207,"seo":803,"sourceDoc":804,"status":210,"stem":805,"summary":806,"urgencyHook":187,"__hash__":807},"content\u002Fmodernising\u002Fai-assisted-development.md","AI-Assisted Development & AI Features",{"type":7,"value":411,"toc":785},[412,415,418,421,437,440,445,462,466,469,524,553,558,561,582,585,590,594,604,608,611,630,636,640,643,669,674,679,683,686,697,700,720,726,730,737,740,751,759,763,767,778],[10,413,409],{"id":414},"ai-assisted-development-ai-features",[15,416,417],{},"AI has moved from a curiosity to a competitive advantage. Teams that use it effectively in their tools and products are shipping faster, fixing issues earlier, and offering smarter features to their users.",[15,419,420],{},"With recent RAD Studio releases, you do not need to bolt on external tools or change languages. You can:",[32,422,423,430],{},[35,424,425,426,429],{},"Use ",[19,427,428],{},"Smart CodeInsight"," in the IDE to accelerate day‑to‑day development.",[35,431,432,433,436],{},"Use the ",[19,434,435],{},"SmartCore AI Components Pack"," to add AI features directly into existing VCL and FMX applications.",[15,438,439],{},"Staying on an older RAD Studio version increasingly means missing out on this new baseline of productivity and in‑product intelligence.",[88,441],{"alt":442,"caption":443,"size":92,"src":444},"AI-assisted development in RAD Studio","Smart CodeInsight chat window integrated in the IDE.","ai-assisted-development\u002Fsmartci.webp",[57,446,447,451],{},[15,448,449],{},[19,450,234],{},[32,452,453,456,459],{},[35,454,455],{},"Teams on older RAD Studio versions evaluating whether AI features justify an upgrade.",[35,457,458],{},"Product owners who want to add “smart” capabilities (search, recommendations, chat) without a full rewrite.",[35,460,461],{},"Developers who want AI assistance but must retain control over privacy, models, and costs.",[24,463,465],{"id":464},"_1-smarter-development-in-the-ide-with-smart-codeinsight","1) Smarter development in the IDE with Smart CodeInsight",[15,467,468],{},"Smart CodeInsight integrates modern LLM engines directly into the IDE:",[32,470,471,477,483,506],{},[35,472,473,476],{},[19,474,475],{},"Multiple providers, one unified experience","\nConfigure OpenAI, Gemini, Claude, or a local Ollama instance, and switch between them from the same chat and editor menus.",[35,478,479,482],{},[19,480,481],{},"AI chat window for Delphi and C++Builder questions","\nUse a dockable chat panel to ask about APIs, patterns, or code snippets. Markdown rendering makes responses easier to read and act on.",[35,484,485,488,489],{},[19,486,487],{},"Context-aware editor commands","\nRight from the editor, send the selected code to AI to:",[32,490,491,494,497,500,503],{},[35,492,493],{},"find bugs or edge cases",[35,495,496],{},"explain legacy code you did not write",[35,498,499],{},"add comments or unit tests",[35,501,502],{},"optimize or complete code",[35,504,505],{},"convert between Delphi and C++Builder",[35,507,508,511,512,515,516,519,520,523],{},[19,509,510],{},"Fast access to the right units","\nUse the ",[19,513,514],{},"Find Unit\u002FHeader"," command to locate which unit declares a symbol and quickly update your ",[355,517,518],{},"uses"," or ",[355,521,522],{},"#include"," list, especially helpful on large legacy codebases.",[127,525,526,531],{},[15,527,528],{},[19,529,530],{},"First Smart CodeInsight milestone",[32,532,533,536,550],{},[35,534,535],{},"Enable Smart CodeInsight in a non‑critical project.",[35,537,538,539,72,543,72,546,549],{},"Pilot two or three commands (for example: ",[540,541,542],"em",{},"Explain Code",[540,544,545],{},"Find Bugs",[540,547,548],{},"Add Comment",") on complex legacy units.",[35,551,552],{},"Measure how much quicker new team members understand and safely refactor older code.",[554,555,557],"h3",{"id":556},"control-privacy-and-model-choice","Control, privacy, and model choice",[15,559,560],{},"Modern AI tools are powerful but must be adopted on your terms. Smart CodeInsight was designed with that in mind:",[32,562,563,566,569,572,579],{},[35,564,565],{},"The entire feature can be turned off globally with one setting.",[35,567,568],{},"Each engine (OpenAI, Gemini, Claude, Ollama) can be enabled or disabled individually.",[35,570,571],{},"API keys are stored in encrypted form; you choose which endpoints and models to use.",[35,573,574,575,578],{},"You can run ",[19,576,577],{},"Ollama"," locally (including via Docker), keeping prompts and code entirely on your own hardware.",[35,580,581],{},"The ToolsAPI is open, so you can build your own AI engine plugins or custom IDE features when needed.",[15,583,584],{},"For teams on older versions of RAD Studio, this level of in‑IDE AI control simply does not exist. Staying behind means developers are more likely to copy‑paste code into external tools, with less governance and more friction.",[174,586],{"description":587,"icon":177,"title":588,"url":589},"Official overview of Smart CodeInsight architecture, providers, setup, and usage in the RAD Studio IDE.","Smart CodeInsight (DocWiki)","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FSmart_CodeInsight",[24,591,593],{"id":592},"_2-adding-ai-features-into-your-existing-applications","2) Adding AI features into your existing applications",[15,595,596,597,599,600,603],{},"RAD Studio ",[19,598,435],{},", available via GetIt, provides a set of non‑visual components you can drop into existing Delphi and C++Builder applications to ",[19,601,602],{},"add AI functionality without rewriting your architecture",".",[554,605,607],{"id":606},"a-familiar-pattern-ai-like-firedac-for-data","A familiar pattern: AI like FireDAC for data",[15,609,610],{},"SmartCore AI mirrors the pattern developers already know from FireDAC:",[32,612,613,620,627],{},[35,614,615,616,619],{},"A central ",[355,617,618],{},"TAIConnection"," component, configured once with the chosen AI provider, model, and credentials.",[35,621,622,623,626],{},"Pluggable drivers for ",[19,624,625],{},"OpenAI, Gemini, Claude, and Ollama",", with the option to create your own.",[35,628,629],{},"Specific request components (for text, images, and structured data) that you can wire to UI controls and events.",[15,631,632,633,603],{},"If your team knows how to configure a database connection and execute queries, ",[19,634,635],{},"the learning curve to call AI services is very small",[554,637,639],{"id":638},"highvalue-use-cases-you-can-ship-quickly","High‑value use cases you can ship quickly",[15,641,642],{},"With SmartCore AI components, you can incrementally add features like:",[32,644,645,651,657,663],{},[35,646,647,650],{},[19,648,649],{},"In‑product content creation","\nHelp users draft emails, proposals, or descriptions from within your existing application.",[35,652,653,656],{},[19,654,655],{},"Localization and on‑the‑fly translation","\nTranslate UI text, content, or reports at runtime, making your product feel native in more markets without duplicating forms.",[35,658,659,662],{},[19,660,661],{},"Smart insights and recommendations","\nGenerate explanations, summaries, or “next best action” suggestions on top of your current data, using JSON‑structured responses for safe integration.",[35,664,665,668],{},[19,666,667],{},"Embedded chatbots and assistants","\nAdd a contextual help\u002Fchat pane that understands your app’s domain and data, instead of sending users to external web documentation.",[174,670],{"description":671,"icon":177,"title":672,"url":673},"Official documentation for SmartCore AI components, including setup, component references, and usage guidance.","SmartCore AI Component Pack (DocWiki)","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FSmartCore_AI_Component_Pack",[174,675],{"description":676,"icon":183,"title":677,"url":678},"Official demo projects for text, image, and structured data workflows using SmartCore AI components.","SmartCore AI demos for RAD Studio","https:\u002F\u002Fgithub.com\u002FEmbarcadero\u002FRADStudio13Demos\u002Ftree\u002Fmain\u002FObject%20Pascal\u002FSmartCoreAI",[24,680,682],{"id":681},"_3-why-upgrading-matters-for-ai-adoption","3) Why upgrading matters for AI adoption",[15,684,685],{},"Older RAD Studio versions can call web APIs, but they lack:",[32,687,688,691,694],{},[35,689,690],{},"Integrated, configurable AI chat and editor commands in the IDE.",[35,692,693],{},"A supported, component‑based AI architecture (AI connections and drivers) for applications.",[35,695,696],{},"Official samples, documentation, and GetIt packages tailored to modern AI workflows.",[15,698,699],{},"Upgrading to the current RAD Studio line unlocks:",[32,701,702,708,714],{},[35,703,704,707],{},[19,705,706],{},"Productivity gains today"," through Smart CodeInsight, making complex codebases easier to evolve and onboard new developers onto.",[35,709,710,713],{},[19,711,712],{},"New product features"," through SmartCore AI components, helping your applications stand out in crowded markets.",[35,715,716,719],{},[19,717,718],{},"An extensible foundation"," so you can plug in new AI providers and models as the ecosystem evolves, without redesigning your integration each time.",[15,721,722,725],{},[19,723,724],{},"Teams that delay upgrading risk watching competitors release AI‑powered features first",", even when those competitors have less mature core code. Moving to recent versions of RAD Studio lets you leverage your existing, battle-tested Delphi and C++Builder code while still delivering a modern, AI-augmented experience.",[24,727,729],{"id":728},"_4-rad-ai-companion-for-documentation-first-assistance","4) RAD AI Companion for documentation-first assistance",[15,731,732,733,736],{},"Alongside IDE and in-app AI features, Embarcadero provides ",[19,734,735],{},"RAD AI Companion",", a web-based assistant focused on official RAD Studio, Delphi, and C++Builder documentation.",[15,738,739],{},"This is especially useful for:",[32,741,742,745,748],{},[35,743,744],{},"New team members ramping up on the RAD ecosystem.",[35,746,747],{},"Quickly finding documentation-backed answers and examples.",[35,749,750],{},"Getting first-pass troubleshooting ideas before deeper debugging in code.",[367,752,753],{},[15,754,755,758],{},[19,756,757],{},"Use with normal engineering checks","\nTreat answers as guidance and validate them in your project context, especially for production changes.",[174,760],{"description":761,"icon":183,"title":735,"url":762},"AI-powered documentation assistant for Delphi, C++Builder, and RAD Studio questions, examples, and guidance.","https:\u002F\u002Fwww.embarcadero.com\u002Fradaicompanion",[24,764,766],{"id":765},"webinars-series-about-ai","Webinars Series about AI",[270,768,769,775],{},[15,770,771],{},[275,772,773],{"href":773,"rel":774},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=3er9XvQZY78&list=PLwUPJvR9mZHguohCODAwp6rDVT91gMU07",[279],[15,776,777],{},"RAD Studio AI webinar playlist covering Smart CodeInsight and SmartCore workflows.",[15,779,780,781,784],{},"If you would like help mapping which AI features fit your product roadmap and which RAD Studio version you should target, use the ",[19,782,783],{},"“Talk to a specialist”"," button on this page to discuss a tailored upgrade and adoption plan.",{"title":187,"searchDepth":188,"depth":188,"links":786},[787,791,795,796,797],{"id":464,"depth":188,"text":465,"children":788},[789],{"id":556,"depth":790,"text":557},3,{"id":592,"depth":188,"text":593,"children":792},[793,794],{"id":606,"depth":790,"text":607},{"id":638,"depth":790,"text":639},{"id":681,"depth":188,"text":682},{"id":728,"depth":188,"text":729},{"id":765,"depth":188,"text":766},{"slug":799},"ai-assisted-development",6,"\u002Fmodernising\u002Fai-assisted-development",[206,205,401],{"title":409,"description":417},"journeys\u002Fai_assisted_development.md","modernising\u002Fai-assisted-development","Use AI tooling in the IDE to speed up development, and add AI capabilities to existing applications with SmartCore AI Components.","8SFo__be4ULC58OiN8aahI7IaMtysSjzlQD8Z77G3QQ",{"id":809,"title":810,"body":811,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":187,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":1212,"extension":197,"isTrackOverview":198,"meta":1213,"navigation":201,"order":1215,"path":1216,"personaTags":1217,"routeGroup":207,"seo":1219,"sourceDoc":1220,"status":210,"stem":1221,"summary":1222,"urgencyHook":187,"__hash__":1223},"content\u002Fmodernising\u002Fgoing-mobile.md","Building Mobile Appications (FMX)",{"type":7,"value":812,"toc":1194},[813,817,824,827,836,853,864,868,882,903,911,915,918,922,929,934,951,955,965,970,981,985,988,992,995,999,1006,1011,1015,1018,1021,1025,1032,1037,1062,1067,1085,1089,1092,1096,1099,1130,1134,1141,1152,1166,1174,1185,1189],[10,814,816],{"id":815},"going-mobile-with-firemonkey-fmx","Going Mobile with FireMonkey (FMX)",[15,818,819,820,823],{},"With ",[19,821,822],{},"over 73% of internet users turning to their mobile devices first",", depending exclusively on a desktop-only application model limits the usefulness and reach of your software.",[15,825,826],{},"If you are a VCL desktop developer tasked with building a mobile application, the learning curve typically means abandoning your native language and diving into entirely disparate ecosystems (like Swift for iOS, Kotlin for Android, or web-based wrappers).",[15,828,819,829,832,833,603],{},[19,830,831],{},"FireMonkey (FMX)"," in RAD Studio, you do not need to replace your VCL applications. Instead, FMX acts as an addition to your toolkit. You can use the same Delphi and C++Builder business logic you have refined over decades and ",[19,834,835],{},"compile it natively to iOS, Android, Windows, macOS, and Linux from a single codebase",[57,837,838,842],{},[15,839,840],{},[19,841,234],{},[32,843,844,847,850],{},[35,845,846],{},"VCL teams adding iOS\u002FAndroid delivery without rewriting in another language.",[35,848,849],{},"Teams that already modernized core upgrade blockers (Unicode, 64-bit, data layer).",[35,851,852],{},"Product owners needing faster path-to-store while preserving existing business logic.",[270,854,855,861],{},[15,856,857],{},[275,858,859],{"href":859,"rel":860},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=KnZHtCFZO_Q",[279],[15,862,863],{},"How to create a real Android app step by step guide",[24,865,867],{"id":866},"most-of-your-code-is-already-cross-platform","Most of your code is already cross-platform",[15,869,870,871,519,874,877,878,881],{},"The shared codebase between VCL and FMX goes far deeper than just matching visual controls like ",[355,872,873],{},"TLabel",[355,875,876],{},"TEdit",". RAD Studio ships with a rich set of ",[19,879,880],{},"cross-platform namespaces"," that work identically across Windows, macOS, iOS, Android, and Linux with no conditional compilation needed.",[15,883,884,885,888,889,72,892,72,895,898,899,902],{},"For example, ",[355,886,887],{},"System.IOUtils"," gives you a unified API for file and path operations on every target platform. The same applies to ",[355,890,891],{},"System.Threading",[355,893,894],{},"System.Net.HttpClient",[355,896,897],{},"System.JSON",", and many more units in the RTL. Thanks to the strong component model and OOP design of Delphi and C++Builder, the common frameworks that underpin the visual layer are ",[540,900,901],{},"already"," multi-platform.",[127,904,905],{},[15,906,907,908,603],{},"A large portion of your existing business logic, data access, and utility code can move to mobile with little or no modification. You are not rewriting, you are ",[19,909,910],{},"recompiling",[24,912,914],{"id":913},"fmx-vs-vcl-the-same-but-different","FMX vs VCL: The Same, But Different",[15,916,917],{},"FMX is designed to feel welcoming and immediately familiar to any VCL developer, while acknowledging that rendering across different operating systems requires a slightly different approach.",[554,919,921],{"id":920},"layouts-vs-panels","Layouts vs. Panels",[15,923,924,925,928],{},"In the VCL, you are likely used to dropping a ",[355,926,927],{},"TPanel",", setting its alignment, and pinning controls inside it. Mobile devices rotate dynamically and come in hundreds of drastically different aspect ratios.",[174,930],{"description":931,"icon":177,"title":932,"url":933},"The FireMonkey layouts extend the functionality of TControl to control the arrangement, sizing, and scaling of their child controls, and offer the possibility to manipulate a group of controls as a whole.","FireMonkey Layouts Strategies","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FFireMonkey_Layouts_Strategies",[15,935,936,937,940,941,72,944,72,947,950],{},"In FMX, you embrace ",[19,938,939],{},"Layouts"," (",[355,942,943],{},"TLayout",[355,945,946],{},"TScaledLayout",[355,948,949],{},"TFlowLayout","). Unlike Panels, Layouts are lightweight, non-visual containers purely designed to orchestrate how controls flex, scale, and align fluidly based on the screen real estate of the device currently running the app.",[554,952,954],{"id":953},"visual-livebindings","Visual LiveBindings",[15,956,957,958,961,962,964],{},"Because mobile architectures strictly decouple data from the UI, classical data-aware controls (like ",[355,959,960],{},"TDBEdit",") don't exist in FMX. Instead, you use ",[19,963,954],{},", an abstraction layer that allows you to visually map properties from any data source (a REST payload, an object, a database field) to any property of any UI control with zero code required.",[174,966],{"description":967,"icon":177,"title":968,"url":969},"LiveBindings is an expression-based framework, which means it uses bindings expressions to bind objects to other objects or to dataset fields.","LiveBindings in RAD Studio","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FLiveBindings_in_RAD_Studio",[270,971,972,978],{},[15,973,974],{},[275,975,976],{"href":976,"rel":977},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=SogtUeGKm4s",[279],[15,979,980],{},"Convert your VCL Database Application to Mobile & Multiplatform",[24,982,984],{"id":983},"developing-for-the-mobile-paradigm","Developing for the Mobile Paradigm",[15,986,987],{},"Developing for mobile requires thinking differently than traditional Windows desktop development. Applications live in a sandboxed, low-power environment.",[554,989,991],{"id":990},"_1-the-single-screen-lifecycle","1. The Single Screen Lifecycle",[15,993,994],{},"Unlike desktop applications with floating MDI child windows or multi-monitor environments, mobile applications dominate a single screen. You must design fluid UX paths utilizing slide-in panes, tabbed views, and back-button navigations. FMX provides native mobile controls to adhere natively to iOS and Android design guidelines.",[554,996,998],{"id":997},"_2-permissions-and-manifests","2. Permissions and Manifests",[15,1000,1001,1002,1005],{},"Mobile operating systems strictly lock down hardware access. If your app needs the camera, GPS, or local storage, you cannot simply call the API. FMX abstracts this complexity through ",[19,1003,1004],{},"Platform Services"," and allows you to easily configure App Manifests directly within the IDE, requesting secure permission natively from the user exactly when required.",[174,1007],{"description":1008,"icon":177,"title":1009,"url":1010},"How to use and configure specific permissions for an Android Application.","Uses Permissions","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FUses_Permissions",[554,1012,1014],{"id":1013},"_3-file-security-and-app-store-deployment","3. File Security and App Store Deployment",[15,1016,1017],{},"Your app is locked to its own secure container. FMX simplifies deployment, allowing you to bundle local databases and assets directly into the application payload securely.",[15,1019,1020],{},"RAD Studio handles the complex signing, provisioning, and compilation steps required to generate the final binary payloads directly suitable for Google Play, Apple App Store and Windows Store.",[554,1022,1024],{"id":1023},"_4-debugging-on-real-hardware","4. Debugging on real hardware",[15,1026,1027,1028,1031],{},"Mobile debugging uses RAD Studio’s ",[19,1029,1030],{},"integrated multi-device debugger",": you run from the IDE, set breakpoints, and step through code while the app executes on a connected device or emulator. Exactly the same workflow you are used to on Windows.",[174,1033],{"description":1034,"icon":177,"title":1035,"url":1036},"How to debug multi-platform applications from the IDE.","Debugging Multi-Device Applications","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FDebugging_Multi-Device_Applications",[15,1038,1039,1042,1043,1046,1047,519,1050,1053,1054,1057,1058,1061],{},[19,1040,1041],{},"PAServer"," (Platform Assistant) allows running and debuging on ",[19,1044,1045],{},"remote machines",", most often on ",[19,1048,1049],{},"Linux",[19,1051,1052],{},"Mac"," on your network for iOS workflows (and related SDK deployment) so the IDE can deploy, debug, and copy files to that host. ",[19,1055,1056],{},"Android"," targets typically connect from your development PC ",[19,1059,1060],{},"without"," Platform Assistant.",[174,1063],{"description":1064,"icon":177,"title":1065,"url":1066},"Install the Platform Assistant on a remote system, in the same network as your development system, to let RAD Studio interact with that remote system.","PAServer, the Platform Assistant Server Application","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FPAServer,_the_Platform_Assistant_Server_Application",[127,1068,1069,1074],{},[15,1070,1071],{},[19,1072,1073],{},"First mobile milestone",[32,1075,1076,1079,1082],{},[35,1077,1078],{},"Build one focused user flow first (for example: sign-in, list, detail, submit).",[35,1080,1081],{},"Validate that flow on real devices early with the IDE debugger before scaling to full app scope.",[35,1083,1084],{},"Keep UI and data concerns separated so you can iterate mobile UX without destabilizing business rules.",[24,1086,1088],{"id":1087},"data-connectivity-on-mobile-devices","Data Connectivity on Mobile Devices",[15,1090,1091],{},"The most critical architectural shift when moving a legacy application to mobile involves how data is handled.",[554,1093,1095],{"id":1094},"local-data-accesing-embbeded-dbs-with-firedac","Local Data - Accesing embbeded DBs with FireDAC",[15,1097,1098],{},"If your app needs to function offline or cache data, FMX and FireDAC support deploying and managing local, highly optimized for IBToGo or SQLite databases natively on both iOS and Android.",[57,1100,1101],{},[15,1102,1103,1110,1111,1114,1115,1118,1119,1122,1123,603],{},[275,1104,1107],{"href":1105,"rel":1106},"https:\u002F\u002Fwww.embarcadero.com\u002Fproducts\u002Finterbase\u002Ftogo\u002Fsubscription-license",[279],[19,1108,1109],{},"IBToGo"," is a zero-administration, ",[19,1112,1113],{},"embedded SQL database"," that provides a ",[19,1116,1117],{},"multi-platform"," solution featuring ",[19,1120,1121],{},"robust encryption"," at rest for secure data storage on any device and incremental syncronization using ",[275,1124,1127],{"href":1125,"rel":1126},"https:\u002F\u002Fwww.embarcadero.com\u002Fproducts\u002Finterbase\u002Ffeatures\u002Freplication",[279],[19,1128,1129],{},"ChangeViews",[554,1131,1133],{"id":1132},"remote-data-rest","Remote Data (REST)",[15,1135,1136,1137,1140],{},"On desktop networks, maintaining a persistent, open TCP\u002FIP connection directly to an SQL database (like Interbase, SQL Server or Oracle) is standard practice. ",[19,1138,1139],{},"On a mobile device, this is an anti-pattern."," Mobile radios drop connections on cellular networks constantly, killing persistent TCP sockets and draining battery life.",[15,1142,1143,1144,1147,1148,1151],{},"To access enterprise data securely on mobile, you ",[540,1145,1146],{},"must"," ",[19,1149,1150],{},"transition to a stateless architecture",". Your mobile FMX application should communicate via HTTP\u002FHTTPS to a middle-tier REST server.",[1153,1154,1155],"blockquote",{},[15,1156,1157,1160,1161,1165],{},[19,1158,1159],{},"Crucial Tooling:"," To securely expose your existing legacy database directly to a mobile app via REST API, explore the path outlined in our ",[275,1162,1164],{"href":1163},"\u002Fmodernising\u002Fmulti-tier","Multi-Tier \u002F RESTful APIs"," module. RAD Server is specifically designed to handle this exact scenario efficiently.",[367,1167,1168],{},[15,1169,1170,1173],{},[19,1171,1172],{},"Avoid direct DB connections from mobile clients","\nTreat direct database connectivity from mobile devices as a temporary workaround only. A REST middle tier gives you better security boundaries, token-based auth, retry behaviour, and cleaner versioning over time.",[270,1175,1176,1182],{},[15,1177,1178],{},[275,1179,1180],{"href":1180,"rel":1181},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=JmOheeX1bIg",[279],[15,1183,1184],{},"Multi Platform Explorations using Delphi, FMX, Feeds, REST and More",[24,1186,1188],{"id":1187},"firemonkey-mobile-development-resources","FireMonkey Mobile Development Resources",[174,1190],{"description":1191,"icon":177,"title":1192,"url":1193},"The official introduction to FMX, covering project setup, layouts, and deploying to mobile and desktop targets.","FireMonkey Quick Start Guide","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FFireMonkey_Quick_Start_Guide_-_Introduction",{"title":187,"searchDepth":188,"depth":188,"links":1195},[1196,1197,1201,1207,1211],{"id":866,"depth":188,"text":867},{"id":913,"depth":188,"text":914,"children":1198},[1199,1200],{"id":920,"depth":790,"text":921},{"id":953,"depth":790,"text":954},{"id":983,"depth":188,"text":984,"children":1202},[1203,1204,1205,1206],{"id":990,"depth":790,"text":991},{"id":997,"depth":790,"text":998},{"id":1013,"depth":790,"text":1014},{"id":1023,"depth":790,"text":1024},{"id":1087,"depth":188,"text":1088,"children":1208},[1209,1210],{"id":1094,"depth":790,"text":1095},{"id":1132,"depth":790,"text":1133},{"id":1187,"depth":188,"text":1188},"With over 73% of internet users turning to their mobile devices first, depending exclusively on a desktop-only application model limits the usefulness and reach of your software.",{"slug":1214},"going-mobile",4,"\u002Fmodernising\u002Fgoing-mobile",[1218,206],"mobile dev",{"title":810,"description":1212},"journeys\u002Fgoing_mobile.md","modernising\u002Fgoing-mobile","Use your existing Delphi skills to deploy native apps to iOS and Android from a single FireMonkey (FMX) codebase.","Fw-JW0zySXfKJ-DTGXHVQa1G2fQKcbOWbuxOpIln-0k",{"id":1225,"title":1226,"body":1227,"ctaPrimary":1267,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":1268,"ctaSecondaryLink":195,"ctaSecondaryType":1269,"description":1235,"extension":197,"isTrackOverview":201,"meta":1270,"navigation":201,"order":195,"path":1271,"personaTags":195,"routeGroup":207,"seo":1272,"sourceDoc":195,"status":210,"stem":1273,"summary":1274,"urgencyHook":195,"__hash__":1275},"content\u002Fmodernising\u002Findex.md","The Modernising Track",{"type":7,"value":1228,"toc":1265},[1229,1233,1236,1243,1246,1257],[10,1230,1232],{"id":1231},"expand-your-applications-horizons","Expand Your Application's Horizons",[15,1234,1235],{},"Once your core codebase compiles warning-free in the latest RAD Studio release, you are in a prime position to extract massive new value from your intellectual property.",[15,1237,1238,1239,1242],{},"The Modernising Track is aspirational. It answers the question: ",[540,1240,1241],{},"What can my code do now that it couldn't do before?"," You do not need to rewrite your application in a different language to achieve modern, cross-platform, enterprise-scale functionality.",[15,1244,1245],{},"For many teams on older RAD Studio versions, the most commercially relevant conversations now center on three themes:",[32,1247,1248,1251,1254],{},[35,1249,1250],{},"adding AI-assisted development workflows and AI-powered application features",[35,1252,1253],{},"delivering modern web experiences without rewriting proven backend logic",[35,1255,1256],{},"preparing Windows applications for newer device classes, including Arm-based hardware",[1153,1258,1259],{},[15,1260,1261,1264],{},[19,1262,1263],{},"Need guidance?"," Our pre-sales engineers can evaluate your specific architecture and help you chart the most efficient modernisation path.",{"title":187,"searchDepth":188,"depth":188,"links":1266},[],"Request a modernisation demo","Start a free RAD Studio trial","trial",{},"\u002Fmodernising",{"title":1226,"description":1235},"modernising\u002Findex","Add new capabilities, reach more users, and deliver modern user experiences from your existing VCL architecture.","NJh8tGMlwtcfO2gQCgzLGBNi2x8nBgpPJIbOM9XhU84",{"id":1277,"title":1164,"body":1278,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":1558,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":1559,"extension":197,"isTrackOverview":198,"meta":1560,"navigation":201,"order":188,"path":1163,"personaTags":1562,"routeGroup":207,"seo":1563,"sourceDoc":1564,"status":210,"stem":1565,"summary":1566,"urgencyHook":187,"__hash__":1567},"content\u002Fmodernising\u002Fmulti-tier.md",{"type":7,"value":1279,"toc":1547},[1280,1284,1290,1297,1314,1319,1323,1326,1330,1336,1340,1360,1364,1390,1394,1401,1404,1425,1430,1435,1441,1446,1454,1468,1472,1498,1502,1505,1533,1537],[10,1281,1283],{"id":1282},"multi-tier-development-using-rad-server","Multi-Tier Development Using RAD Server",[15,1285,1286,1289],{},[19,1287,1288],{},"Multi-tier architecture"," (also known as n-tier architecture) separates an application into distinct layers, typically including the presentation, business logic, and data access layers. This design enhances scalability, maintainability, and flexibility, making it ideal for complex applications.",[15,1291,1292,1293,1296],{},"N-tier architecture is ideal for remote and mobile applications as ",[19,1294,1295],{},"it removes the reliance on permanent connections on a local network",". By using RESTful APIs in the business logic layer, remote clients can interact with server-side resources efficiently over HTTP. This setup allows for seamless integration across diverse platforms and devices, ensures secure and efficient communication, and enables independent scaling of different layers.",[57,1298,1299,1303],{},[15,1300,1301],{},[19,1302,234],{},[32,1304,1305,1308,1311],{},[35,1306,1307],{},"Teams that need to expose existing Delphi\u002FC++Builder logic to mobile, web, or remote clients.",[35,1309,1310],{},"Architects moving from monolithic desktop\u002Fdata-coupled systems toward service boundaries.",[35,1312,1313],{},"Teams that want to modernize incrementally without a full rewrite.",[88,1315],{"alt":1316,"caption":1317,"size":92,"src":1318},"Multi-tier architecture with RAD Server","Diagram showing desktop, mobile, and web clients connecting to Delphi business logic through RAD Server APIs.","multi-tier\u002Fmulti-tier-screenshot.png",[24,1320,1322],{"id":1321},"getting-more-value-from-existing-delphicbuilder-code","Getting More Value from Existing Delphi\u002FC++Builder Code",[15,1324,1325],{},"As a RAD Studio developer, you’ve invested significant time and resources into business logic in Delphi or C++Builder. RAD Server helps you keep that investment by bridging your core logic to mobile, web, and remote clients. It transforms your code into versatile APIs, making your services available to any client or team, regardless of their development stack.",[24,1327,1329],{"id":1328},"seamless-integration-with-existing-code","Seamless Integration with Existing Code",[15,1331,1332,1335],{},[19,1333,1334],{},"RAD Server"," lets you expose existing business logic as services without large rewrites. You preserve proven code, reduce duplicate implementation work, and deliver new capabilities faster.",[554,1337,1339],{"id":1338},"typical-tier-responsibilities","Typical Tier Responsibilities",[32,1341,1342,1348,1354],{},[35,1343,1344,1347],{},[19,1345,1346],{},"Presentation layer",": Web, desktop, or mobile clients that call APIs.",[35,1349,1350,1353],{},[19,1351,1352],{},"Business logic layer",": RAD Server modules that apply rules and orchestrate workflows.",[35,1355,1356,1359],{},[19,1357,1358],{},"Data access layer",": Data retrieval and persistence behind service boundaries.",[554,1361,1363],{"id":1362},"key-benefits-of-rad-server-for-existing-code","Key Benefits of RAD Server for Existing Code:",[32,1365,1366,1372,1378,1384],{},[35,1367,1368,1371],{},[19,1369,1370],{},"API Exposure",": RAD Server allows you to expose your existing business logic as RESTful APIs. This enables remote clients, web applications, and mobile apps to interact with your logic from most programming languages without altering the core code.",[35,1373,1374,1377],{},[19,1375,1376],{},"Extended Reach",": With RESTful APIs, your existing codebase can now serve diverse clients, including web and mobile applications. This capability transforms your single-platform solution into a versatile, multi-platform offering, enhancing your application’s value and accessibility.",[35,1379,1380,1383],{},[19,1381,1382],{},"Cross-Platform Deployment",": RAD Server supports both Windows and Linux environments, providing flexibility in deployment. This means your code can run efficiently across different server platforms, accommodating varied IT infrastructures. It also supports mobile scenarios where traditional direct database connections are not practical.",[35,1385,1386,1389],{},[19,1387,1388],{},"Efficient Modernization",": RAD Server allows you to modernize your application incrementally. You can start by exposing critical business logic through RESTful APIs, and gradually integrate new features or migrate additional functionalities without overhauling your entire codebase.",[24,1391,1393],{"id":1392},"practical-thoughts-on-expanding-your-application-with-a-restful-api","Practical Thoughts on Expanding Your Application with a RESTful API",[15,1395,1396,1397,1400],{},"When adding a RESTful API to an application, ",[19,1398,1399],{},"begin with one use case",". This is often mobile access, but it can also support remote work or partner integrations. Avoid moving everything at once; start with the capability that provides the clearest business value.",[15,1402,1403],{},"Once you have the use case, use the guide and examples below to shape endpoint design, authentication, and deployment decisions.",[127,1405,1406,1411],{},[15,1407,1408],{},[19,1409,1410],{},"Practical first scope",[32,1412,1413,1416,1419,1422],{},[35,1414,1415],{},"Pick one business capability that already has stable validation rules.",[35,1417,1418],{},"Expose only the endpoints needed for that capability.",[35,1420,1421],{},"Add authentication, logging, etc. from the first iteration.",[35,1423,1424],{},"Expand service coverage after usage and error telemetry are stable.",[88,1426],{"alt":1427,"caption":1428,"size":92,"src":1429},"RAD Server white paper - Full guide","This guide to Embarcadero RAD Server, originally authored by David I (2019), is in its third edition and includes many additional features added based on market demand since RAD Servers Launch.","multi-tier\u002Frad-server-guide.png",[174,1431],{"description":1432,"icon":177,"title":1433,"url":1434},"The official white paper covering architecture, setup, and deployment patterns for RAD Server-based APIs.","RAD Server Guide","https:\u002F\u002Flp.embarcadero.com\u002FRADServerGuide",[174,1436],{"description":1437,"icon":1438,"title":1439,"url":1440},"This repository compliments the guide and shows examples of each chapter for Delphi and C++Builder.","github","Github repository with RAD Server examples","https:\u002F\u002Fgithub.com\u002Fembarcadero\u002Fradserver-docs",[174,1442],{"description":1443,"icon":183,"title":1444,"url":1445},"Practical considerations for structuring your services and managing API boundaries when adopting a multi-tier architecture.","Build Flexible and Robust Apps with a Multi-Tier Architecture","https:\u002F\u002Fblogs.embarcadero.com\u002Fbuild-flexible-and-robust-apps-with-a-multi-tier-architecture\u002F",[367,1447,1448],{},[15,1449,1450,1453],{},[19,1451,1452],{},"Common migration trap","\nDo not move clients to REST while keeping the same tightly coupled database assumptions. Define clear service contracts and ownership boundaries first, or you will recreate monolith coupling at the API level.",[270,1455,1456,1462],{},[15,1457,1458],{},[275,1459,1460],{"href":1460,"rel":1461},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=lCZeeZIHOTA",[279],[15,1463,1464,1467],{},[19,1465,1466],{},"RAD Server webinar (Ian Barker)"," - A practical walkthrough showing how RAD Server modernizes apps and securely centralizes business logic for multi-tier architectures.",[24,1469,1471],{"id":1470},"practical-steps-for-migration","Practical Steps for Migration",[106,1473,1474,1480,1486,1492],{},[35,1475,1476,1479],{},[19,1477,1478],{},"Expose Business Logic via RAD Server",": Begin by identifying the core business logic in your existing Delphi\u002FC++Builder applications that you want to expose. Use RAD Server to create RESTful APIs that provide access to these functionalities, effectively turning your legacy logic into a service-oriented architecture.",[35,1481,1482,1485],{},[19,1483,1484],{},"Integrate RESTful Services",": Implement RAD Server’s RESTful endpoints to allow client applications, whether web, mobile, or desktop, to interact with your existing business logic. This integration makes your services accessible across various platforms and devices, enhancing their reach.",[35,1487,1488,1491],{},[19,1489,1490],{},"Deploy and Test",": Deploy RAD Server on your preferred server environment (Windows or Linux) and rigorously test the new APIs to ensure they integrate smoothly with your existing code and meet performance expectations.",[35,1493,1494,1497],{},[19,1495,1496],{},"Expand Incrementally",": Start with one service boundary, validate usage and reliability, then broaden API coverage in stages.",[24,1499,1501],{"id":1500},"other-options-for-n-tier-development-with-rad-studio","Other Options for n-tier development with RAD Studio",[15,1503,1504],{},"DataSnap and MIDAS have long been powerful tools in the RAD Studio ecosystem for building multi-tier applications, enabling developers to create distributed systems with data access and remote procedure calls. While they share similarities with RAD Server, such as facilitating the separation of business logic and data access layers, RAD Server offers a more modern approach. Unlike DataSnap and MIDAS, RAD Server is designed specifically for RESTful API development, providing built-in support for RESTful services, user management, API analytics, and cross-platform deployment. It’s a more versatile and scalable solution, particularly suited for extending existing Delphi and C++Builder applications into the web, mobile, and cloud environments.",[15,1506,1507,1508,72,1513,72,1518,72,1523,76,1528,603],{},"There are also several community-driven and commercial projects around RESTful development. Some are Delphi-specific and worth evaluating as alternatives to RAD Server, including ",[275,1509,1512],{"href":1510,"rel":1511},"https:\u002F\u002Fgithub.com\u002Fdanieleteti\u002Fdelphimvcframework",[279],"Delphi MVC Framework",[275,1514,1517],{"href":1515,"rel":1516},"https:\u002F\u002Fgithub.com\u002FHashLoad\u002Fhorse",[279],"Horse",[275,1519,1522],{"href":1520,"rel":1521},"https:\u002F\u002Fwww.tmssoftware.com\u002Fsite\u002Fxdata.asp",[279],"TMS XData",[275,1524,1527],{"href":1525,"rel":1526},"https:\u002F\u002Fgithub.com\u002Fsynopse\u002FmORMot",[279],"mORMot",[275,1529,1532],{"href":1530,"rel":1531},"https:\u002F\u002Fgithub.com\u002Fcesarliws\u002Fdext",[279],"Dext Framework",[24,1534,1536],{"id":1535},"final-thoughts","Final Thoughts",[15,1538,1539,1540,1543,1544,603],{},"By adopting a RESTful architecture, you can ",[19,1541,1542],{},"continue to extract value from the business logic you’ve built over the years",". Exposing existing Delphi and C++Builder code through APIs preserves your investment while modernizing delivery for today’s clients. RAD Server gives you a practical way to extend capability ",[19,1545,1546],{},"without starting from scratch",{"title":187,"searchDepth":188,"depth":188,"links":1548},[1549,1550,1554,1555,1556,1557],{"id":1321,"depth":188,"text":1322},{"id":1328,"depth":188,"text":1329,"children":1551},[1552,1553],{"id":1338,"depth":790,"text":1339},{"id":1362,"depth":790,"text":1363},{"id":1392,"depth":188,"text":1393},{"id":1470,"depth":188,"text":1471},{"id":1500,"depth":188,"text":1501},{"id":1535,"depth":188,"text":1536},"Download RAD Server guide","Multi-tier architecture (also known as n-tier architecture) separates an application into distinct layers, typically including the presentation, business logic, and data access layers. This design enhances scalability, maintainability, and flexibility, making it ideal for complex applications.",{"slug":1561},"multi-tier",[401,1218],{"title":1164,"description":1559},"journeys\u002Fmultitier_architectures.md","modernising\u002Fmulti-tier","What n-tier\u002FRESTful means and why it matters; RAD Server as the path to mobile, web, and cloud from existing Delphi code.","rtKngHqpXHHGGSWkLIPQXRm_kvpKuq5YXQOgHxMc12M",{"id":1569,"title":1570,"body":1571,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":1927,"ctaSecondaryLink":1734,"ctaSecondaryType":183,"description":1928,"extension":197,"isTrackOverview":198,"meta":1929,"navigation":201,"order":790,"path":1930,"personaTags":1931,"routeGroup":207,"seo":1932,"sourceDoc":1933,"status":210,"stem":1934,"summary":1935,"urgencyHook":187,"__hash__":1936},"content\u002Fmodernising\u002Fweb-development-with-webstencils.md","Web Development with WebStencils",{"type":7,"value":1572,"toc":1916},[1573,1576,1583,1589,1606,1611,1616,1620,1623,1667,1671,1677,1682,1730,1735,1739,1743,1754,1758,1769,1772,1790,1794,1801,1813,1816,1834,1838,1841,1861,1872,1877,1882,1886,1888,1899,1910],[10,1574,1570],{"id":1575},"web-development-with-webstencils",[15,1577,1578,1579,1582],{},"Many Delphi and C++Builder teams want a modern web front end, but ",[19,1580,1581],{},"do not want to rewrite decades of trusted business logic"," in JavaScript frameworks that change every year.",[15,1584,1585,1588],{},[19,1586,1587],{},"WebStencils"," in RAD Studio gives you a clean, template-driven way to build modern, interactive web experiences directly from your existing Delphi or C++Builder server code, using familiar WebBroker or RAD Server projects.",[57,1590,1591,1595],{},[15,1592,1593],{},[19,1594,234],{},[32,1596,1597,1600,1603],{},[35,1598,1599],{},"Teams with stable Delphi server code (WebBroker, DataSnap, RAD Server) that want a modern web UI.",[35,1601,1602],{},"Product owners who want to add web access for existing desktop solutions without a “big bang” rewrite.",[35,1604,1605],{},"Developers currently on older Delphi versions evaluating whether upgrading unlocks credible web options.",[88,1607],{"alt":1608,"caption":1609,"size":92,"src":1610},"WebStencils Live Demo","Browse live the official WebStencils Demo hosted using Docker just clicking the link below.","web-development-with-webstencils\u002FWSdemo.png",[174,1612],{"description":1613,"icon":183,"title":1614,"url":1615},"No downloads, no setup required: just click this link and start exploring.","Check a WebStencils demo running live","https:\u002F\u002Fwsdemo.embarcadero.com",[24,1617,1619],{"id":1618},"why-webstencils-is-compelling-for-existing-delphi-codebases","Why WebStencils is compelling for existing Delphi codebases",[15,1621,1622],{},"Upgrading to a RAD Studio version that includes WebStencils turns your existing skills and code into a modern web delivery platform with the speed and security of native compiled code.",[32,1624,1625,1631,1641,1647,1661],{},[35,1626,1627,1630],{},[19,1628,1629],{},"Reuse proven business logic","\nKeep your validation, workflows, and data access in Delphi\u002FC++Builder. WebStencils simply turns the results into clean HTML.",[35,1632,1633,1636,1637,1640],{},[19,1634,1635],{},"Modern UX without a front-end framework lock-in","\nUse any CSS framework (Bootstrap, Tailwind, etc.) and JavaScript libraries you prefer, or combine WebStencils with ",[19,1638,1639],{},"HTMX"," for rich, dynamic behaviour with minimal JavaScript.",[35,1642,1643,1646],{},[19,1644,1645],{},"Fast, server-side rendering","\nPages are rendered on the server, which keeps SEO-friendly HTML, predictable performance, and easier debugging than client-heavy Single Page Applications (SPAs).",[35,1648,1649,1652,1653,1656,1657,1660],{},[19,1650,1651],{},"Clean separation of layout and logic","\nWeb designers can work on HTML\u002FCSS templates, while Delphi developers focus on data and behaviour using WebStencils’ simple ",[355,1654,1655],{},"@"," and ",[355,1658,1659],{},"{ }"," syntax.",[35,1662,1663,1666],{},[19,1664,1665],{},"Low-risk modernization path","\nStart by adding a small web surface area (admin portal, reporting dashboard, simple self-service pages) on top of your existing application, then expand over time.",[24,1668,1670],{"id":1669},"webstencils-htmx-modern-interactivity-delphi-first","WebStencils + HTMX: modern interactivity, Delphi-first",[15,1672,1673,1674,1676],{},"WebStencils is a template engine that understands your Delphi objects, datasets, and sessions. ",[19,1675,1639],{}," adds modern interaction patterns directly in HTML:",[88,1678],{"alt":1679,"caption":1680,"size":92,"src":1681},"WebStencils and TailwindCSS","The CSS and JS agnostic nature of WebStencils allows using pretty much any popular library.","web-development-with-webstencils\u002Ftailwind-delphi.png",[32,1683,1684,1700,1724],{},[35,1685,1686,1689,1690,72,1693,72,1696,1699],{},[19,1687,1688],{},"HTMX handles the browser side","\nAdd attributes to your HTML (such as ",[355,1691,1692],{},"hx-get",[355,1694,1695],{},"hx-post",[355,1697,1698],{},"hx-swap",") to make parts of the page update dynamically without full reloads.",[35,1701,1702,1705,1706,72,1709,72,1712,1715,1716,1719,1720,1723],{},[19,1703,1704],{},"WebStencils handles the server side","\nUse expressions like ",[355,1707,1708],{},"@dataset.FieldName",[355,1710,1711],{},"@if (...) { ... }",[355,1713,1714],{},"@foreach dataset { ... }"," and layout constructs like ",[355,1717,1718],{},"@LayoutPage"," \u002F ",[355,1721,1722],{},"@RenderBody"," to generate HTML fragments or full pages from your RAD Server or WebBroker actions.",[35,1725,1726,1729],{},[19,1727,1728],{},"Ideal for incremental upgrades","\nStart with simple, server-rendered navigation pages. Then progressively enhance sections with HTMX for live grids, inline editing, or dashboards, still powered by Delphi.",[174,1731],{"description":1732,"icon":177,"title":1733,"url":1734},"Free white paper covering architectural patterns, step-by-step examples, and how to combine WebStencils with HTMX.","Free Guide - WebStencils & HTMX: Fast Modern Web Development with RAD Studio","https:\u002F\u002Flp.embarcadero.com\u002FHTMX-WebStencils",[24,1736,1738],{"id":1737},"typical-modernization-journeys-with-webstencils","Typical modernization journeys with WebStencils",[554,1740,1742],{"id":1741},"_1-add-a-web-portal-on-top-of-an-existing-system","1. Add a web portal on top of an existing system",[32,1744,1745,1748,1751],{},[35,1746,1747],{},"Expose the most-used workflows from your desktop app as web pages (for example, customer self-service, reporting, or approvals).",[35,1749,1750],{},"Use WebStencils templates to render lists, details, and forms directly from your existing business logic.",[35,1752,1753],{},"Add HTMX for partial page updates so users enjoy a responsive experience without learning a SPA framework.",[554,1755,1757],{"id":1756},"_2-standardise-server-rendered-html","2. Standardise server-rendered HTML",[15,1759,1760,1761,1764,1765,1768],{},"WebStencils gives you a maintainable way to produce HTML from Delphi regardless of how you got here. In practice you might be replacing hand-maintained markup, tidying up after years of small fixes, or moving on from older approaches (for example ",[19,1762,1763],{},"CGI\u002FISAPI"," handlers or ",[19,1766,1767],{},"server-side scripts"," that are hard to evolve).",[15,1770,1771],{},"With shared templates you can:",[32,1773,1774,1777,1784],{},[35,1775,1776],{},"Separate layout, data binding, and conditional logic cleanly.",[35,1778,1779,1780,1656,1782,603],{},"Introduce a consistent shell using ",[355,1781,1718],{},[355,1783,1722],{},[35,1785,425,1786,1789],{},[355,1787,1788],{},"@ExtraHeader"," for page-specific CSS or JavaScript while keeping one base layout.",[554,1791,1793],{"id":1792},"_3-deliver-new-rest-html-experiences-with-rad-server","3. Deliver new REST + HTML experiences with RAD Server",[15,1795,1796,1797,1800],{},"RAD Server already gives you a strong REST-oriented server story. WebStencils fits alongside it when you also want ",[19,1798,1799],{},"browser-delivered HTML",":",[32,1802,1803,1810],{},[35,1804,1805,1806,1809],{},"The same RAD Server module can expose ",[19,1807,1808],{},"both"," JSON endpoints and HTML responses, so operators and integrators are not two unrelated codebases.",[35,1811,1812],{},"WebStencils scaffolding and dataset-oriented templates help you build list, detail, and form-style pages quickly on top of data you already surface from Delphi.",[174,1814],{"description":1432,"icon":177,"title":1815,"url":1434},"Free RAD Server Guide",[127,1817,1818,1823],{},[15,1819,1820],{},[19,1821,1822],{},"First WebStencils project idea",[32,1824,1825,1828,1831],{},[35,1826,1827],{},"Pick one narrow scenario: for example, “customer search and details” or “ticket list and status update”.",[35,1829,1830],{},"Implement it as a WebBroker or RAD Server module using WebStencils templates.",[35,1832,1833],{},"Use HTMX to make search, pagination, or inline updates feel instant, and gather user feedback before expanding.",[24,1835,1837],{"id":1836},"architecture-at-a-glance","Architecture at a glance",[15,1839,1840],{},"At a high level, a WebStencils-based web application looks like this:",[32,1842,1843,1849,1855],{},[35,1844,1845,1848],{},[19,1846,1847],{},"RAD Studio server application"," (WebBroker or RAD Server) hosts your modules, business logic, and data access.",[35,1850,1851,1854],{},[19,1852,1853],{},"TWebStencilsEngine \u002F TWebStencilsProcessor"," components load HTML templates, merge them with your objects, datasets, and session data, and output HTML.",[35,1856,1857,1860],{},[19,1858,1859],{},"HTMX-enhanced HTML"," in the browser calls back into REST endpoints or WebStencils-powered actions for partial updates.",[15,1862,1863,1864,1867,1868,1871],{},"This keeps ",[19,1865,1866],{},"server-side logic in Delphi\u002FC++Builder",", where your team already has deep expertise, and ",[19,1869,1870],{},"presentation in HTML, CSS, and lightweight browser tools"," that designers and frontend-minded developers can own.",[174,1873],{"description":1874,"icon":177,"title":1875,"url":1876},"Official documentation covering WebStencils concepts, syntax, and how to use templates in WebBroker or RAD Server projects.","WebStencils (RAD Studio DocWiki)","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FWebStencils",[174,1878],{"description":1879,"icon":177,"title":1880,"url":1881},"How session state is created, stored, and managed in WebBroker applications—useful when building authenticated or multi-step WebStencils flows.","WebBroker Sessions Management","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FWebBroker_Sessions_Management",[24,1883,1885],{"id":1884},"learn-more-and-see-it-in-action","Learn more and see it in action",[174,1887],{"description":1732,"icon":177,"title":1733,"url":1734},[270,1889,1890,1896],{},[15,1891,1892],{},[275,1893,1894],{"href":1894,"rel":1895},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=1CVpPFvbIeU",[279],[15,1897,1898],{},"WebStencils + HTMX walkthrough.",[270,1900,1901,1907],{},[15,1902,1903],{},[275,1904,1905],{"href":1905,"rel":1906},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=MGihIG14Tfc",[279],[15,1908,1909],{},"WebStencils in real-world scenarios and patterns teams use.",[15,1911,1912,1913,1915],{},"If you would like help mapping your specific project to a WebStencils-powered architecture, use the ",[19,1914,783],{}," button on this page to discuss your upgrade path and first web deliverables.",{"title":187,"searchDepth":188,"depth":188,"links":1917},[1918,1919,1920,1925,1926],{"id":1618,"depth":188,"text":1619},{"id":1669,"depth":188,"text":1670},{"id":1737,"depth":188,"text":1738,"children":1921},[1922,1923,1924],{"id":1741,"depth":790,"text":1742},{"id":1756,"depth":790,"text":1757},{"id":1792,"depth":790,"text":1793},{"id":1836,"depth":188,"text":1837},{"id":1884,"depth":188,"text":1885},"Download the Free Guide","Many Delphi and C++Builder teams want a modern web front end, but do not want to rewrite decades of trusted business logic in JavaScript frameworks that change every year.",{"slug":1575},"\u002Fmodernising\u002Fweb-development-with-webstencils",[401,205],{"title":1570,"description":1928},"journeys\u002Fweb_development_with_webstencils.md","modernising\u002Fweb-development-with-webstencils","Build modern web experiences using the WebStencils template engine in RAD Studio.","KVRudN3ef9Shv3CPOnEwyhhiHeFbhcKIClWp5AqUrxA",{"id":4,"title":5,"body":1938,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":187,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":196,"extension":197,"isTrackOverview":198,"meta":2050,"navigation":201,"order":202,"path":203,"personaTags":2051,"routeGroup":207,"seo":2052,"sourceDoc":209,"status":210,"stem":211,"summary":212,"urgencyHook":213,"__hash__":214},{"type":7,"value":1939,"toc":2044},[1940,1942,1946,1948,1950,1964,1966,1986,1988,1990,1994,2008,2022,2024,2038,2040,2042],[10,1941,13],{"id":12},[15,1943,17,1944,22],{},[19,1945,21],{},[24,1947,27],{"id":26},[15,1949,30],{},[32,1951,1952,1956,1960],{},[35,1953,1954,40],{},[19,1955,39],{},[35,1957,1958,46],{},[19,1959,45],{},[35,1961,1962,52],{},[19,1963,51],{},[15,1965,55],{},[57,1967,1968,1972],{},[15,1969,1970],{},[19,1971,63],{},[32,1973,1974,1982,1984],{},[35,1975,68,1976,72,1978,76,1980,80],{},[19,1977,71],{},[19,1979,75],{},[19,1981,79],{},[35,1983,83],{},[35,1985,86],{},[88,1987],{"alt":90,"caption":91,"size":92,"src":93},[24,1989,97],{"id":96},[15,1991,100,1992,104],{},[19,1993,103],{},[106,1995,1996,2000,2004],{},[35,1997,1998,113],{},[19,1999,112],{},[35,2001,2002,119],{},[19,2003,118],{},[35,2005,2006,125],{},[19,2007,124],{},[127,2009,2010,2014],{},[15,2011,2012],{},[19,2013,133],{},[32,2015,2016,2018,2020],{},[35,2017,138],{},[35,2019,141],{},[35,2021,144],{},[24,2023,148],{"id":147},[32,2025,2026,2030,2034],{},[35,2027,2028,156],{},[19,2029,155],{},[35,2031,2032,162],{},[19,2033,161],{},[35,2035,2036,168],{},[19,2037,167],{},[24,2039,172],{"id":171},[174,2041],{"description":176,"icon":177,"title":178,"url":179},[174,2043],{"description":182,"icon":183,"title":184,"url":185},{"title":187,"searchDepth":188,"depth":188,"links":2045},[2046,2047,2048,2049],{"id":26,"depth":188,"text":27},{"id":96,"depth":188,"text":97},{"id":147,"depth":188,"text":148},{"id":171,"depth":188,"text":172},{"slug":200},[205,206],{"title":5,"description":196},{"id":2054,"title":2055,"body":2056,"ctaPrimary":2477,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":187,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":2064,"extension":197,"isTrackOverview":198,"meta":2478,"navigation":201,"order":2480,"path":2481,"personaTags":2482,"routeGroup":207,"seo":2484,"sourceDoc":2485,"status":210,"stem":2486,"summary":2487,"urgencyHook":187,"__hash__":2488},"content\u002Fmodernising\u002Fwindows-vcl-modernisation.md","Windows VCL & Modern UI",{"type":7,"value":2057,"toc":2468},[2058,2062,2065,2072,2075,2092,2097,2101,2107,2114,2122,2130,2135,2140,2144,2147,2156,2188,2191,2196,2207,2211,2226,2233,2237,2242,2260,2264,2275,2278,2296,2304,2309,2313,2316,2346,2350,2357,2360,2388,2392,2395,2400,2415,2420,2428,2433,2447,2450,2461],[10,2059,2061],{"id":2060},"modernising-the-vcl-for-the-windows-11-era","Modernising the VCL for the Windows 11 Era",[15,2063,2064],{},"The Visual Component Library (VCL) is unparalleled for native Windows development. It is highly likely that your core software investment resides in a massive, battle-tested VCL application.",[15,2066,2067,2068,2071],{},"A common misconception is that modernizing an aging Windows application requires completely abandoning the VCL in favor of web technologies or entirely new frameworks. ",[19,2069,2070],{},"This is fundamentally untrue."," Today's RAD Studio allows you to incrementally modernize a legacy VCL application so that it looks, feels, and acts like a first-class Windows 11 citizen, requiring only a fraction of the time and cost and zero risk to your underlying business logic.",[15,2073,2074],{},"Here is how you can transform your application's UX\u002FUI and architecture directly within the VCL.",[57,2076,2077,2081],{},[15,2078,2079],{},[19,2080,234],{},[32,2082,2083,2086,2089],{},[35,2084,2085],{},"Teams with established VCL desktop products targeting Windows 10\u002F11 users.",[35,2087,2088],{},"Developers who want to modernize UI\u002FUX without rewriting stable business logic.",[35,2090,2091],{},"Teams evaluating whether to stay on VCL or move specific workloads to FMX.",[88,2093],{"alt":2094,"caption":2095,"size":92,"src":2096},"Placeholder visual for a modernized VCL application","RAD Studio Impressive Premium Styles available for both FMX and VCL applications.","windows-vcl-modernisation\u002Fstylesmockup.png",[24,2098,2100],{"id":2099},"high-dpi-and-multi-monitor-support","High DPI and Multi-Monitor Support",[15,2102,2103,2104,603],{},"Back when earlier versions of Delphi were released, a 1024x768 monitor was the standard. Today, your users are running ",[19,2105,2106],{},"4K monitors natively alongside lower-resolution secondary displays",[15,2108,2109,2110,2113],{},"If your legacy VCL app looks blurry, has misaligned text, or fails to resize appropriately when dragged between monitors, it immediately feels outdated to a user.\nModern RAD Studio introduces ",[19,2111,2112],{},"Per-Monitor V2 High DPI Support"," natively into the VCL.",[32,2115,2116,2119],{},[35,2117,2118],{},"Forms and controls correctly scale dynamically across displays of differing pixel densities.",[35,2120,2121],{},"Image collections and Virtual Image Lists automatically serve the crispest resolution icon for the user's specific DPI setting.",[367,2123,2124],{},[15,2125,2126,2129],{},[19,2127,2128],{},"If High DPI is ignored","\nBlurry text, clipped controls, and broken layout transitions between monitors are often interpreted by users as product quality issues, even when core functionality is stable.",[174,2131],{"description":2132,"icon":177,"title":2133,"url":2134},"This guide explains how to support High-DPI displays in your VCL applications and RAD Studio IDE’s support for High-DPI.","High DPI Guide","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FHigh_DPI_Guide",[174,2136],{"description":2137,"icon":177,"title":2138,"url":2139},"RAD Studio allows you to include scaling, high-DPI, multiple-resolution images in your Windows VCL applications by using the TImageCollection component in combination with the TVirtualImageList component.","Supporting high-DPI images with the Image Collection and Virtual ImageList components","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FSupporting_high-DPI_images_with_the_Image_Collection_and_Virtual_ImageList_components",[24,2141,2143],{"id":2142},"modernising-mdi-based-applications","Modernising MDI-based applications",[15,2145,2146],{},"A large share of established VCL applications are built on MDI (Multi-Document Interface), and keeping them current has become harder than it should be. Microsoft has not kept the MDI stack aligned with High DPI and Windows 11’s display model, so applications that worked flawlessly for years can now show blurry with broken layouts on modern hardware. That is a platform gap, not a reflection of your code quality, but users still expect a sharp, native-looking desktop experience.",[15,2148,2149,2152,2153,1800],{},[19,2150,2151],{},"From RAD Studio 12.0 onward",", the VCL team targeted MDI deliberately to close that gap. In many cases the first step is as simple as ",[19,2154,2155],{},"recompile on 12.x and retest at your target DPI settings",[32,2157,2158,2172],{},[35,2159,2160,2163,2164,2167,2168,2171],{},[19,2161,2162],{},"MDI kept viable",": work went into ",[19,2165,2166],{},"High DPI"," behaviour and ",[19,2169,2170],{},"VCL styles"," for MDI-style apps so you can modernise incrementally instead of being forced into a rewrite driven only by regressions in the stock MDI experience on newer Windows builds.",[35,2173,2174,2179,2180,2183,2184,2187],{},[19,2175,2176],{},[355,2177,2178],{},"TFormTabsBar",": a ",[19,2181,2182],{},"browser-style tab bar"," (similar to Chrome and other tab-first apps) you can adopt ",[19,2185,2186],{},"with little effort",", either as a lighter migration path away from classic MDI child windows or as a new tab-centric shell for new work.",[15,2189,2190],{},"Together, that gives MDI-heavy codebases a credible “look current on Windows 11” story without abandoning years of working window management.",[174,2192],{"description":2193,"icon":177,"title":2194,"url":2195},"Reference for the tab-bar control used to present child forms in a modern tabbed UI.","TFormTabsBar (VCL)","https:\u002F\u002Fdocwiki.embarcadero.com\u002FLibraries\u002Fen\u002FVcl.FormTabsBar.TFormTabsBar",[270,2197,2198,2204],{},[15,2199,2200],{},[275,2201,2202],{"href":2202,"rel":2203},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=WRJRqfrBYbQ",[279],[15,2205,2206],{},"VCL UI modernisation walkthrough—see how updated styling, layout, and platform support come together on real applications.",[24,2208,2210],{"id":2209},"vcl-fmx-styles","VCL & FMX Styles",[15,2212,2213,2214,2217,2218,2221,2222,2225],{},"You do not need to redesign every form manually to modernize the aesthetic of your application. In VCL, ",[355,2215,2216],{},"Vcl.Themes.TStyleManager"," lets you apply built-in styles quickly, and you can also load ",[355,2219,2220],{},".vsf"," styles at runtime (for example from your app folder) to switch themes without recompiling. RAD Studio ships with multiple ready-to-load styles, and the ",[19,2223,2224],{},"GetIt Package Manager"," adds many Premium Style options.",[15,2227,2228,2229,2232],{},"In FMX applications, dropping a ",[355,2230,2231],{},"TStyleBook"," (or using FMX style resources) and selecting a modern Windows 11 \u002F Dark Mode premium style can refresh the full client area, including standard controls, scrollbars, and visual chrome.",[174,2234],{"description":2235,"icon":177,"title":2216,"url":2236},"Official API documentation for managing and switching VCL styles.","https:\u002F\u002Fdocwiki.embarcadero.com\u002FLibraries\u002Fen\u002FVcl.Themes.TStyleManager",[174,2238],{"description":2239,"icon":183,"title":2240,"url":2241},"Embarcadero frequently releases new premium styles for subscription customers.","Premium App Styles for RAD Studio","https:\u002F\u002Fblogs.embarcadero.com\u002Fgorgeous-new-premium-app-styles-for-rad-studio-12-free-with-your-subscription\u002F",[127,2243,2244,2249],{},[15,2245,2246],{},[19,2247,2248],{},"First steps for UI modernisation",[32,2250,2251,2254,2257],{},[35,2252,2253],{},"Apply one premium style in a staging branch and test the highest-traffic forms first.",[35,2255,2256],{},"Prioritize High DPI fixes on dialogs with dense controls and custom drawing.",[35,2258,2259],{},"Use this pass to standardize modern icon assets before introducing new animations.",[24,2261,2263],{"id":2262},"embracing-modern-2d-rendering-with-skia","Embracing Modern 2D Rendering with Skia",[15,2265,2266,2267,2270,2271,2274],{},"Modern Windows apps are expected to look polished with crisp vectors, fluid animations, sharp text at any DPI. ",[19,2268,2269],{},"Skia"," is the open-source graphics engine that Chrome and Android rely on to deliver exactly that, and it can now be integrated directly into the VCL through the ",[355,2272,2273],{},"Skia4Delphi"," library.",[15,2276,2277],{},"What does this mean for your VCL app?",[32,2279,2280,2286,2293],{},[35,2281,2282,2283,603],{},"Flawless native support for ",[19,2284,2285],{},"SVG graphics",[35,2287,2288,2289,2292],{},"Silky smooth, hardware-accelerated ",[19,2290,2291],{},"Lottie animations"," to create responsive, fluid user experiences.",[35,2294,2295],{},"Exceptional text rendering and custom text layouts.",[15,2297,2298,2303],{},[275,2299,2302],{"href":2300,"rel":2301},"https:\u002F\u002Ft.me\u002Fskia4delphi",[279],"Join the Skia4Delphi Telegram Community"," to see what developers are building.",[174,2305],{"description":2306,"icon":1438,"title":2307,"url":2308},"Skia4Delphi is a cross-platform 2D graphics API for Delphi platforms based on Google's Skia Graphics Library. It provides a comprehensive 2D API that can be used across mobile, server and desktop models to render images.","Skia4Delphi Official Repository","https:\u002F\u002Fgithub.com\u002Fskia4delphi\u002Fskia4delphi",[24,2310,2312],{"id":2311},"expanding-with-windows-1011-specific-controls","Expanding with Windows 10\u002F11 Specific Controls",[15,2314,2315],{},"To ensure your application doesn't just look modern but also behaves like a current Windows app, recent VCL versions have introduced dedicated controls that map to current Windows API paradigms:",[32,2317,2318,2324,2340],{},[35,2319,2320,2323],{},[19,2321,2322],{},"Taskbar Management:"," Integrate with the Windows 10\u002F11 taskbar to show form previews, taskbar icon progress bars, and custom jump-list shortcuts.",[35,2325,2326,2329,2330,72,2333,2336,2337,603],{},[19,2327,2328],{},"Modern Layouts:"," Move away from hard-coded positional layouts using modern responsive controls like the ",[355,2331,2332],{},"TFlowPanel",[355,2334,2335],{},"TGridPanel",", and the incredibly powerful ",[355,2338,2339],{},"TRelativePanel",[35,2341,2342,2345],{},[19,2343,2344],{},"Bluetooth LE Integration:"," Native VCL and FMX components wrapper allowing your Windows desktop application to discover and communicate with modern Bluetooth Low Energy IoT devices securely.",[24,2347,2349],{"id":2348},"connecting-the-vcl-to-the-modern-web-rest-json","Connecting the VCL to the Modern Web (REST & JSON)",[15,2351,2352,2353,2356],{},"A modern Windows desktop app ",[19,2354,2355],{},"rarely lives in isolation anymore",", it usually consumes enterprise data from the cloud.",[15,2358,2359],{},"The modern VCL is built with this in mind. You no longer need to rely on aging COM objects or raw socket programming.",[32,2361,2362,2378],{},[35,2363,2364,2367,2368,72,2371,76,2374,2377],{},[19,2365,2366],{},"Native REST Client Library:"," Easily connect to secure REST services using the built-in ",[355,2369,2370],{},"TRESTClient",[355,2372,2373],{},"TRESTRequest",[355,2375,2376],{},"TRESTResponse"," components.",[35,2379,2380,2383,2384,2387],{},[19,2381,2382],{},"JSON Wizard:"," Paste a raw JSON payload from a web API into the IDE, and RAD Studio will ",[19,2385,2386],{},"automatically generate the native Delphi classes"," required to parse and serialize that data structure safely.",[24,2389,2391],{"id":2390},"vcl-vs-fmx-which-should-you-choose","VCL vs. FMX: Which should you choose?",[15,2393,2394],{},"As you contemplate UI modernisation, a critical question arises: Should you stay on the VCL or migrate your UI to FireMonkey (FMX)?",[15,2396,2397],{},[19,2398,2399],{},"Stay on the VCL if:",[32,2401,2402,2405,2412],{},[35,2403,2404],{},"Your application exclusively targets Windows desktops.",[35,2406,2407,2408,2411],{},"Your application relies heavily on Windows specific APIs, underlying ",[355,2409,2410],{},"HWND"," window handles, or Windows-only third-party components.",[35,2413,2414],{},"You are looking for the fastest, lowest-risk path to modernize a massive existing desktop codebase.",[15,2416,2417],{},[19,2418,2419],{},"Consider FMX if:",[32,2421,2422,2425],{},[35,2423,2424],{},"You have an imminent, funded requirement to deploy an identical user experience natively to macOS, Linux or Mobile (iOS\u002FAndroid).",[35,2426,2427],{},"You require a completely custom, uniquely rendered user interface that relies on heavily animated, non-standard control styling that goes beyond standard Windows constraints.",[15,2429,2430],{},[19,2431,2432],{},"Consider a VCL + FMX shared-code approach if:",[32,2434,2435,2438,2441,2444],{},[35,2436,2437],{},"You want to explore cross-platform reach without committing to a full UI migration.",[35,2439,2440],{},"You're ready to start separating business logic from UI concerns, sharing core code between a VCL Windows app and an FMX counterpart built alongside it.",[35,2442,2443],{},"You want to test market demand on macOS, Linux or mobile before making a larger investment.",[35,2445,2446],{},"You're thinking about mobile or multi-platform as a future direction and want to start moving towards it incrementally, giving your existing codebase a new lease of life without abandoning what works.",[15,2448,2449],{},"This third path is often overlooked, but it's one of the most pragmatic options available to mature codebases. Your VCL app keeps serving Windows users with full fidelity, while a parallel FMX project sharing the same business logic, data models, and service layers lets you extend your reach platform by platform, at your own pace.",[270,2451,2452,2458],{},[15,2453,2454],{},[275,2455,2456],{"href":2456,"rel":2457},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=JjM_I8HwXcI",[279],[15,2459,2460],{},"More on modernising legacy VCL applications with current RAD Studio and Windows.",[15,2462,2463,2464,2467],{},"If you are a VCL developer looking to expand into mobile apps, the skills you have learned over the past decades translate directly over to FMX. (See the ",[275,2465,2466],{"href":1216},"Going Mobile"," track).",{"title":187,"searchDepth":188,"depth":188,"links":2469},[2470,2471,2472,2473,2474,2475,2476],{"id":2099,"depth":188,"text":2100},{"id":2142,"depth":188,"text":2143},{"id":2209,"depth":188,"text":2210},{"id":2262,"depth":188,"text":2263},{"id":2311,"depth":188,"text":2312},{"id":2348,"depth":188,"text":2349},{"id":2390,"depth":188,"text":2391},"Request a UI modernisation demo",{"slug":2479},"windows-vcl-modernisation",1,"\u002Fmodernising\u002Fwindows-vcl-modernisation",[2483,206,205],"pre-unicode",{"title":2055,"description":2064},"journeys\u002Fwindows_vcl_app_modernization.md","modernising\u002Fwindows-vcl-modernisation","Revitalize your legacy Windows applications with High DPI support, premium styling, and modern Windows 11 controls without rewriting your VCL codebase.","MOJJADFYuk4wpZmxYgA4Y-zdfjsQUlragJUV7p4NG38",{"id":2490,"title":2491,"body":2492,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":187,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":3584,"extension":197,"isTrackOverview":198,"meta":3585,"navigation":201,"order":188,"path":3587,"personaTags":3588,"routeGroup":3589,"seo":3590,"sourceDoc":3591,"status":210,"stem":3592,"summary":3593,"urgencyHook":187,"__hash__":3594},"content\u002Fupgrading\u002F3rd-party-components.md","3rd Party Components",{"type":7,"value":2493,"toc":3576},[2494,2498,2505,2512,2538,2542,2549,3444,3448,3451,3471,3475,3489,3507,3526,3530,3546,3563,3567,3573],[10,2495,2497],{"id":2496},"managing-3rd-party-components-in-migration","Managing 3rd Party Components in Migration",[15,2499,2500,2501,2504],{},"Third-party components are a ",[19,2502,2503],{},"massive accelerator"," for Delphi and C++Builder developers, extending the IDE with advanced UI grids, hardware interfaces, reporting engines, and domain-specific APIs. By leaning on the component ecosystem, you avoid reinventing the wheel and stay focused on your specific business logic.",[15,2506,2507,2508,2511],{},"However, during a major version upgrade, ",[19,2509,2510],{},"your 3rd-party components are often the largest source of friction",". Incompatible DCUs, abandoned open-source projects, and breaking vendor changes require a structured approach to resolve.",[57,2513,2514,2519],{},[15,2515,2516],{},[19,2517,2518],{},"Before you start",[32,2520,2521,2528,2535],{},[35,2522,2523,2524,2527],{},"Make a ",[19,2525,2526],{},"single inventory"," of every 3rd-party package, including version numbers and where they are used.",[35,2529,2530,2531,2534],{},"Note whether you have ",[19,2532,2533],{},"full source code"," or only DCUs\u002FBPLs.",[35,2536,2537],{},"Check whether each vendor is still active and which RAD Studio versions they support.",[24,2539,2541],{"id":2540},"component-migration-decision-tree","Component Migration Decision Tree",[15,2543,2544,2545,2548],{},"To systematically approach upgrading your component packages, follow this standard decision matrix. Do this ",[540,2546,2547],{},"before"," attempting your first full compile on the new environment.",[2550,2551,2563,2567,3421,3435],"svg",{"id":2552,"width":2553,"xmlns":2554,"xmlnsXLink":2555,"className":2556,"style":2558,"viewBox":2559,"role":2560,"ariaRoleDescription":2561},"mermaid-0","100%","http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxlink",[2557],"flowchart","max-width: 797.890625px;","0 0 797.890625 1434.9375","graphics-document document",[2562],"flowchart-v2",[2564,2565,2566],"style",{},"#mermaid-0{font-family:arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-0 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-0 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-0 .error-icon{fill:#552222;}#mermaid-0 .error-text{fill:#552222;stroke:#552222;}#mermaid-0 .edge-thickness-normal{stroke-width:1px;}#mermaid-0 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-0 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-0 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-0 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-0 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-0 .marker{fill:#333333;stroke:#333333;}#mermaid-0 .marker.cross{stroke:#333333;}#mermaid-0 svg{font-family:arial,sans-serif;font-size:16px;}#mermaid-0 p{margin:0;}#mermaid-0 .label{font-family:arial,sans-serif;color:#333;}#mermaid-0 .cluster-label text{fill:#333;}#mermaid-0 .cluster-label span{color:#333;}#mermaid-0 .cluster-label span p{background-color:transparent;}#mermaid-0 .label text,#mermaid-0 span{fill:#333;color:#333;}#mermaid-0 .node rect,#mermaid-0 .node circle,#mermaid-0 .node ellipse,#mermaid-0 .node polygon,#mermaid-0 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-0 .rough-node .label text,#mermaid-0 .node .label text,#mermaid-0 .image-shape .label,#mermaid-0 .icon-shape .label{text-anchor:middle;}#mermaid-0 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-0 .rough-node .label,#mermaid-0 .node .label,#mermaid-0 .image-shape .label,#mermaid-0 .icon-shape .label{text-align:center;}#mermaid-0 .node.clickable{cursor:pointer;}#mermaid-0 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-0 .arrowheadPath{fill:#333333;}#mermaid-0 .edgePath .path{stroke:#333333;stroke-width:1px;}#mermaid-0 .flowchart-link{stroke:#333333;fill:none;}#mermaid-0 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-0 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-0 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-0 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-0 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-0 .cluster text{fill:#333;}#mermaid-0 .cluster span{color:#333;}#mermaid-0 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-0 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-0 rect.text{fill:none;stroke-width:0;}#mermaid-0 .icon-shape,#mermaid-0 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-0 .icon-shape p,#mermaid-0 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-0 .icon-shape .label rect,#mermaid-0 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-0 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-0 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-0 .node .neo-node{stroke:#9370DB;}#mermaid-0 [data-look=\"neo\"].node rect,#mermaid-0 [data-look=\"neo\"].cluster rect,#mermaid-0 [data-look=\"neo\"].node polygon{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#mermaid-0 [data-look=\"neo\"].node path{stroke:#9370DB;stroke-width:1px;}#mermaid-0 [data-look=\"neo\"].node .outer-path{filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#mermaid-0 [data-look=\"neo\"].node .neo-line path{stroke:#9370DB;filter:none;}#mermaid-0 [data-look=\"neo\"].node circle{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#mermaid-0 [data-look=\"neo\"].node circle .state-start{fill:#000000;}#mermaid-0 [data-look=\"neo\"].icon-shape .icon{fill:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#mermaid-0 [data-look=\"neo\"].icon-shape .icon-neo path{stroke:#9370DB;filter:drop-shadow(1px 2px 2px rgba(185, 185, 185, 1));}#mermaid-0 :root{--mermaid-font-family:arial,sans-serif;}#mermaid-0 .process>*{fill:#f7f7ff!important;stroke:#7b84b6!important;stroke-width:1px!important;color:#1f2430!important;}#mermaid-0 .process span{fill:#f7f7ff!important;stroke:#7b84b6!important;stroke-width:1px!important;color:#1f2430!important;}#mermaid-0 .process tspan{fill:#1f2430!important;}#mermaid-0 .decision>*{fill:#eef0ff!important;stroke:#666fb0!important;stroke-width:1.5px!important;color:#1f2430!important;}#mermaid-0 .decision span{fill:#eef0ff!important;stroke:#666fb0!important;stroke-width:1.5px!important;color:#1f2430!important;}#mermaid-0 .decision tspan{fill:#1f2430!important;}#mermaid-0 .terminal>*{fill:#edf8f1!important;stroke:#3f7a55!important;stroke-width:1.5px!important;color:#1f2430!important;}#mermaid-0 .terminal span{fill:#edf8f1!important;stroke:#3f7a55!important;stroke-width:1.5px!important;color:#1f2430!important;}#mermaid-0 .terminal tspan{fill:#1f2430!important;}#mermaid-0 .warning>*{fill:#fff4ee!important;stroke:#b5623e!important;stroke-width:1.5px!important;color:#1f2430!important;}#mermaid-0 .warning span{fill:#fff4ee!important;stroke:#b5623e!important;stroke-width:1.5px!important;color:#1f2430!important;}#mermaid-0 .warning tspan{fill:#1f2430!important;}",[2568,2569,2570,2587,2596,2610,2620,2629,2637,2645,2653,2666,2673,2685,2694],"g",{},[2571,2572,2580],"marker",{"id":2573,"className":2574,"viewBox":2575,"refX":2576,"refY":2576,"markerUnits":2577,"markerWidth":2578,"markerHeight":2578,"orient":2579},"mermaid-0_flowchart-v2-pointEnd",[2571,2562],"0 0 10 10","5","userSpaceOnUse","8","auto",[2581,2582],"path",{"d":2583,"className":2584,"style":2586},"M 0 0 L 10 5 L 0 10 z",[2585],"arrowMarkerPath","stroke-width: 1; stroke-dasharray: 1, 0;",[2571,2588,2592],{"id":2589,"className":2590,"viewBox":2575,"refX":2591,"refY":2576,"markerUnits":2577,"markerWidth":2578,"markerHeight":2578,"orient":2579},"mermaid-0_flowchart-v2-pointStart",[2571,2562],"4.5",[2581,2593],{"d":2594,"className":2595,"style":2586},"M 0 5 L 10 10 L 10 0 z",[2585],[2571,2597,2605],{"id":2598,"className":2599,"viewBox":2600,"refX":2601,"refY":2602,"markerUnits":2577,"markerWidth":2603,"markerHeight":2604,"orient":2579},"mermaid-0_flowchart-v2-pointEnd-margin",[2571,2562],"0 0 11.5 14","11.5","7","10.5","14",[2581,2606],{"d":2607,"className":2608,"style":2609},"M 0 0 L 11.5 7 L 0 14 z",[2585],"stroke-width: 0; stroke-dasharray: 1, 0;",[2571,2611,2615],{"id":2612,"className":2613,"viewBox":2600,"refX":2614,"refY":2602,"markerUnits":2577,"markerWidth":2601,"markerHeight":2604,"orient":2579},"mermaid-0_flowchart-v2-pointStart-margin",[2571,2562],"1",[2616,2617],"polygon",{"points":2618,"className":2619,"style":2609},"0,7 11.5,14 11.5,0",[2585],[2571,2621,2625],{"id":2622,"className":2623,"viewBox":2575,"refX":2624,"refY":2576,"markerUnits":2577,"markerWidth":2624,"markerHeight":2624,"orient":2579},"mermaid-0_flowchart-v2-circleEnd",[2571,2562],"11",[2626,2627],"circle",{"cx":2576,"cy":2576,"r":2576,"className":2628,"style":2586},[2585],[2571,2630,2634],{"id":2631,"className":2632,"viewBox":2575,"refX":2633,"refY":2576,"markerUnits":2577,"markerWidth":2624,"markerHeight":2624,"orient":2579},"mermaid-0_flowchart-v2-circleStart",[2571,2562],"-1",[2626,2635],{"cx":2576,"cy":2576,"r":2576,"className":2636,"style":2586},[2585],[2571,2638,2642],{"id":2639,"className":2640,"viewBox":2575,"refY":2576,"refX":2641,"markerUnits":2577,"markerWidth":2604,"markerHeight":2604,"orient":2579},"mermaid-0_flowchart-v2-circleEnd-margin",[2571,2562],"12.25",[2626,2643],{"cx":2576,"cy":2576,"r":2576,"className":2644,"style":2609},[2585],[2571,2646,2650],{"id":2647,"className":2648,"viewBox":2575,"refX":2649,"refY":2576,"markerUnits":2577,"markerWidth":2604,"markerHeight":2604,"orient":2579},"mermaid-0_flowchart-v2-circleStart-margin",[2571,2562],"-2",[2626,2651],{"cx":2576,"cy":2576,"r":2576,"className":2652,"style":2609},[2585],[2571,2654,2661],{"id":2655,"className":2656,"viewBox":2658,"refX":2659,"refY":2660,"markerUnits":2577,"markerWidth":2624,"markerHeight":2624,"orient":2579},"mermaid-0_flowchart-v2-crossEnd",[2571,2657,2562],"cross","0 0 11 11","12","5.2",[2581,2662],{"d":2663,"className":2664,"style":2665},"M 1,1 l 9,9 M 10,1 l -9,9",[2585],"stroke-width: 2; stroke-dasharray: 1, 0;",[2571,2667,2670],{"id":2668,"className":2669,"viewBox":2658,"refX":2633,"refY":2660,"markerUnits":2577,"markerWidth":2624,"markerHeight":2624,"orient":2579},"mermaid-0_flowchart-v2-crossStart",[2571,2657,2562],[2581,2671],{"d":2663,"className":2672,"style":2665},[2585],[2571,2674,2680],{"id":2675,"className":2676,"viewBox":2677,"refX":2678,"refY":2679,"markerUnits":2577,"markerWidth":2659,"markerHeight":2659,"orient":2579},"mermaid-0_flowchart-v2-crossEnd-margin",[2571,2657,2562],"0 0 15 15","17.7","7.5",[2581,2681],{"d":2682,"className":2683,"style":2684},"M 1,1 L 14,14 M 1,14 L 14,1",[2585],"stroke-width: 2.5;",[2571,2686,2690],{"id":2687,"className":2688,"viewBox":2677,"refX":2689,"refY":2679,"markerUnits":2577,"markerWidth":2659,"markerHeight":2659,"orient":2579},"mermaid-0_flowchart-v2-crossStart-margin",[2571,2657,2562],"-3.5",[2581,2691],{"d":2682,"className":2692,"style":2693},[2585],"stroke-width: 2.5; stroke-dasharray: 1, 0;",[2568,2695,2698,2702,2812,3047],{"className":2696},[2697],"root",[2568,2699],{"className":2700},[2701],"clusters",[2568,2703,2706,2721,2728,2735,2742,2749,2756,2763,2770,2777,2784,2791,2798,2805],{"className":2704},[2705],"edgePaths",[2581,2707],{"d":2708,"id":2709,"className":2710,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2717,"dataPoints":2718,"dataLook":2719,"markerEnd":2720},"M391.418,80L391.418,84C391.418,88,391.418,96,391.418,103.333C391.418,110.667,391.418,117.333,391.418,120.667L391.418,124","mermaid-0-L_A_B_0",[2711,2712,2711,2712,2713],"edge-thickness-normal","edge-pattern-solid","flowchart-link",";","true","edge","L_A_B_0","W3sieCI6MzkxLjQxNzk2ODc1LCJ5Ijo4MH0seyJ4IjozOTEuNDE3OTY4NzUsInkiOjEwNH0seyJ4IjozOTEuNDE3OTY4NzUsInkiOjEyOH1d","classic","url(#mermaid-0_flowchart-v2-pointEnd)",[2581,2722],{"d":2723,"id":2724,"className":2725,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2726,"dataPoints":2727,"dataLook":2719,"markerEnd":2720},"M316.46,293.167L285.726,311.66C254.993,330.153,193.526,367.139,162.792,390.965C132.059,414.792,132.059,425.458,132.059,430.792L132.059,436.125","mermaid-0-L_B_C_0",[2711,2712,2711,2712,2713],"L_B_C_0","W3sieCI6MzE2LjQ1OTYyNjc5NzE2NTksInkiOjI5My4xNjY2NTgwNDcxNjU5fSx7IngiOjEzMi4wNTg1OTM3NSwieSI6NDA0LjEyNX0seyJ4IjoxMzIuMDU4NTkzNzUsInkiOjQ0MC4xMjV9XQ==",[2581,2729],{"d":2730,"id":2731,"className":2732,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2733,"dataPoints":2734,"dataLook":2719,"markerEnd":2720},"M449.976,309.567L464.981,325.327C479.985,341.086,509.995,372.606,524.999,412.519C540.004,452.432,540.004,500.74,540.004,549.047C540.004,597.354,540.004,645.661,539.207,676.799C538.41,707.937,536.817,721.906,536.02,728.89L535.224,735.874","mermaid-0-L_B_D_0",[2711,2712,2711,2712,2713],"L_B_D_0","W3sieCI6NDQ5Ljk3NTk1NTM1MDg0NjMsInkiOjMwOS41NjcwMTMzOTkxNTM3fSx7IngiOjU0MC4wMDM5MDYyNSwieSI6NDA0LjEyNX0seyJ4Ijo1NDAuMDAzOTA2MjUsInkiOjU0OS4wNDY4NzV9LHsieCI6NTQwLjAwMzkwNjI1LCJ5Ijo2OTMuOTY4NzV9LHsieCI6NTM0Ljc3MDE1NTE1NDE2MTcsInkiOjczOS44NDgyODAxNTQxNjE3fV0=",[2581,2736],{"d":2737,"id":2738,"className":2739,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2740,"dataPoints":2741,"dataLook":2719,"markerEnd":2720},"M121.772,647.682L120.968,655.397C120.163,663.111,118.554,678.54,117.75,708.335C116.945,738.13,116.945,782.292,116.945,826.453C116.945,870.615,116.945,914.776,116.945,946.857C116.945,978.938,116.945,998.938,116.945,1016.938C116.945,1034.938,116.945,1050.938,116.945,1066.271C116.945,1081.604,116.945,1096.271,116.945,1103.604L116.945,1110.938","mermaid-0-L_C_E_0",[2711,2712,2711,2712,2713],"L_C_E_0","W3sieCI6MTIxLjc3MjMxMDU5OTkzNTMyLCJ5Ijo2NDcuNjgyNDY2ODQ5OTM1M30seyJ4IjoxMTYuOTQ1MzEyNSwieSI6NjkzLjk2ODc1fSx7IngiOjExNi45NDUzMTI1LCJ5Ijo4MjYuNDUzMTI1fSx7IngiOjExNi45NDUzMTI1LCJ5Ijo5NTguOTM3NX0seyJ4IjoxMTYuOTQ1MzEyNSwieSI6MTAxOC45Mzc1fSx7IngiOjExNi45NDUzMTI1LCJ5IjoxMDY2LjkzNzV9LHsieCI6MTE2Ljk0NTMxMjUsInkiOjExMTQuOTM3NX1d",[2581,2743],{"d":2744,"id":2745,"className":2746,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2747,"dataPoints":2748,"dataLook":2719,"markerEnd":2720},"M184.28,605.748L197.822,620.451C211.364,635.155,238.447,664.562,283.978,695.606C329.509,726.65,393.488,759.331,425.477,775.671L457.466,792.012","mermaid-0-L_C_D_0",[2711,2712,2711,2712,2713],"L_C_D_0","W3sieCI6MTg0LjI3OTc3NzUzMDgxNjM1LCJ5Ijo2MDUuNzQ3NTY2MjE5MTgzN30seyJ4IjoyNjUuNTMxMjUsInkiOjY5My45Njg3NX0seyJ4Ijo0NjEuMDI4MTEwNDIwNDg4MSwieSI6NzkzLjgzMTI2NDU3OTUxMTl9XQ==",[2581,2750],{"d":2751,"id":2752,"className":2753,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2754,"dataPoints":2755,"dataLook":2719,"markerEnd":2720},"M116.945,1186.938L116.945,1194.938C116.945,1202.938,116.945,1218.938,116.945,1230.271C116.945,1241.604,116.945,1248.271,116.945,1251.604L116.945,1254.938","mermaid-0-L_E_F_0",[2711,2712,2711,2712,2713],"L_E_F_0","W3sieCI6MTE2Ljk0NTMxMjUsInkiOjExODYuOTM3NX0seyJ4IjoxMTYuOTQ1MzEyNSwieSI6MTIzNC45Mzc1fSx7IngiOjExNi45NDUzMTI1LCJ5IjoxMjU4LjkzNzV9XQ==",[2581,2757],{"d":2758,"id":2759,"className":2760,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2761,"dataPoints":2762,"dataLook":2719,"markerEnd":2720},"M475.146,873.193L459.937,887.484C444.728,901.775,414.309,930.356,399.1,954.647C383.891,978.938,383.891,998.938,383.891,1016.938C383.891,1034.938,383.891,1050.938,383.891,1064.271C383.891,1077.604,383.891,1088.271,383.891,1093.604L383.891,1098.938","mermaid-0-L_D_G_0",[2711,2712,2711,2712,2713],"L_D_G_0","W3sieCI6NDc1LjE0NjI5NTQ1NjQ5MzIsInkiOjg3My4xOTMxNzA0NTY0OTMxfSx7IngiOjM4My44OTA2MjUsInkiOjk1OC45Mzc1fSx7IngiOjM4My44OTA2MjUsInkiOjEwMTguOTM3NX0seyJ4IjozODMuODkwNjI1LCJ5IjoxMDY2LjkzNzV9LHsieCI6MzgzLjg5MDYyNSwieSI6MTEwMi45Mzc1fV0=",[2581,2764],{"d":2765,"id":2766,"className":2767,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2768,"dataPoints":2769,"dataLook":2719,"markerEnd":2720},"M383.891,1198.938L383.891,1204.938C383.891,1210.938,383.891,1222.938,383.891,1232.271C383.891,1241.604,383.891,1248.271,383.891,1251.604L383.891,1254.938","mermaid-0-L_G_H_0",[2711,2712,2711,2712,2713],"L_G_H_0","W3sieCI6MzgzLjg5MDYyNSwieSI6MTE5OC45Mzc1fSx7IngiOjM4My44OTA2MjUsInkiOjEyMzQuOTM3NX0seyJ4IjozODMuODkwNjI1LCJ5IjoxMjU4LjkzNzV9XQ==",[2581,2771],{"d":2772,"id":2773,"className":2774,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2775,"dataPoints":2776,"dataLook":2719,"markerEnd":2720},"M574.635,873.193L589.844,887.484C605.054,901.775,635.472,930.356,650.681,949.98C665.891,969.604,665.891,980.271,665.891,985.604L665.891,990.938","mermaid-0-L_D_I_0",[2711,2712,2711,2712,2713],"L_D_I_0","W3sieCI6NTc0LjYzNDk1NDU0MzUwNjksInkiOjg3My4xOTMxNzA0NTY0OTMxfSx7IngiOjY2NS44OTA2MjUsInkiOjk1OC45Mzc1fSx7IngiOjY2NS44OTA2MjUsInkiOjk5NC45Mzc1fV0=",[2581,2778],{"d":2779,"id":2780,"className":2781,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2782,"dataPoints":2783,"dataLook":2719,"markerEnd":2720},"M665.891,1042.938L665.891,1046.938C665.891,1050.938,665.891,1058.938,665.891,1066.271C665.891,1073.604,665.891,1080.271,665.891,1083.604L665.891,1086.938","mermaid-0-L_I_J_0",[2711,2712,2711,2712,2713],"L_I_J_0","W3sieCI6NjY1Ljg5MDYyNSwieSI6MTA0Mi45Mzc1fSx7IngiOjY2NS44OTA2MjUsInkiOjEwNjYuOTM3NX0seyJ4Ijo2NjUuODkwNjI1LCJ5IjoxMDkwLjkzNzV9XQ==",[2581,2785],{"d":2786,"id":2787,"className":2788,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2789,"dataPoints":2790,"dataLook":2719,"markerEnd":2720},"M665.891,1210.938L665.891,1214.938C665.891,1218.938,665.891,1226.938,665.891,1234.271C665.891,1241.604,665.891,1248.271,665.891,1251.604L665.891,1254.938","mermaid-0-L_J_K_0",[2711,2712,2711,2712,2713],"L_J_K_0","W3sieCI6NjY1Ljg5MDYyNSwieSI6MTIxMC45Mzc1fSx7IngiOjY2NS44OTA2MjUsInkiOjEyMzQuOTM3NX0seyJ4Ijo2NjUuODkwNjI1LCJ5IjoxMjU4LjkzNzV9XQ==",[2581,2792],{"d":2793,"id":2794,"className":2795,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2796,"dataPoints":2797,"dataLook":2719,"markerEnd":2720},"M116.945,1330.938L116.945,1334.938C116.945,1338.938,116.945,1346.938,153.593,1357.527C190.24,1368.117,263.534,1381.296,300.182,1387.886L336.829,1394.475","mermaid-0-L_F_L_0",[2711,2712,2711,2712,2713],"L_F_L_0","W3sieCI6MTE2Ljk0NTMxMjUsInkiOjEzMzAuOTM3NX0seyJ4IjoxMTYuOTQ1MzEyNSwieSI6MTM1NC45Mzc1fSx7IngiOjM0MC43NjU2MjUsInkiOjEzOTUuMTgzMTAyNzM5MzI1fV0=",[2581,2799],{"d":2800,"id":2801,"className":2802,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2803,"dataPoints":2804,"dataLook":2719,"markerEnd":2720},"M383.891,1330.938L383.891,1334.938C383.891,1338.938,383.891,1346.938,383.891,1354.271C383.891,1361.604,383.891,1368.271,383.891,1371.604L383.891,1374.938","mermaid-0-L_H_L_0",[2711,2712,2711,2712,2713],"L_H_L_0","W3sieCI6MzgzLjg5MDYyNSwieSI6MTMzMC45Mzc1fSx7IngiOjM4My44OTA2MjUsInkiOjEzNTQuOTM3NX0seyJ4IjozODMuODkwNjI1LCJ5IjoxMzc4LjkzNzV9XQ==",[2581,2806],{"d":2807,"id":2808,"className":2809,"style":2714,"dataEdge":2715,"dataEt":2716,"dataId":2810,"dataPoints":2811,"dataLook":2719,"markerEnd":2720},"M665.891,1330.938L665.891,1334.938C665.891,1338.938,665.891,1346.938,626.735,1357.602C587.58,1368.267,509.269,1381.596,470.114,1388.261L430.959,1394.926","mermaid-0-L_K_L_0",[2711,2712,2711,2712,2713],"L_K_L_0","W3sieCI6NjY1Ljg5MDYyNSwieSI6MTMzMC45Mzc1fSx7IngiOjY2NS44OTA2MjUsInkiOjEzNTQuOTM3NX0seyJ4Ijo0MjcuMDE1NjI1LCJ5IjoxMzk1LjU5NzA3NDQ2ODA4NX1d",[2568,2813,2816,2840,2861,2881,2898,2915,2929,2946,2960,2977,2991,3005,3019,3033],{"className":2814},[2815],"edgeLabels",[2568,2817,2820],{"className":2818},[2819],"edgeLabel",[2568,2821,2825],{"className":2822,"dataId":2717,"transform":2824},[2823],"label","translate(0, 0)",[2826,2827,2829],"foreignObject",{"width":2828,"height":2828},"0",[2830,2831,2836],"div",{"xmlns":2832,"className":2833,"style":2835},"http:\u002F\u002Fwww.w3.org\u002F1999\u002Fxhtml",[2834],"labelBkg","display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;",[2837,2838],"span",{"className":2839},[2819],[2568,2841,2844],{"className":2842,"transform":2843},[2819],"translate(132.05859375, 404.125)",[2568,2845,2848],{"className":2846,"dataId":2726,"transform":2847},[2823],"translate(-13.0546875, -12)",[2826,2849,2852],{"width":2850,"height":2851},"26.109375","24",[2830,2853,2855],{"xmlns":2832,"className":2854,"style":2835},[2834],[2837,2856,2858],{"className":2857},[2819],[15,2859,2860],{},"Yes",[2568,2862,2865],{"className":2863,"transform":2864},[2819],"translate(540.00390625, 549.046875)",[2568,2866,2869],{"className":2867,"dataId":2733,"transform":2868},[2823],"translate(-10.2265625, -12)",[2826,2870,2872],{"width":2871,"height":2851},"20.453125",[2830,2873,2875],{"xmlns":2832,"className":2874,"style":2835},[2834],[2837,2876,2878],{"className":2877},[2819],[15,2879,2880],{},"No",[2568,2882,2885],{"className":2883,"transform":2884},[2819],"translate(116.9453125, 958.9375)",[2568,2886,2888],{"className":2887,"dataId":2740,"transform":2847},[2823],[2826,2889,2890],{"width":2850,"height":2851},[2830,2891,2893],{"xmlns":2832,"className":2892,"style":2835},[2834],[2837,2894,2896],{"className":2895},[2819],[15,2897,2860],{},[2568,2899,2902],{"className":2900,"transform":2901},[2819],"translate(309.87541, 716.62036)",[2568,2903,2905],{"className":2904,"dataId":2747,"transform":2868},[2823],[2826,2906,2907],{"width":2871,"height":2851},[2830,2908,2910],{"xmlns":2832,"className":2909,"style":2835},[2834],[2837,2911,2913],{"className":2912},[2819],[15,2914,2880],{},[2568,2916,2918],{"className":2917},[2819],[2568,2919,2921],{"className":2920,"dataId":2754,"transform":2824},[2823],[2826,2922,2923],{"width":2828,"height":2828},[2830,2924,2926],{"xmlns":2832,"className":2925,"style":2835},[2834],[2837,2927],{"className":2928},[2819],[2568,2930,2933],{"className":2931,"transform":2932},[2819],"translate(383.890625, 1018.9375)",[2568,2934,2936],{"className":2935,"dataId":2761,"transform":2847},[2823],[2826,2937,2938],{"width":2850,"height":2851},[2830,2939,2941],{"xmlns":2832,"className":2940,"style":2835},[2834],[2837,2942,2944],{"className":2943},[2819],[15,2945,2860],{},[2568,2947,2949],{"className":2948},[2819],[2568,2950,2952],{"className":2951,"dataId":2768,"transform":2824},[2823],[2826,2953,2954],{"width":2828,"height":2828},[2830,2955,2957],{"xmlns":2832,"className":2956,"style":2835},[2834],[2837,2958],{"className":2959},[2819],[2568,2961,2964],{"className":2962,"transform":2963},[2819],"translate(665.890625, 958.9375)",[2568,2965,2967],{"className":2966,"dataId":2775,"transform":2868},[2823],[2826,2968,2969],{"width":2871,"height":2851},[2830,2970,2972],{"xmlns":2832,"className":2971,"style":2835},[2834],[2837,2973,2975],{"className":2974},[2819],[15,2976,2880],{},[2568,2978,2980],{"className":2979},[2819],[2568,2981,2983],{"className":2982,"dataId":2782,"transform":2824},[2823],[2826,2984,2985],{"width":2828,"height":2828},[2830,2986,2988],{"xmlns":2832,"className":2987,"style":2835},[2834],[2837,2989],{"className":2990},[2819],[2568,2992,2994],{"className":2993},[2819],[2568,2995,2997],{"className":2996,"dataId":2789,"transform":2824},[2823],[2826,2998,2999],{"width":2828,"height":2828},[2830,3000,3002],{"xmlns":2832,"className":3001,"style":2835},[2834],[2837,3003],{"className":3004},[2819],[2568,3006,3008],{"className":3007},[2819],[2568,3009,3011],{"className":3010,"dataId":2796,"transform":2824},[2823],[2826,3012,3013],{"width":2828,"height":2828},[2830,3014,3016],{"xmlns":2832,"className":3015,"style":2835},[2834],[2837,3017],{"className":3018},[2819],[2568,3020,3022],{"className":3021},[2819],[2568,3023,3025],{"className":3024,"dataId":2803,"transform":2824},[2823],[2826,3026,3027],{"width":2828,"height":2828},[2830,3028,3030],{"xmlns":2832,"className":3029,"style":2835},[2834],[2837,3031],{"className":3032},[2819],[2568,3034,3036],{"className":3035},[2819],[2568,3037,3039],{"className":3038,"dataId":2810,"transform":2824},[2823],[2826,3040,3041],{"width":2828,"height":2828},[2830,3042,3044],{"xmlns":2832,"className":3043,"style":2835},[2834],[2837,3045],{"className":3046},[2819],[2568,3048,3051,3091,3125,3155,3185,3215,3245,3274,3304,3333,3362,3392],{"className":3049},[3050],"nodes",[2568,3052,3059,3070],{"className":3053,"id":3057,"dataLook":2719,"transform":3058},[3054,3055,3056],"node","default","process","mermaid-0-flowchart-A-0","translate(391.41796875, 44)",[3060,3061],"rect",{"className":3062,"style":3065,"x":3066,"y":3067,"width":3068,"height":3069},[3063,3064],"basic","label-container","fill:#f7f7ff !important;stroke:#7b84b6 !important;stroke-width:1px !important","-124","-36","248","72",[2568,3071,3075,3077],{"className":3072,"style":3073,"transform":3074},[2823],"color:#1f2430 !important","translate(-100, -24)",[3060,3076],{},[2826,3078,3081],{"width":3079,"height":3080},"200","48",[2830,3082,3084],{"style":3083,"xmlns":2832},"color: rgb(31, 36, 48) !important; display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;",[2837,3085,3088],{"style":3073,"className":3086},[3087],"nodeLabel",[15,3089,3090],{},"Start: Identify 3rd Party Component",[2568,3092,3097,3103],{"className":3093,"id":3095,"dataLook":2719,"transform":3096},[3054,3055,3094],"decision","mermaid-0-flowchart-B-1","translate(391.41796875, 248.0625)",[2616,3098],{"points":3099,"className":3100,"transform":3101,"style":3102},"120.0625,0 240.125,-120.0625 120.0625,-240.125 0,-120.0625",[3064],"translate(-119.5625, 120.0625)","fill:#eef0ff !important;stroke:#666fb0 !important;stroke-width:1.5px !important",[2568,3104,3107,3109],{"className":3105,"style":3073,"transform":3106},[2823],"translate(-84.0625, -24)",[3060,3108],{},[2826,3110,3112],{"width":3111,"height":3080},"168.125",[2830,3113,3115],{"style":3114,"xmlns":2832},"color: rgb(31, 36, 48) !important; display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;",[2837,3116,3118],{"style":3073,"className":3117},[3087],[15,3119,3120,3121,3124],{},"Is the component still",[3122,3123],"br",{},"supported by a vendor?",[2568,3126,3130,3135],{"className":3127,"id":3128,"dataLook":2719,"transform":3129},[3054,3055,3094],"mermaid-0-flowchart-C-3","translate(132.05859375, 549.046875)",[2616,3131],{"points":3132,"className":3133,"transform":3134,"style":3102},"108.921875,0 217.84375,-108.921875 108.921875,-217.84375 0,-108.921875",[3064],"translate(-108.421875, 108.921875)",[2568,3136,3139,3141],{"className":3137,"style":3073,"transform":3138},[2823],"translate(-72.921875, -24)",[3060,3140],{},[2826,3142,3144],{"width":3143,"height":3080},"145.84375",[2830,3145,3146],{"style":3114,"xmlns":2832},[2837,3147,3149],{"style":3073,"className":3148},[3087],[15,3150,3151,3152,3154],{},"Is there a version for",[3122,3153],{},"the current IDE?",[2568,3156,3160,3165],{"className":3157,"id":3158,"dataLook":2719,"transform":3159},[3054,3055,3094],"mermaid-0-flowchart-D-5","translate(524.890625, 826.453125)",[2616,3161],{"points":3162,"className":3163,"transform":3164,"style":3102},"96.484375,0 192.96875,-96.484375 96.484375,-192.96875 0,-96.484375",[3064],"translate(-95.984375, 96.484375)",[2568,3166,3169,3171],{"className":3167,"style":3073,"transform":3168},[2823],"translate(-60.484375, -24)",[3060,3170],{},[2826,3172,3174],{"width":3173,"height":3080},"120.96875",[2830,3175,3176],{"style":3114,"xmlns":2832},[2837,3177,3179],{"style":3073,"className":3178},[3087],[15,3180,3181,3182,3184],{},"Do you have the",[3122,3183],{},"full source code?",[2568,3186,3190,3195],{"className":3187,"id":3188,"dataLook":2719,"transform":3189},[3054,3055,3056],"mermaid-0-flowchart-E-7","translate(116.9453125, 1150.9375)",[3060,3191],{"className":3192,"style":3065,"x":3193,"y":3067,"width":3194,"height":3069},[3063,3064],"-108.9453125","217.890625",[2568,3196,3199,3201],{"className":3197,"style":3073,"transform":3198},[2823],"translate(-84.9453125, -24)",[3060,3200],{},[2826,3202,3204],{"width":3203,"height":3080},"169.890625",[2830,3205,3206],{"style":3114,"xmlns":2832},[2837,3207,3209],{"style":3073,"className":3208},[3087],[15,3210,3211,3212,3214],{},"Purchase\u002FDownload the",[3122,3213],{},"latest version",[2568,3216,3220,3225],{"className":3217,"id":3218,"dataLook":2719,"transform":3219},[3054,3055,3056],"mermaid-0-flowchart-F-11","translate(116.9453125, 1294.9375)",[3060,3221],{"className":3222,"style":3065,"x":3223,"y":3067,"width":3224,"height":3069},[3063,3064],"-86.25","172.5",[2568,3226,3229,3231],{"className":3227,"style":3073,"transform":3228},[2823],"translate(-62.25, -24)",[3060,3230],{},[2826,3232,3234],{"width":3233,"height":3080},"124.5",[2830,3235,3236],{"style":3114,"xmlns":2832},[2837,3237,3239],{"style":3073,"className":3238},[3087],[15,3240,3241,3242,3244],{},"Install via GetIt or",[3122,3243],{},"Vendor Installer",[2568,3246,3250,3255],{"className":3247,"id":3248,"dataLook":2719,"transform":3249},[3054,3055,3056],"mermaid-0-flowchart-G-13","translate(383.890625, 1150.9375)",[3060,3251],{"className":3252,"style":3065,"x":3066,"y":3253,"width":3068,"height":3254},[3063,3064],"-48","96",[2568,3256,3259,3261],{"className":3257,"style":3073,"transform":3258},[2823],"translate(-100, -36)",[3060,3260],{},[2826,3262,3263],{"width":3079,"height":3069},[2830,3264,3265],{"style":3083,"xmlns":2832},[2837,3266,3268],{"style":3073,"className":3267},[3087],[15,3269,3270,3271,3273],{},"Manually review for",[3122,3272],{},"Unicode & 64-bit compliance",[2568,3275,3279,3284],{"className":3276,"id":3277,"dataLook":2719,"transform":3278},[3054,3055,3056],"mermaid-0-flowchart-H-15","translate(383.890625, 1294.9375)",[3060,3280],{"className":3281,"style":3065,"x":3282,"y":3067,"width":3283,"height":3069},[3063,3064],"-98.265625","196.53125",[2568,3285,3288,3290],{"className":3286,"style":3073,"transform":3287},[2823],"translate(-74.265625, -24)",[3060,3289],{},[2826,3291,3293],{"width":3292,"height":3080},"148.53125",[2830,3294,3295],{"style":3114,"xmlns":2832},[2837,3296,3298],{"style":3073,"className":3297},[3087],[15,3299,3300,3301,3303],{},"Recompile packages",[3122,3302],{},"in new IDE",[2568,3305,3309,3316],{"className":3306,"id":3307,"dataLook":2719,"transform":3308},[3054,3055,367],"mermaid-0-flowchart-I-17","translate(665.890625, 1018.9375)",[3060,3310],{"className":3311,"style":3312,"x":3313,"y":3314,"width":3315,"height":3080},[3063,3064],"fill:#fff4ee !important;stroke:#b5623e !important;stroke-width:1.5px !important","-94.7109375","-24","189.421875",[2568,3317,3320,3322],{"className":3318,"style":3073,"transform":3319},[2823],"translate(-70.7109375, -12)",[3060,3321],{},[2826,3323,3325],{"width":3324,"height":2851},"141.421875",[2830,3326,3327],{"style":3114,"xmlns":2832},[2837,3328,3330],{"style":3073,"className":3329},[3087],[15,3331,3332],{},"Component is Dead",[2568,3334,3338,3343],{"className":3335,"id":3336,"dataLook":2719,"transform":3337},[3054,3055,3056],"mermaid-0-flowchart-J-19","translate(665.890625, 1150.9375)",[3060,3339],{"className":3340,"style":3065,"x":3066,"y":3341,"width":3068,"height":3342},[3063,3064],"-60","120",[2568,3344,3347,3349],{"className":3345,"style":3073,"transform":3346},[2823],"translate(-100, -48)",[3060,3348],{},[2826,3350,3351],{"width":3079,"height":3254},[2830,3352,3353],{"style":3083,"xmlns":2832},[2837,3354,3356],{"style":3073,"className":3355},[3087],[15,3357,3358,3359,3361],{},"Identify Native RTL\u002FVCL alternative",[3122,3360],{},"or find a modern replacement",[2568,3363,3367,3372],{"className":3364,"id":3365,"dataLook":2719,"transform":3366},[3054,3055,3056],"mermaid-0-flowchart-K-21","translate(665.890625, 1294.9375)",[3060,3368],{"className":3369,"style":3065,"x":3370,"y":3067,"width":3371,"height":3069},[3063,3064],"-97.8203125","195.640625",[2568,3373,3376,3378],{"className":3374,"style":3073,"transform":3375},[2823],"translate(-73.8203125, -24)",[3060,3377],{},[2826,3379,3381],{"width":3380,"height":3080},"147.640625",[2830,3382,3383],{"style":3114,"xmlns":2832},[2837,3384,3386],{"style":3073,"className":3385},[3087],[15,3387,3388,3389,3391],{},"Refactor code to use",[3122,3390],{},"the new component",[2568,3393,3398,3404],{"className":3394,"id":3396,"dataLook":2719,"transform":3397},[3054,3055,3395],"terminal","mermaid-0-flowchart-L-23","translate(383.890625, 1402.9375)",[3060,3399],{"className":3400,"style":3401,"x":3402,"y":3314,"width":3403,"height":3080},[3063,3064],"fill:#edf8f1 !important;stroke:#3f7a55 !important;stroke-width:1.5px !important","-43.125","86.25",[2568,3405,3408,3410],{"className":3406,"style":3073,"transform":3407},[2823],"translate(-19.125, -12)",[3060,3409],{},[2826,3411,3413],{"width":3412,"height":2851},"38.25",[2830,3414,3415],{"style":3114,"xmlns":2832},[2837,3416,3418],{"style":3073,"className":3417},[3087],[15,3419,3420],{},"Done",[3422,3423,3424],"defs",{},[3425,3426,3429],"filter",{"id":3427,"height":3428,"width":3428},"mermaid-0-drop-shadow","130%",[3430,3431],"feDropShadow",{"dx":3432,"dy":3432,"stdDeviation":2828,"floodOpacity":3433,"floodColor":3434},"4","0.06","#000000",[3422,3436,3437],{},[3425,3438,3441],{"id":3439,"height":3440,"width":3440},"mermaid-0-drop-shadow-small","150%",[3430,3442],{"dx":3443,"dy":3443,"stdDeviation":2828,"floodOpacity":3433,"floodColor":3434},"2",[554,3445,3447],{"id":3446},"_1-upgrade-supported-components","1. Upgrade Supported Components",[15,3449,3450],{},"Before migrating your own code, audit your vendors. Many vendors provide updated components that take advantage of the latest IDE features.",[127,3452,3453,3458],{},[15,3454,3455],{},[19,3456,3457],{},"Use GetIt first",[32,3459,3460,3465,3468],{},[35,3461,3462,3463,603],{},"Check whether your existing components are now distributed via ",[19,3464,2224],{},[35,3466,3467],{},"Installing via GetIt keeps libraries discoverable and simplifies updates across the team.",[35,3469,3470],{},"Always review vendor release notes for breaking changes before upgrading your projects.",[554,3472,3474],{"id":3473},"_2-handling-source-code-without-vendor-updates","2. Handling Source Code Without Vendor Updates",[15,3476,3477,3478,603],{},"If you rely on an older component that is no longer commercially available, ",[19,3479,3480,3481,3484,3485,3488],{},"having the source code (",[355,3482,3483],{},".pas","\u002F",[355,3486,3487],{},".cpp",") is your lifeline",[32,3490,3491,3494],{},[35,3492,3493],{},"You will need to manually open the package in the new IDE and recompile it.",[35,3495,3496,3497,72,3500,3503,3504,603],{},"Depending on how old it is (e.g., Pre-Delphi 2009), you will need to apply manual fixes for ",[19,3498,3499],{},"Unicode string compatibility",[355,3501,3502],{},"PChar"," casting, and potentially adjust integer sizes if you are also targeting ",[19,3505,3506],{},"64-bit compilation",[367,3508,3509],{},[15,3510,3511,3514,3515,3484,3518,3521,3522,3525],{},[19,3512,3513],{},"When you only have DCUs","\nIf you only have compiled ",[355,3516,3517],{},".dcu",[355,3519,3520],{},".bpl"," files for a component ",[19,3523,3524],{},"and no source",", that component cannot be migrated to a new compiler version. DCUs are compiler-version specific and cannot be “patched” forward.",[554,3527,3529],{"id":3528},"_3-replacing-dead-binary-dependencies","3. Replacing Dead Binary Dependencies",[15,3531,3532,3533,3484,3535,3537,3538,3541,3542,3545],{},"If you have a component where you only possess the compiled ",[355,3534,3517],{},[355,3536,3520],{}," files and the vendor is gone, ",[19,3539,3540],{},"you cannot migrate this component",". DCUs are compiler-version specific. However, ",[19,3543,3544],{},"this isn't the end of the road",". Your next steps are to:",[32,3547,3548,3557],{},[35,3549,3550,3553,3554],{},[19,3551,3552],{},"Audit the RTL\u002FVCL:"," Over the years, Embarcadero has integrated many features into the core VCL and RTL (for example, JSON handling, REST clients, Zip compression, advanced grids). ",[19,3555,3556],{},"What required a 3rd-party tool in Delphi 7 may now be native.",[35,3558,3559,3562],{},[19,3560,3561],{},"Find a Replacement:"," If it's not native, explore GetIt or the broader community for a modern equivalent and budget time to refactor those specific forms.",[24,3564,3566],{"id":3565},"stuck-ask-the-technical-pre-sales-team","Stuck? Ask the Technical Pre-sales Team",[15,3568,3569,3572],{},[19,3570,3571],{},"Talk to a migration specialist:"," Auditing a massive legacy app with dozens of scattered components can be daunting. If you are struggling to map out equivalents for dead components, our technical pre-sales engineers can assist you.",[15,3574,3575],{},"They have guided thousands of customers through these scenarios and can often quickly recognize legacy libraries and recommend the cleanest upgrade path.",{"title":187,"searchDepth":188,"depth":188,"links":3577},[3578,3583],{"id":2540,"depth":188,"text":2541,"children":3579},[3580,3581,3582],{"id":3446,"depth":790,"text":3447},{"id":3473,"depth":790,"text":3474},{"id":3528,"depth":790,"text":3529},{"id":3565,"depth":188,"text":3566},"Third-party components are a massive accelerator for Delphi and C++Builder developers, extending the IDE with advanced UI grids, hardware interfaces, reporting engines, and domain-specific APIs. By leaning on the component ecosystem, you avoid reinventing the wheel and stay focused on your specific business logic.",{"slug":3586},"3rd-party-components","\u002Fupgrading\u002F3rd-party-components",[2483,206],"upgrading",{"title":2491,"description":3584},"upgrade\u002F3rd_party_components.md","upgrading\u002F3rd-party-components","How to audit, replace, and migrate your 3rd party components during an upgrade using our decision framework.","9GSFfI2ZC2v1z5V4fY3cKveMErYwad-Q32TrEQXvyME",{"id":3596,"title":3597,"body":3598,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":3867,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":3868,"extension":197,"isTrackOverview":198,"meta":3869,"navigation":201,"order":202,"path":3871,"personaTags":3872,"routeGroup":3589,"seo":3873,"sourceDoc":3874,"status":210,"stem":3875,"summary":3876,"urgencyHook":3877,"__hash__":3878},"content\u002Fupgrading\u002F64bit.md","64-bit Development",{"type":7,"value":3599,"toc":3856},[3600,3604,3615,3622,3651,3662,3666,3677,3681,3685,3692,3705,3709,3712,3725,3729,3736,3756,3760,3767,3770,3796,3818,3823,3828,3832,3839,3842,3846,3851],[10,3601,3603],{"id":3602},"moving-to-64-bit-development","Moving to 64-bit Development",[15,3605,3606,3607,3610,3611,3614],{},"Since ",[19,3608,3609],{},"Delphi XE2",", developers have been able to build both 32-bit and 64-bit applications from the same codebase. In many cases, moving to 64-bit is straightforward. Often ",[19,3612,3613],{},"as simple as adding a 64-bit target in the project manager and rebuilding",". This simplicity is a major advantage over other languages that require significant type changes to handle platform differences.",[15,3616,3617,3618,3621],{},"As the shift to 64-bit operating systems accelerates across all platforms, adopting 64-bit development has become essential. For RAD Studio users working with Delphi or C++Builder, it ",[19,3619,3620],{},"unlocks better performance, improved memory usage, and a stronger user experience",". Ultimately, moving to 64-bit isn't just a technical upgrade, it's key to keeping applications relevant, efficient, and future-ready.",[367,3623,3624,3629],{},[15,3625,3626],{},[19,3627,3628],{},"Platform deadlines and risk",[32,3630,3631,3638,3641,3644],{},[35,3632,3633,3634,3637],{},"All App Stores require ",[19,3635,3636],{},"64-bit binaries"," and modern target API levels.",[35,3639,3640],{},"macOS has already dropped 32-bit support; Windows is steadily tightening expectations around legacy runtimes.",[35,3642,3643],{},"Relying on WoW64 and legacy toolchains introduces performance overhead and long-term compliance risk.",[35,3645,3646,3647,3650],{},"Treat 64-bit as a ",[19,3648,3649],{},"mandatory"," step in your upgrade plan, not a \"nice to have\".",[270,3652,3653,3659],{},[15,3654,3655],{},[275,3656,3657],{"href":3657,"rel":3658},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=fVBHs8WuEGg",[279],[15,3660,3661],{},"64-bit migration walkthrough with practical examples you can mirror in your own projects.",[24,3663,3665],{"id":3664},"are-32-bit-applications-able-to-run-on-64-bit-operating-systems","Are 32-bit applications able to run on 64-bit operating systems?",[15,3667,3668,3669,3672,3673,3676],{},"Yes, 32-bit applications can run on some 64-bit operating systems. macOS has now moved to 64-bit applications only, while Windows achieves this through a feature known as ",[19,3670,3671],{},"Windows on Windows 64 (WoW64)",". WoW64 is an emulation layer that allows 32-bit applications to execute on 64-bit versions of Windows. It intercepts and translates the necessary system calls from 32-bit to 64-bit, ensuring that the application runs correctly without modification. This compatibility layer isolates 32-bit applications so they can function alongside native 64-bit applications while providing a smoother transition. While this is helpful from a usability point of view, ",[19,3674,3675],{},"it does add overhead to the operating system",", so you should plan to reduce your reliance on it over time.",[24,3678,3680],{"id":3679},"key-differences-between-32-bit-and-64-bit-development","Key Differences Between 32-bit and 64-bit Development",[554,3682,3684],{"id":3683},"size-of-pointers-and-integers","Size of Pointers and Integers",[15,3686,3687,3688,3691],{},"One of the fundamental changes when moving to 64-bit is the ",[19,3689,3690],{},"size of pointers and integers",". In a 32-bit environment, pointers and most integers are 4 bytes in size. However, in a 64-bit environment, pointers expand to 8 bytes, allowing applications to address a significantly larger memory space. When copying data, you must use the right methods and be sure the sizes of the types used match.",[15,3693,3694,3695,3700,3701,3704],{},"RAD Studio has made some changes to the types to allow for 32-bit and 64-bit sizing. The newer ",[19,3696,3697],{},[355,3698,3699],{},"NativeInt"," is 4 bytes on 32-bit platforms and 8 bytes on 64-bit platforms, whereas an ",[355,3702,3703],{},"Integer"," always remains 4 bytes. Choosing the right type can ensure compatibility with other methods being called, and also help reduce memory usage and ensure faster processing.",[554,3706,3708],{"id":3707},"use-of-assembly-code","Use of Assembly Code",[15,3710,3711],{},"Assembly code can be more complex in a 64-bit environment due to the increased number of registers and the different calling conventions. While 32-bit assembly code can often be more straightforward, 64-bit assembly provides more flexibility and power, allowing for better optimization and performance.",[15,3713,3714,3715,3718,3719,3724],{},"In short, it is recommended to ",[19,3716,3717],{},"remove Assembly from your methods"," unless you really need to use it. If you do need to use Assembly, then you can use the correct ",[275,3720,3723],{"href":3721,"rel":3722},"https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FUsing_Inline_Assembly_Code#Using_Conditional_Defines_for_Cross-Platform_Code",[279],"Inline Conditional Defines (IFDEFs)"," to wrap that code for the platform required. Assembly should also be in its own function\u002Fprocedure to enable correct compilation.",[24,3726,3728],{"id":3727},"transitioning-with-rad-studio","Transitioning with RAD Studio",[15,3730,3731,3732,3735],{},"The good news for Delphi and C++Builder developers is that ",[19,3733,3734],{},"RAD Studio's run-time libraries are designed to support 64-bit development",". In many instances, the process is as simple as adding a new target platform in your project settings. Here's how RAD Studio makes the migration straightforward:",[32,3737,3738,3744,3750],{},[35,3739,3740,3743],{},[19,3741,3742],{},"Integrated Libraries",": The run-time libraries are already optimized for 64-bit, reducing the need for extensive code rewrites.",[35,3745,3746,3749],{},[19,3747,3748],{},"Multi-Target Projects",": Easily configure your projects to build for both 32-bit and 64-bit platforms, ensuring compatibility and performance across different systems.",[35,3751,3752,3755],{},[19,3753,3754],{},"Debugging and Testing",": Utilize RAD Studio's robust debugging and testing tools to ensure your 64-bit applications are stable and performant.",[24,3757,3759],{"id":3758},"the-64-bit-rad-studio-ide","The 64-bit RAD Studio IDE",[15,3761,3762,3763,3766],{},"64-bit migration is not only about the applications you ship. ",[19,3764,3765],{},"Since RAD Studio 12.3",", there is a native 64-bit IDE, and from RAD Studio 13.0 onward it is included in the standard installation.",[15,3768,3769],{},"The 32-bit and 64-bit IDEs are compatible with the same projects and can be used side by side. Teams can move between both IDEs as needed, and even run both at the same time during migration and validation work.",[32,3771,3772,3778,3784,3790],{},[35,3773,3774,3777],{},[19,3775,3776],{},"More IDE memory headroom",": The 64-bit IDE runs as a 64-bit process, so very large solutions and heavy builds are not constrained by the 32-bit process ceiling.",[35,3779,3780,3783],{},[19,3781,3782],{},"Aligned 64-bit toolchain",": The 64-bit IDE uses the 64-bit Delphi compiler, with C++ Win64 Modern for Windows C++ targets.",[35,3785,3786,3789],{},[19,3787,3788],{},"Core productivity features",": VCL and FMX form design, code editing, debugging, FireDAC, RTLs etc, are all available for Win64-focused development.",[35,3791,3792,3795],{},[19,3793,3794],{},"Clear mode indicator",": The title bar, taskbar icon, splash screen, and About dialog indicate when you are running the 64-bit IDE.",[127,3797,3798,3803],{},[15,3799,3800],{},[19,3801,3802],{},"Requirements for IDE migration",[32,3804,3805,3812],{},[35,3806,3807,3808,3811],{},"Design-time packages, experts, and plugins must be built for ",[19,3809,3810],{},"Win64"," to load in the 64-bit IDE. This includes third-party visual component packages.",[35,3813,3814,3815,603],{},"Database design-time connectivity from the 64-bit IDE depends on ",[19,3816,3817],{},"64-bit database drivers",[174,3819],{"description":3820,"icon":177,"title":3821,"url":3822},"Authoritative side-by-side feature comparison for both IDE versions.","64-bit and 32-bit IDE Features","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002F64-bit_and_32-bit_IDE_Features",[174,3824],{"description":3825,"icon":177,"title":3826,"url":3827},"Official reference for the RAD Studio 64-bit IDE, including target platforms, debugger details, and package setup guidance.","64-bit IDE","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002F64-bit_IDE",[24,3829,3831],{"id":3830},"getting-started","Getting Started",[15,3833,3834,3835,3838],{},"To start your 64-bit migration, ",[19,3836,3837],{},"add the 64-bit target to your existing project",". RAD Studio will handle much of the work required to build for the new architecture. With some focused adjustments, you'll be able to benefit from the capabilities of modern 64-bit systems. Remember, the Embarcadero Sales Engineering Team have helped thousands of customers move forward over the years and are happy to point you toward the resources you need.",[15,3840,3841],{},"Adopting 64-bit development with RAD Studio positions your applications for future operating system and store requirements without a full rewrite.",[24,3843,3845],{"id":3844},"additional-resources","Additional Resources",[174,3847],{"description":3848,"icon":177,"title":3849,"url":3850},"Official step-by-step guide covering pointer sizes, type changes, and compiler settings.","Converting 32-bit Delphi Applications to 64-bit Windows","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FConverting_32-bit_Delphi_Applications_to_64-bit_Windows",[174,3852],{"description":3853,"icon":183,"title":3854,"url":3855},"A practical overview of what actually changes when targeting 64-bit, with common gotchas explained.","Delphi 64-bit Code: What's Different, What's the Same","https:\u002F\u002Fdelphiaball.co.uk\u002F2016\u002F02\u002F16\u002Fdelphi-64bit-code\u002F",{"title":187,"searchDepth":188,"depth":188,"links":3857},[3858,3859,3863,3864,3865,3866],{"id":3664,"depth":188,"text":3665},{"id":3679,"depth":188,"text":3680,"children":3860},[3861,3862],{"id":3683,"depth":790,"text":3684},{"id":3707,"depth":790,"text":3708},{"id":3727,"depth":188,"text":3728},{"id":3758,"depth":188,"text":3759},{"id":3830,"depth":188,"text":3831},{"id":3844,"depth":188,"text":3845},"Try the 64-bit target today","Since Delphi XE2, developers have been able to build both 32-bit and 64-bit applications from the same codebase. In many cases, moving to 64-bit is straightforward. Often as simple as adding a 64-bit target in the project manager and rebuilding. This simplicity is a major advantage over other languages that require significant type changes to handle platform differences.",{"slug":3870},"64bit","\u002Fupgrading\u002F64bit",[2483,206],{"title":3597,"description":3868},"upgrade\u002F64bit_development.md","upgrading\u002F64bit","Escape the 32-bit memory ceiling for your app and the RAD Studio IDE itself. Build 64-bit applications and use both RAD Studio IDEs side by side in the same workflow.","32-bit processes are hard-capped at 4GB of addressable memory, a real ceiling for data-heavy or large-scale applications. The WoW64 emulation layer also adds runtime overhead on Windows. Moving to 64-bit removes both constraints and future-proofs your codebase across all target platforms.","yQm6b98sxTBUOmkLyMsoL_-2L7hcfenrOooqeqjIJuU",{"id":3880,"title":3881,"body":3882,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":4286,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":4287,"extension":197,"isTrackOverview":198,"meta":4288,"navigation":201,"order":790,"path":4290,"personaTags":4291,"routeGroup":3589,"seo":4292,"sourceDoc":4293,"status":210,"stem":4294,"summary":4295,"urgencyHook":4296,"__hash__":4297},"content\u002Fupgrading\u002Ffiredac.md","Moving to FireDAC",{"type":7,"value":3883,"toc":4276},[3884,3887,3894,3898,3905,3926,3933,3940,3964,3968,3978,3988,4005,4017,4023,4046,4050,4053,4109,4113,4116,4145,4155,4161,4184,4198,4200,4204,4209,4214,4219,4235,4239,4244,4262],[10,3885,3881],{"id":3886},"moving-to-firedac",[15,3888,3889,3890,3893],{},"RAD Studio has a long tradition of providing components for connecting to data. In fact, ",[19,3891,3892],{},"the Delphi project name came from the Greek stories"," that stated to get to the Oracle, you go to Delphi.",[554,3895,3897],{"id":3896},"the-bde-era","The BDE era",[15,3899,3900,3901,3904],{},"Those who started working with Delphi or C++Builder in the 1990s or early 2000s would likely be familiar with the ",[19,3902,3903],{},"BDE (Borland Database Engine)",". In its time, BDE was a software library (similar to ODBC) that allowed developers to write complex database applications in a matter of minutes.",[15,3906,3907,3910,3911,3914,3915,3918,3919,1656,3922,3925],{},[19,3908,3909],{},"Why the stack started to hurt:"," While BDE was still widely used for flat-file and desktop database engines such as Paradox and dBase, Embarcadero developers knew they also needed a more robust library to work with relational databases that were swiftly gaining popularity such as MySQL, MSSQL, Oracle, etc. Therefore, Embarcadero released ",[19,3912,3913],{},"DBExpress"," components that unified performance and transactional speed with the RDBMS. The catch was ",[19,3916,3917],{},"DBExpress's dataset model being largely unidirectional","; teams that needed bi-directional navigation for edit\u002Frefresh workflows often ended up adding extra plumbing like ",[355,3920,3921],{},"DataSetProvider",[355,3923,3924],{},"TClientDataSet",". The result was that many applications ran a mix of BDE and\u002For DBExpress, depending on which data path they were stuck supporting.",[15,3927,3928,3929,3932],{},"As the world moved from flat file databases to relational databases to embedded databases to NoSQL databases and simultaneously using them within the application, ",[19,3930,3931],{},"it was becoming harder for developers to keep different libraries working together","; forms and data modules would be littered with dataset-interacting components, plus the supporting layers needed to get the expected bi-directional behavior.",[15,3934,3935,3936,3939],{},"To add to their woes, as databases got more complex, ",[19,3937,3938],{},"libraries such as BDE and DBExpress started to feel constraints"," both in terms of functionality as well as speed.",[367,3941,3942,3947],{},[15,3943,3944],{},[19,3945,3946],{},"Why BDE and old stacks are now a risk",[32,3948,3949,3955,3961],{},[35,3950,3951,3954],{},[19,3952,3953],{},"BDE"," has 16-bit dependencies and has been deprecated since 2002; it does not support 64-bit or cross-platform applications.",[35,3956,3957,3960],{},[19,3958,3959],{},"dbGo\u002FADO"," relies on Microsoft installers that keep changing location and behaviour, and is strictly Windows-only.",[35,3962,3963],{},"As you move toward Unicode, 64-bit, and Linux targets, relying on these older stacks becomes increasingly fragile.",[24,3965,3967],{"id":3966},"enter-firedac","Enter FireDAC",[15,3969,3970,3973,3974,3977],{},[19,3971,3972],{},"A unifying road map:"," To counter the above issues and set a compatible path for a foreseeable distant future, developers at Embarcadero released ",[19,3975,3976],{},"FireDAC: a one stop solution"," that allows interfacing with almost every popular open source or commercial database out there.",[15,3979,3980,3981,3984,3985,603],{},"FireDAC is RAD Studio's ",[19,3982,3983],{},"cross-platform database access library",", featuring a range of components and classes designed to simplify connections to most leading databases. Its open architecture allows for the integration of additional data sources, enabling developers to treat them seamlessly like a ",[355,3986,3987],{},"TDataSet",[15,3989,3990,3991,3994,3995,72,3998,72,4001,4004],{},"Written from the ground up as a BDE replacement, FireDAC offers ",[19,3992,3993],{},"bi-directional dataset navigation"," and automatic translation of comparable field types (e.g., ",[355,3996,3997],{},"Timestamps",[355,3999,4000],{},"TSQLTimeStamp",[355,4002,4003],{},"TDateTime",").",[15,4006,4007,4008,1719,4010,4012,4013,4016],{},"That means teams can avoid the extra plumbing often required with unidirectional stacks (such as ",[355,4009,3921],{},[355,4011,3924],{},") and focus on ",[19,4014,4015],{},"faster, lower-risk migration",". It also helps you move past BDE's legacy 16-bit dependency as you target modern 64-bit and cross-platform applications.",[15,4018,4019,4020,603],{},"Moreover, FireDAC includes numerous speed and stability enhancements compared to other database components, significantly reducing network traffic while boosting the performance and reliability of data connections. It's not uncommon to hear developers say ",[19,4021,4022],{},"\"I moved to FireDAC and now my Application is 20% faster\"",[57,4024,4025,4030],{},[15,4026,4027],{},[19,4028,4029],{},"FireDAC value, in plain terms",[32,4031,4032,4040,4043],{},[35,4033,4034,4035,1719,4037,4039],{},"Bi-directional dataset navigation out of the box (no need to bolt on ",[355,4036,3921],{},[355,4038,3924],{}," for edit\u002Frefresh workflows)",[35,4041,4042],{},"A true BDE replacement, so migration is more rapid and low risk",[35,4044,4045],{},"Moving past BDE's legacy 16-bit dependencies as you target modern 64-bit and cross-platform data access",[24,4047,4049],{"id":4048},"why-move-to-firedac","Why Move to FireDAC?",[15,4051,4052],{},"Due to the broad range of databases FireDAC supports, each with a native layer driver, it can be a good choice to replace ANY past or present database components. The top reasons for switching to FireDAC include…",[4054,4055,4056,4070],"table",{},[4057,4058,4059],"thead",{},[4060,4061,4062,4067],"tr",{},[4063,4064,4066],"th",{"align":4065},"left","Currently Using",[4063,4068,4069],{"align":4065},"Reason",[4071,4072,4073,4081,4089,4101],"tbody",{},[4060,4074,4075,4078],{},[4076,4077,3953],"td",{"align":4065},[4076,4079,4080],{"align":4065},"Still has some 16-bit dependency. It's been deprecated since 2002. While people can still get it to work, it doesn't support 64-bit or cross-platform applications.",[4060,4082,4083,4086],{},[4076,4084,4085],{"align":4065},"ADO",[4076,4087,4088],{"align":4065},"Microsoft are making it harder to get ADO installed. The installer keeps changing where it's accessed from, and is Windows specific. Features like \"fetching blobs on demand\" make FireDAC much faster to use vs ADO.",[4060,4090,4091,4093],{},[4076,4092,3913],{"align":4065},[4076,4094,4095,4096,1719,4098,4100],{"align":4065},"The original BDE replacement, but its unidirectional dataset model often required extra plumbing (such as ",[355,4097,3921],{},[355,4099,3924],{},") to get the bi-directional navigation and editing workflows teams expected. DBExpress is now superseded by FireDAC, which has a much smoother migration path.",[4060,4102,4103,4106],{},[4076,4104,4105],{"align":4065},"IBX",[4076,4107,4108],{"align":4065},"Great when you are staying InterBase\u002FFirebird-only, but teams often move to FireDAC for broader database portability and modern features like unified driver options, pooling, and advanced fetch controls.",[24,4110,4112],{"id":4111},"how-to-migrate-to-firedac","How to Migrate to FireDAC?",[15,4114,4115],{},"Migration typically involves four steps:",[106,4117,4118,4124,4133,4139],{},[35,4119,4120,4123],{},[19,4121,4122],{},"Replace data access components"," on forms and data modules with FireDAC equivalents.",[35,4125,4126,4132],{},[19,4127,4128,4129,4131],{},"Update ",[355,4130,518],{}," clauses"," and connection configuration.",[35,4134,4135,4138],{},[19,4136,4137],{},"Review hand-written SQL"," or vendor-specific features that might behave differently.",[35,4140,4141,4144],{},[19,4142,4143],{},"Test performance and concurrency"," under realistic load.",[15,4146,4147,4148,4151,4152,603],{},"There is no doubt that some refactoring is required when changing libraries. But thanks to Embarcadero's design of the database libraries, up to ",[19,4149,4150],{},"80% of the work"," can be handled by search-and-replace over source code and form files using ",[19,4153,4154],{},"reFind",[15,4156,4157,4158,4160],{},"reFind is a utility that automatically converts Delphi files from one component set to another. It includes example script files for BDE, ADO, DBExpress, and IBX so you can get productive quickly. It takes care of replacing components, updating ",[355,4159,518],{}," clauses, and basic code modifications so you can get back to compiling fast.",[127,4162,4163,4168,4171,4176,4179],{},[15,4164,4165],{},[19,4166,4167],{},"reFind file locations",[15,4169,4170],{},"The tool is installed with RAD Studio:",[15,4172,4173],{},[355,4174,4175],{},"C:\\Program Files (x86)\\Embarcadero\\Studio\\\u003Cversion>\\bin\\reFind.exe",[15,4177,4178],{},"Common migration scripts ship here:",[15,4180,4181],{},[355,4182,4183],{},"C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\\u003Cversion>\\Samples\\Object Pascal\\Database\\FireDAC\\Tool\\reFind\\BDE2FDMigration\\FireDAC_Migrate_BDE.txt",[270,4185,4186,4192],{},[15,4187,4188],{},[275,4189,4190],{"href":4190,"rel":4191},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=_ttdy9_2rWo",[279],[15,4193,4194,4195,603],{},"Short walkthrough of using reFind for BDE\u002FADO\u002FDBExpress migration. The practical demo runs from ",[19,4196,4197],{},"00:08:39 to 00:11:40",[24,4199,3845],{"id":3844},[554,4201,4203],{"id":4202},"articles-and-migration-scripts","Articles and Migration Scripts",[174,4205],{"description":4206,"icon":177,"title":4207,"url":4208},"Official guide covering component mapping, connection configuration, and SQL dialect differences for BDE projects.","Migrating BDE Applications to FireDAC","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FMigrating_BDE_Applications_to_FireDAC",[174,4210],{"description":4211,"icon":177,"title":4212,"url":4213},"Covers the transition from unidirectional dbExpress datasets to FireDAC's bi-directional model.","Migrating dbExpress Applications to FireDAC","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FMigrating_dbExpress_Applications_to_FireDAC",[174,4215],{"description":4216,"icon":177,"title":4217,"url":4218},"Official IBX-to-FireDAC migration notes, including the `IBX2FDMigration` reFind script.","Migrating IBX Applications to FireDAC","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002FFlorence\u002Fen\u002FMigrating_IBX_Applications_to_FireDAC",[127,4220,4221,4227,4232],{},[15,4222,4223,4226],{},[19,4224,4225],{},"Predefined reFind scripts"," are installed with RAD Studio at:",[15,4228,4229],{},[355,4230,4231],{},"C:\\Users\\Public\\Documents\\Embarcadero\\Studio\\\u003Cversion>\\Samples\\Object Pascal\\Database\\FireDAC\\Tool\\reFind",[15,4233,4234],{},"These include migration scripts for BDE, ADO, dbExpress, and IBX.",[554,4236,4238],{"id":4237},"deep-dive-videos","Deep-Dive Videos",[15,4240,4241],{},[540,4242,4243],{},"Some reference videos are from slightly older versions of RAD Studio; UI details may differ, but the process remains the same.",[270,4245,4246,4252],{},[15,4247,4248],{},[275,4249,4250],{"href":4250,"rel":4251},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=97oV-y2GwQQ",[279],[15,4253,4254,4257,4258,4261],{},[19,4255,4256],{},"FireDAC Migration Made Easy:"," BDE, dbExpress, AnyDAC to FireDAC. Skip to ",[19,4259,4260],{},"00:10:42"," for the practical migration steps.",[270,4263,4264,4270],{},[15,4265,4266],{},[275,4267,4268],{"href":4268,"rel":4269},"https:\u002F\u002Fyoutu.be\u002Fi6Mi7w6Z4TY?si=Wftf8niHkAZ0jwaQ&t=1030",[279],[15,4271,4272,4275],{},[19,4273,4274],{},"Converting Legacy Projects to 10.4."," This link jumps straight into the BDE conversion segment.",{"title":187,"searchDepth":188,"depth":188,"links":4277},[4278,4279,4280,4281,4282],{"id":3896,"depth":790,"text":3897},{"id":3966,"depth":188,"text":3967},{"id":4048,"depth":188,"text":4049},{"id":4111,"depth":188,"text":4112},{"id":3844,"depth":188,"text":3845,"children":4283},[4284,4285],{"id":4202,"depth":790,"text":4203},{"id":4237,"depth":790,"text":4238},"Try reFind today","RAD Studio has a long tradition of providing components for connecting to data. In fact, the Delphi project name came from the Greek stories that stated to get to the Oracle, you go to Delphi.",{"slug":4289},"firedac","\u002Fupgrading\u002Ffiredac",[2483,206,1218,401],{"title":3881,"description":4287},"upgrade\u002Fmoving_to_firedac.md","upgrading\u002Ffiredac","Brief history of BDE to DBExpress to FireDAC; why FireDAC is the right choice with up to 20% performance improvement.","BDE deprecated since 2002, removed from installer since XE8, no 64-bit support. ADO installer increasingly problematic.","2Tz-TjyqP8U6CSJzbuWaCuiOhXfa3VFfm3ujMEDY4wo",{"id":4299,"title":4300,"body":4301,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":187,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":4456,"extension":197,"isTrackOverview":198,"meta":4457,"navigation":201,"order":398,"path":4459,"personaTags":4460,"routeGroup":3589,"seo":4461,"sourceDoc":4462,"status":210,"stem":4463,"summary":4464,"urgencyHook":187,"__hash__":4465},"content\u002Fupgrading\u002Fhelp-files.md","Help File Modernisation",{"type":7,"value":4302,"toc":4451},[4303,4306,4317,4320,4338,4342,4353,4357,4360,4391,4395,4398,4416,4448],[10,4304,4300],{"id":4305},"help-file-modernisation",[15,4307,4308,4309,4312,4313,4316],{},"While migrating help files from the traditional ",[19,4310,4311],{},"CHM format"," may not be a core feature of RAD Studio itself, it remains an important task for developers using Delphi and C++Builder. As applications evolve and adapt to modern operating systems, ensuring that your documentation remains accessible and user-friendly is essential. With the changing requirements of Windows help file handling, developers must proactively update their help systems to ",[19,4314,4315],{},"maintain reliable user support and comply with the latest security standards",". This migration improves the user experience and helps your applications remain robust and professional in a competitive market.",[15,4318,4319],{},"There are many tools that can help convert CHM to other formats quickly (a quick search will find many). But we hope this section is informative and helps you move forward.",[367,4321,4322,4327],{},[15,4323,4324],{},[19,4325,4326],{},"Why CHM is becoming a liability",[32,4328,4329,4332,4335],{},[35,4330,4331],{},"Modern Windows versions apply stricter security rules to CHM files, especially when opened from network locations.",[35,4333,4334],{},"Users may see scary warnings or blocked content, even when the help file itself is fine.",[35,4336,4337],{},"These behaviours can generate support tickets and undermine confidence in your application.",[24,4339,4341],{"id":4340},"the-evolution-of-windows-help-file-requirements","The Evolution of Windows Help File Requirements",[15,4343,4344,4345,4348,4349,4352],{},"Historically, CHM files were a popular choice for providing user assistance in Windows applications due to their compact size and the ability to include rich text, images, and navigation. However, as Windows evolved, so did its security and compatibility requirements. ",[19,4346,4347],{},"Starting with Windows Vista",", stricter security protocols were implemented, impacting how CHM files were handled. These changes included ",[19,4350,4351],{},"restrictions on running CHM files from network locations"," and heightened security warnings, which could disrupt the user experience.",[24,4354,4356],{"id":4355},"modern-help-file-solutions","Modern Help File Solutions",[15,4358,4359],{},"To align with the latest Windows requirements and to enhance user experience, consider migrating to more modern help file formats such as:",[32,4361,4362,4368,4374],{},[35,4363,4364,4367],{},[19,4365,4366],{},"HTML5",": Utilizing web-based documentation allows for interactive, responsive, and easily updatable help content. It can be hosted online or included with your application as local web files.",[35,4369,4370,4373],{},[19,4371,4372],{},"PDF",": A widely accepted format for detailed, print-friendly documentation. PDF files are easy to distribute and can be viewed on almost any device.",[35,4375,4376,4379,4380,519,4385,4390],{},[19,4377,4378],{},"Third-Party Help Systems",": Tools like MadCap Flare or Help+Manual offer advanced features for creating and managing help content, including multi-format output, version control, and collaboration capabilities. If your goal is online docs, solutions like ",[275,4381,4384],{"href":4382,"rel":4383},"https:\u002F\u002Fsquidfunk.github.io\u002Fmkdocs-material\u002F",[279],"mkdocs material",[275,4386,4389],{"href":4387,"rel":4388},"https:\u002F\u002Fdocusaurus.io\u002F",[279],"docusaurus"," are popular opensource options.",[24,4392,4394],{"id":4393},"steps-for-migration","Steps for Migration",[15,4396,4397],{},"Before committing to a full migration, take a moment to plan:",[32,4399,4400,4410,4413],{},[35,4401,4402,4403,72,4406,4409],{},"Decide whether your next help system should be ",[19,4404,4405],{},"local-only",[19,4407,4408],{},"online",", or a hybrid.",[35,4411,4412],{},"Prototype a small subset of your existing CHM content in the new format before committing fully.",[35,4414,4415],{},"Plan how your application will open and navigate the new help content (URLs, context IDs, search, and so on).",[106,4417,4418,4424,4430,4436,4442],{},[35,4419,4420,4423],{},[19,4421,4422],{},"Evaluate Current Content",": Review your existing CHM files to determine what content needs to be updated or restructured.",[35,4425,4426,4429],{},[19,4427,4428],{},"Choose a New Format",": Decide whether HTML5, PDF, or another format best suits your application’s needs and user preferences.",[35,4431,4432,4435],{},[19,4433,4434],{},"Convert Content",": Use conversion tools or manually migrate the content to the new format. Ensure that links, images, and navigation elements are preserved and functional.",[35,4437,4438,4441],{},[19,4439,4440],{},"Integrate with Application",": Update your application to link to the new help files. For web-based help, ensure that your application points to the correct URLs.",[35,4443,4444,4447],{},[19,4445,4446],{},"Test",": Thoroughly test the new help system to ensure that all content is accessible and displays correctly across different devices and operating systems.",[15,4449,4450],{},"By migrating from CHM to more modern help file formats, you can improve compatibility with current and future Windows versions, enhance security, and provide a better overall user experience.",{"title":187,"searchDepth":188,"depth":188,"links":4452},[4453,4454,4455],{"id":4340,"depth":188,"text":4341},{"id":4355,"depth":188,"text":4356},{"id":4393,"depth":188,"text":4394},"While migrating help files from the traditional CHM format may not be a core feature of RAD Studio itself, it remains an important task for developers using Delphi and C++Builder. As applications evolve and adapt to modern operating systems, ensuring that your documentation remains accessible and user-friendly is essential. With the changing requirements of Windows help file handling, developers must proactively update their help systems to maintain reliable user support and comply with the latest security standards. This migration improves the user experience and helps your applications remain robust and professional in a competitive market.",{"slug":4458},"help-files","\u002Fupgrading\u002Fhelp-files",[2483,206],{"title":4300,"description":4456},"upgrade\u002Fhelp_file_modernization.md","upgrading\u002Fhelp-files","Why CHM is problematic on modern Windows and the modern alternatives like HTML5, PDF, or third-party help systems.","8Bz7NwQVUgVXnhRlM7rgFnPWSGldcut9Bzu-BcA0JYo",{"id":4467,"title":4468,"body":4469,"ctaPrimary":4491,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":1268,"ctaSecondaryLink":195,"ctaSecondaryType":1269,"description":4477,"extension":197,"isTrackOverview":201,"meta":4492,"navigation":201,"order":195,"path":4493,"personaTags":195,"routeGroup":3589,"seo":4494,"sourceDoc":195,"status":210,"stem":4495,"summary":4496,"urgencyHook":195,"__hash__":4497},"content\u002Fupgrading\u002Findex.md","The Upgrading Track",{"type":7,"value":4470,"toc":4489},[4471,4475,4478,4481],[10,4472,4474],{"id":4473},"secure-your-foundation","Secure Your Foundation",[15,4476,4477],{},"The Upgrading Track is focused on resolving technical debt. Before you can add modern UI paradigms or mobile cross-compilation to a legacy application, the structural foundation of the code must be sound.",[15,4479,4480],{},"If your codebase is stuck on an older version of Delphi (like Delphi 7, 2007, or even early Unicode versions), attempting to compile it in the latest RAD Studio release will inevitably trigger some errors. The guides in this track break down the most common migration hurdles into manageable, logical steps.",[1153,4482,4483],{},[15,4484,4485,4488],{},[19,4486,4487],{},"Not sure where to start?"," Talk to an upgrade specialist to map out a custom checklist for your exact starting version.",{"title":187,"searchDepth":188,"depth":188,"links":4490},[],"Talk to an upgrade specialist",{},"\u002Fupgrading",{"title":4468,"description":4477},"upgrading\u002Findex","Essential steps to modernize your legacy Delphi and C++Builder codebase, ensuring compatibility, security, and performance on the latest RAD Studio release.","vFaeOTCEPNPrATFcVcvLCzEk3vULggYxjBnRu_K0MH4",{"id":4499,"title":4500,"body":4501,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":187,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":4509,"extension":197,"isTrackOverview":198,"meta":5348,"navigation":201,"order":1215,"path":5350,"personaTags":5351,"routeGroup":3589,"seo":5352,"sourceDoc":5353,"status":210,"stem":5354,"summary":5355,"urgencyHook":187,"__hash__":5356},"content\u002Fupgrading\u002Flanguage-and-libraries.md","Language & Libraries",{"type":7,"value":4502,"toc":5337},[4503,4507,4510,4521,4550,4553,4557,4566,4689,4694,4698,4711,4844,4849,4853,4859,4873,4939,4944,4948,4951,4959,4963,4968,5023,5028,5032,5045,5102,5107,5111,5130,5223,5228,5232,5235,5283,5288,5293,5298,5303,5308,5312,5323,5334],[10,4504,4506],{"id":4505},"evolving-with-modern-object-pascal","Evolving with Modern Object Pascal",[15,4508,4509],{},"Delphi and C++Builder have been foundational tools for enterprise application development for nearly three decades. As a result, many codebases have remained largely untouched at the core language level, which is a testament to the stability of the platform. \"If it isn't broken, don't fix it\" is a prudent business strategy.",[15,4511,4512,4513,4516,4517,4520],{},"However, ",[19,4514,4515],{},"remaining statically on older language syntax carries an invisible cost",". Modern language features aren't just syntactic sugar; they are designed to improve code stability, reduce memory leaks, simplify complex logic, and prepare the application for architecture changes. Furthermore, as you begin updating 3rd-party libraries, you will inevitably encounter newer language constructs. Understanding and using these features early ",[19,4518,4519],{},"makes your migration smoother"," and increases the long-term maintainability of your core intellectual property.",[57,4522,4523,4528],{},[15,4524,4525],{},[19,4526,4527],{},"When to prioritise language updates",[32,4529,4530,4544,4547],{},[35,4531,4532,4533,72,4536,4539,4540,4543],{},"When you are already modifying code for ",[19,4534,4535],{},"Unicode",[19,4537,4538],{},"64-bit",", or ",[19,4541,4542],{},"FireDAC"," migration.",[35,4545,4546],{},"When bringing in frameworks (REST, FMX, RAD Server) that rely on modern constructs.",[35,4548,4549],{},"When the team is fighting duplicated boilerplate or manual memory management issues.",[15,4551,4552],{},"The Delphi language has changed significantly starting around 2009. Here are the core modern language features you should be using in your upgraded applications.",[24,4554,4556],{"id":4555},"anonymous-methods","Anonymous Methods",[15,4558,4559,4560,4562,4563,603],{},"Before 2009, every method had to have a name, and it was impossible to compile code containing a procedure or function that lacked one. This changed with the introduction of ",[19,4561,4556],{},". You can now embed and assign a nameless method directly to a method pointer variable, or pass it as an argument to other methods. This is incredibly useful for ",[19,4564,4565],{},"inline event handling and asynchronous callbacks",[4567,4568,4572],"pre",{"className":4569,"code":4570,"language":4571,"meta":187,"style":187},"language-pascal shiki shiki-themes github-dark","type\n  TFuncOfInt = reference to function(x: Integer): Integer;\n...\nfunction MakeAdder(y: Integer): TFuncOfInt;\nbegin\n  Result := { start anonymous method } function(x: Integer) : Integer\n  begin\n    Result := x + y;\n  end; { end anonymous method }\nend;\n","pascal",[355,4573,4574,4581,4606,4611,4628,4633,4655,4660,4669,4681],{"__ignoreMap":187},[2837,4575,4577],{"class":4576,"line":2480},"line",[2837,4578,4580],{"class":4579},"snl16","type\n",[2837,4582,4583,4587,4590,4593,4596,4598,4601,4603],{"class":4576,"line":188},[2837,4584,4586],{"class":4585},"s95oV","  TFuncOfInt = ",[2837,4588,4589],{"class":4579},"reference",[2837,4591,4592],{"class":4579}," to",[2837,4594,4595],{"class":4585}," function(x: ",[2837,4597,3703],{"class":4579},[2837,4599,4600],{"class":4585},"): ",[2837,4602,3703],{"class":4579},[2837,4604,4605],{"class":4585},";\n",[2837,4607,4608],{"class":4576,"line":790},[2837,4609,4610],{"class":4585},"...\n",[2837,4612,4613,4616,4620,4623,4625],{"class":4576,"line":1215},[2837,4614,4615],{"class":4579},"function",[2837,4617,4619],{"class":4618},"svObZ"," MakeAdder",[2837,4621,4622],{"class":4585},"(y: ",[2837,4624,3703],{"class":4579},[2837,4626,4627],{"class":4585},"): TFuncOfInt;\n",[2837,4629,4630],{"class":4576,"line":202},[2837,4631,4632],{"class":4579},"begin\n",[2837,4634,4635,4638,4641,4645,4647,4649,4652],{"class":4576,"line":800},[2837,4636,4637],{"class":4579},"  Result",[2837,4639,4640],{"class":4585}," := ",[2837,4642,4644],{"class":4643},"sAwPA","{ start anonymous method }",[2837,4646,4595],{"class":4585},[2837,4648,3703],{"class":4579},[2837,4650,4651],{"class":4585},") : ",[2837,4653,4654],{"class":4579},"Integer\n",[2837,4656,4657],{"class":4576,"line":398},[2837,4658,4659],{"class":4579},"  begin\n",[2837,4661,4663,4666],{"class":4576,"line":4662},8,[2837,4664,4665],{"class":4579},"    Result",[2837,4667,4668],{"class":4585}," := x + y;\n",[2837,4670,4672,4675,4678],{"class":4576,"line":4671},9,[2837,4673,4674],{"class":4579},"  end",[2837,4676,4677],{"class":4585},"; ",[2837,4679,4680],{"class":4643},"{ end anonymous method }\n",[2837,4682,4684,4687],{"class":4576,"line":4683},10,[2837,4685,4686],{"class":4579},"end",[2837,4688,4605],{"class":4585},[174,4690],{"description":4691,"icon":177,"title":4692,"url":4693},"Anonymous methods and Closures are related but distinct concepts. All Closures are Anonymous methods, but not all Anonymous methods capture state.","Anonymous Methods in Delphi","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FAnonymous_Methods_in_Delphi",[24,4695,4697],{"id":4696},"generics","Generics",[15,4699,4700,4702,4703,4706,4707,4710],{},[19,4701,4697],{}," represent one of the most widely used modern features. A generic is a data object whose specific type is determined at the point of instantiation rather than declaration. This allows you to write ",[19,4704,4705],{},"type-safe, highly reusable collections and algorithms"," without duplicating code or relying on unsafe ",[355,4708,4709],{},"Pointer"," casting.",[4567,4712,4714],{"className":4569,"code":4713,"language":4571,"meta":187,"style":187},"type\n  TPair\u003CTKey,TValue> = class\n  private\n    FKey: TKey;\n    FValue: TValue;\n  public\n    property Key: TKey read FKey write FKey;\n    property Value: TValue read FValue write FValue;\n  end;\n\n\u002F\u002F Instantiated types\ntype\n  TSIPair = TPair\u003CString,Integer>;\n  TSSPair = TPair\u003CString,String>;\n",[355,4715,4716,4720,4728,4733,4738,4743,4748,4771,4791,4797,4802,4808,4813,4830],{"__ignoreMap":187},[2837,4717,4718],{"class":4576,"line":2480},[2837,4719,4580],{"class":4579},[2837,4721,4722,4725],{"class":4576,"line":188},[2837,4723,4724],{"class":4585},"  TPair\u003CTKey,TValue> = ",[2837,4726,4727],{"class":4579},"class\n",[2837,4729,4730],{"class":4576,"line":790},[2837,4731,4732],{"class":4579},"  private\n",[2837,4734,4735],{"class":4576,"line":1215},[2837,4736,4737],{"class":4585},"    FKey: TKey;\n",[2837,4739,4740],{"class":4576,"line":202},[2837,4741,4742],{"class":4585},"    FValue: TValue;\n",[2837,4744,4745],{"class":4576,"line":800},[2837,4746,4747],{"class":4579},"  public\n",[2837,4749,4750,4753,4756,4759,4762,4765,4768],{"class":4576,"line":398},[2837,4751,4752],{"class":4579},"    property",[2837,4754,4755],{"class":4618}," Key",[2837,4757,4758],{"class":4585},": TKey ",[2837,4760,4761],{"class":4579},"read",[2837,4763,4764],{"class":4585}," FKey ",[2837,4766,4767],{"class":4579},"write",[2837,4769,4770],{"class":4585}," FKey;\n",[2837,4772,4773,4775,4778,4781,4783,4786,4788],{"class":4576,"line":4662},[2837,4774,4752],{"class":4579},[2837,4776,4777],{"class":4618}," Value",[2837,4779,4780],{"class":4585},": TValue ",[2837,4782,4761],{"class":4579},[2837,4784,4785],{"class":4585}," FValue ",[2837,4787,4767],{"class":4579},[2837,4789,4790],{"class":4585}," FValue;\n",[2837,4792,4793,4795],{"class":4576,"line":4671},[2837,4794,4674],{"class":4579},[2837,4796,4605],{"class":4585},[2837,4798,4799],{"class":4576,"line":4683},[2837,4800,4801],{"emptyLinePlaceholder":201},"\n",[2837,4803,4805],{"class":4576,"line":4804},11,[2837,4806,4807],{"class":4643},"\u002F\u002F Instantiated types\n",[2837,4809,4811],{"class":4576,"line":4810},12,[2837,4812,4580],{"class":4579},[2837,4814,4816,4819,4822,4825,4827],{"class":4576,"line":4815},13,[2837,4817,4818],{"class":4585},"  TSIPair = TPair\u003C",[2837,4820,4821],{"class":4579},"String",[2837,4823,4824],{"class":4585},",",[2837,4826,3703],{"class":4579},[2837,4828,4829],{"class":4585},">;\n",[2837,4831,4833,4836,4838,4840,4842],{"class":4576,"line":4832},14,[2837,4834,4835],{"class":4585},"  TSSPair = TPair\u003C",[2837,4837,4821],{"class":4579},[2837,4839,4824],{"class":4585},[2837,4841,4821],{"class":4579},[2837,4843,4829],{"class":4585},[174,4845],{"description":4846,"icon":177,"title":4847,"url":4848},"Do not confuse Generics with Variants. A Generic changes the strongly typed declaration at compile time; a Variant holds different values dynamically at runtime.","Overview of Generics","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FOverview_of_Generics",[24,4850,4852],{"id":4851},"rtti-and-custom-attributes","RTTI and Custom Attributes",[15,4854,4855,4858],{},[19,4856,4857],{},"Attributes"," are metadata tags attached to your code (classes, methods, properties) at design time that can be read dynamically at runtime using Extended RTTI (Run-Time Type Information), your application can \"reflect\" upon itself at runtime to discover these tags.",[15,4860,4861,4862,1656,4865,4868,4869,4872],{},"This is the engine behind modern Delphi features like ",[19,4863,4864],{},"JSON\u002FREST serialization",[19,4866,4867],{},"ORM frameworks",". Beyond simple data inspection, Extended RTTI allows you to ",[19,4870,4871],{},"invoke methods dynamically"," and manipulate objects without needing static links at compile time.",[4567,4874,4876],{"className":4569,"code":4875,"language":4571,"meta":187,"style":187},"type\n  \u002F\u002F Custom attribute definition\n  MyCustomAttribute = class(TCustomAttribute);\n\n  [MyCustomAttribute]\n  TSomeClass = class\n  public\n    [MyCustomAttribute]\n    procedure Work;\n  end;\n",[355,4877,4878,4882,4887,4898,4902,4907,4914,4918,4923,4933],{"__ignoreMap":187},[2837,4879,4880],{"class":4576,"line":2480},[2837,4881,4580],{"class":4579},[2837,4883,4884],{"class":4576,"line":188},[2837,4885,4886],{"class":4643},"  \u002F\u002F Custom attribute definition\n",[2837,4888,4889,4892,4895],{"class":4576,"line":790},[2837,4890,4891],{"class":4585},"  MyCustomAttribute = ",[2837,4893,4894],{"class":4579},"class",[2837,4896,4897],{"class":4585},"(TCustomAttribute);\n",[2837,4899,4900],{"class":4576,"line":1215},[2837,4901,4801],{"emptyLinePlaceholder":201},[2837,4903,4904],{"class":4576,"line":202},[2837,4905,4906],{"class":4585},"  [MyCustomAttribute]\n",[2837,4908,4909,4912],{"class":4576,"line":800},[2837,4910,4911],{"class":4585},"  TSomeClass = ",[2837,4913,4727],{"class":4579},[2837,4915,4916],{"class":4576,"line":398},[2837,4917,4747],{"class":4579},[2837,4919,4920],{"class":4576,"line":4662},[2837,4921,4922],{"class":4585},"    [MyCustomAttribute]\n",[2837,4924,4925,4928,4931],{"class":4576,"line":4671},[2837,4926,4927],{"class":4579},"    procedure",[2837,4929,4930],{"class":4618}," Work",[2837,4932,4605],{"class":4585},[2837,4934,4935,4937],{"class":4576,"line":4683},[2837,4936,4674],{"class":4579},[2837,4938,4605],{"class":4585},[174,4940],{"description":4941,"icon":177,"title":4942,"url":4943},"Learn how custom attributes are declared and consumed through RTTI to drive serialization, validation, and framework behavior.","Attributes (RTTI)","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FAttributes_(RTTI)",[24,4945,4947],{"id":4946},"implicit-unicode","Implicit Unicode",[15,4949,4950],{},"Unicode has been standard in RAD Studio for many years, and most projects already benefit from implicit handling in everyday code. The key point for language modernization is understanding where text boundaries exist (API calls, file I\u002FO, and external systems) so that updated libraries and newer code patterns remain predictable.",[15,4952,4953,4954,4958],{},"For a focused migration checklist, read the dedicated ",[275,4955,4957],{"href":4956},"\u002Fupgrading\u002Funicode","Unicode Migration"," guide.",[24,4960,4962],{"id":4961},"class-and-record-helpers","Class and Record Helpers",[15,4964,4965,4967],{},[19,4966,4962],{}," are incredibly powerful tools for avoiding vast inheritance trees. They allow you to dynamically \"attach\" new methods to an existing class or record, even ones you don't own (like VCL controls or RTL classes), without subclassing them.",[4567,4969,4971],{"className":4569,"code":4970,"language":4571,"meta":187,"style":187},"type\n  TMyClassHelper = class helper for TMyClass\n    procedure HelloWorld;\n    function MyFunc: Integer;\n  end;\n",[355,4972,4973,4977,4993,5002,5017],{"__ignoreMap":187},[2837,4974,4975],{"class":4576,"line":2480},[2837,4976,4580],{"class":4579},[2837,4978,4979,4982,4984,4987,4990],{"class":4576,"line":188},[2837,4980,4981],{"class":4585},"  TMyClassHelper = ",[2837,4983,4894],{"class":4579},[2837,4985,4986],{"class":4579}," helper",[2837,4988,4989],{"class":4579}," for",[2837,4991,4992],{"class":4585}," TMyClass\n",[2837,4994,4995,4997,5000],{"class":4576,"line":790},[2837,4996,4927],{"class":4579},[2837,4998,4999],{"class":4618}," HelloWorld",[2837,5001,4605],{"class":4585},[2837,5003,5004,5007,5010,5013,5015],{"class":4576,"line":1215},[2837,5005,5006],{"class":4579},"    function",[2837,5008,5009],{"class":4618}," MyFunc",[2837,5011,5012],{"class":4585},": ",[2837,5014,3703],{"class":4579},[2837,5016,4605],{"class":4585},[2837,5018,5019,5021],{"class":4576,"line":202},[2837,5020,4674],{"class":4579},[2837,5022,4605],{"class":4585},[174,5024],{"description":5025,"icon":177,"title":5026,"url":5027},"Official syntax, scoping rules, and best practices for using helpers safely in production code.","Class and Record Helpers (Delphi)","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FClass_and_Record_Helpers_(Delphi)",[24,5029,5031],{"id":5030},"data-type-helpers","Data Type Helpers",[15,5033,5034,5035,5038,5039,72,5042,4004],{},"Taking the concept of Record Helpers further, Delphi allows you to ",[19,5036,5037],{},"extend primitive data types"," (like Int, String, Boolean). The RTL is heavily built on this today (e.g., ",[355,5040,5041],{},"TStringHelper",[355,5043,5044],{},"TIntegerHelper",[4567,5046,5048],{"className":4569,"code":5047,"language":4571,"meta":187,"style":187},"var\n  MyString: string;\nbegin\n  MyString := 'This is a string.';\n  \u002F\u002F Using zero-based string helper method natively on the primitive\n  Writeln(MyString.IndexOf('a'));\nend;\n",[355,5049,5050,5055,5065,5069,5080,5085,5096],{"__ignoreMap":187},[2837,5051,5052],{"class":4576,"line":2480},[2837,5053,5054],{"class":4579},"var\n",[2837,5056,5057,5060,5063],{"class":4576,"line":188},[2837,5058,5059],{"class":4585},"  MyString: ",[2837,5061,5062],{"class":4579},"string",[2837,5064,4605],{"class":4585},[2837,5066,5067],{"class":4576,"line":790},[2837,5068,4632],{"class":4579},[2837,5070,5071,5074,5078],{"class":4576,"line":1215},[2837,5072,5073],{"class":4585},"  MyString := ",[2837,5075,5077],{"class":5076},"sU2Wk","'This is a string.'",[2837,5079,4605],{"class":4585},[2837,5081,5082],{"class":4576,"line":202},[2837,5083,5084],{"class":4643},"  \u002F\u002F Using zero-based string helper method natively on the primitive\n",[2837,5086,5087,5090,5093],{"class":4576,"line":800},[2837,5088,5089],{"class":4585},"  Writeln(MyString.IndexOf(",[2837,5091,5092],{"class":5076},"'a'",[2837,5094,5095],{"class":4585},"));\n",[2837,5097,5098,5100],{"class":4576,"line":398},[2837,5099,4686],{"class":4579},[2837,5101,4605],{"class":4585},[174,5103],{"description":5104,"icon":177,"title":5105,"url":5106},"Reference for core string helper methods that make text parsing and manipulation far cleaner than legacy utility code.","System.SysUtils.TStringHelper","https:\u002F\u002Fdocwiki.embarcadero.com\u002FLibraries\u002Fen\u002FSystem.SysUtils.TStringHelper",[24,5108,5110],{"id":5109},"inline-variables","Inline Variables",[15,5112,5113,5114,5117,5118,5121,5122,5125,5126,5129],{},"Introduced in ",[19,5115,5116],{},"10.3 Rio",", inline variable declaration shifted a fundamental paradigm of strict Pascal. Instead of declaring all variables at the top of a routine in a ",[355,5119,5120],{},"var"," block, you can declare them exactly where they are needed. Because their scope is restricted to the specific local block (e.g., inside a ",[355,5123,5124],{},"begin..end"," of a loop), they ",[19,5127,5128],{},"force cleaner code structure"," and help the compiler optimize memory management.",[4567,5131,5133],{"className":4569,"code":5132,"language":4571,"meta":187,"style":187},"procedure ProcessItems(const Items: TArray\u003Cstring>);\nbegin\n  for var I := 0 to High(Items) do\n  begin\n    var CurrentItem := Items[I];\n    Writeln(Format('%d: %s', [I, CurrentItem]));\n  end;\n  \u002F\u002F CurrentItem is not visible here because it was declared inside the loop block.\nend;\n",[355,5134,5135,5157,5161,5183,5187,5195,5206,5212,5217],{"__ignoreMap":187},[2837,5136,5137,5140,5143,5146,5149,5152,5154],{"class":4576,"line":2480},[2837,5138,5139],{"class":4579},"procedure",[2837,5141,5142],{"class":4618}," ProcessItems",[2837,5144,5145],{"class":4585},"(",[2837,5147,5148],{"class":4579},"const",[2837,5150,5151],{"class":4585}," Items: TArray\u003C",[2837,5153,5062],{"class":4579},[2837,5155,5156],{"class":4585},">);\n",[2837,5158,5159],{"class":4576,"line":188},[2837,5160,4632],{"class":4579},[2837,5162,5163,5166,5169,5172,5175,5177,5180],{"class":4576,"line":790},[2837,5164,5165],{"class":4579},"  for",[2837,5167,5168],{"class":4579}," var",[2837,5170,5171],{"class":4585}," I := ",[2837,5173,2828],{"class":5174},"sDLfK",[2837,5176,4592],{"class":4579},[2837,5178,5179],{"class":4585}," High(Items) ",[2837,5181,5182],{"class":4579},"do\n",[2837,5184,5185],{"class":4576,"line":1215},[2837,5186,4659],{"class":4579},[2837,5188,5189,5192],{"class":4576,"line":202},[2837,5190,5191],{"class":4579},"    var",[2837,5193,5194],{"class":4585}," CurrentItem := Items[I];\n",[2837,5196,5197,5200,5203],{"class":4576,"line":800},[2837,5198,5199],{"class":4585},"    Writeln(Format(",[2837,5201,5202],{"class":5076},"'%d: %s'",[2837,5204,5205],{"class":4585},", [I, CurrentItem]));\n",[2837,5207,5208,5210],{"class":4576,"line":398},[2837,5209,4674],{"class":4579},[2837,5211,4605],{"class":4585},[2837,5213,5214],{"class":4576,"line":4662},[2837,5215,5216],{"class":4643},"  \u002F\u002F CurrentItem is not visible here because it was declared inside the loop block.\n",[2837,5218,5219,5221],{"class":4576,"line":4671},[2837,5220,4686],{"class":4579},[2837,5222,4605],{"class":4585},[174,5224],{"description":5225,"icon":177,"title":5226,"url":5227},"Language reference for inline variable syntax, block scope, type inference behavior, and compiler rules.","Inline Variable Declaration","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FInline_Variable_Declaration",[24,5229,5231],{"id":5230},"expanding-your-applications-capabilities","Expanding Your Application's Capabilities",[15,5233,5234],{},"Once your core code is compiling and taking advantage of modern language constructs, the broader RAD Studio ecosystem opens up natively to your application:",[106,5236,5237,5243,5253,5259,5265,5271,5277],{},[35,5238,5239,5242],{},[19,5240,5241],{},"Cross-Platform Delivery (FMX):"," Take your strict business logic and deploy it across Windows, macOS, Linux, iOS, and Android using the FireMonkey framework from a single codebase.",[35,5244,5245,5248,5249,5252],{},[19,5246,5247],{},"Parallel Programming Library (PPL):"," Implement multi-threaded tasks, asynchronous methods, and parallel ",[355,5250,5251],{},"For"," loops without managing raw OS thread handles.",[35,5254,5255,5258],{},[19,5256,5257],{},"Cloud and Service Delivery:"," Wrap existing Delphi logic as REST services, including serverless-style and API-first deployment approaches.",[35,5260,5261,5264],{},[19,5262,5263],{},"FireDAC:"," Standardize data access across multiple backends through a single, modern data layer.",[35,5266,5267,5270],{},[19,5268,5269],{},"Python4Delphi:"," Access thousands of Python packages (like TensorFlow, PyTorch) directly within your Delphi UI, bridging native CPU performance with Python's AI\u002FML ecosystem.",[35,5272,5273,5276],{},[19,5274,5275],{},"RAD Server:"," Expose modernized business logic as secure APIs for web and mobile consumers.",[35,5278,5279,5282],{},[19,5280,5281],{},"AWS and Azure SDKs:"," Integrate cloud storage and platform services directly into native applications.",[174,5284],{"description":5285,"icon":177,"title":5286,"url":5287},"Guide to task-based parallelism, async patterns, and parallel loops in Delphi.","Using the Parallel Programming Library","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FUsing_the_Parallel_Programming_Library",[174,5289],{"description":5290,"icon":183,"title":5291,"url":5292},"Overview of high-performance, unified database access for enterprise Delphi and C++Builder applications.","FireDAC for RAD Studio","https:\u002F\u002Fwww.embarcadero.com\u002Fproducts\u002Frad-studio\u002Ffiredac",[174,5294],{"description":5295,"icon":183,"title":5296,"url":5297},"Practical guidance for delivering Delphi business logic in cloud-native service architectures.","Going Serverless with Delphi","https:\u002F\u002Flearndelphi.org\u002Feverything-you-should-know-about-going-serverless-with-delphi\u002F",[174,5299],{"description":5300,"icon":183,"title":5301,"url":5302},"Introductory guide for embedding Python in Delphi applications and using Python packages from native projects.","Getting Started with Python4Delphi","https:\u002F\u002Fblogs.embarcadero.com\u002Fgetting-started-wit-python4delphi\u002F",[174,5304],{"description":5305,"icon":177,"title":5306,"url":5307},"Reference for using Azure Blob storage APIs from RAD Studio projects.","Microsoft Azure Blob API","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FMicrosoft_Azure_Blob_API",[24,5309,5311],{"id":5310},"python4delphi-videos","Python4Delphi Videos",[270,5313,5314,5320],{},[15,5315,5316],{},[275,5317,5318],{"href":5318,"rel":5319},"https:\u002F\u002Fyoutu.be\u002FqEcVW4EKGkg",[279],[15,5321,5322],{},"Deepstack face recognition example in Delphi using Python integration workflows.",[270,5324,5325,5331],{},[15,5326,5327],{},[275,5328,5329],{"href":5329,"rel":5330},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=q3tUhXrHHGc",[279],[15,5332,5333],{},"CodeProject object recognition demo showing practical AI integration patterns in Delphi.",[2564,5335,5336],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}",{"title":187,"searchDepth":188,"depth":188,"links":5338},[5339,5340,5341,5342,5343,5344,5345,5346,5347],{"id":4555,"depth":188,"text":4556},{"id":4696,"depth":188,"text":4697},{"id":4851,"depth":188,"text":4852},{"id":4946,"depth":188,"text":4947},{"id":4961,"depth":188,"text":4962},{"id":5030,"depth":188,"text":5031},{"id":5109,"depth":188,"text":5110},{"id":5230,"depth":188,"text":5231},{"id":5310,"depth":188,"text":5311},{"slug":5349},"language-and-libraries","\u002Fupgrading\u002Flanguage-and-libraries",[2483,206],{"title":4500,"description":4509},"upgrade\u002Flanguage_and_libraries.md","upgrading\u002Flanguage-and-libraries","From Anonymous Methods and Generics to Inline Variables: Modern Object Pascal features you should be using.","p7Ej6SxsW9Pe65EjaYOMKKZMqqMItaRyyckifkNnqOE",{"id":5358,"title":5359,"body":5360,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":187,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":5368,"extension":197,"isTrackOverview":198,"meta":5597,"navigation":201,"order":800,"path":5599,"personaTags":5600,"routeGroup":3589,"seo":5601,"sourceDoc":5602,"status":210,"stem":5603,"summary":5604,"urgencyHook":187,"__hash__":5605},"content\u002Fupgrading\u002Freporting.md","Reporting Components",{"type":7,"value":5361,"toc":5587},[5362,5366,5369,5376,5379,5406,5410,5421,5425,5436,5440,5449,5460,5464,5467,5471,5474,5500,5504,5507,5527,5531,5534,5566,5580,5585],[10,5363,5365],{"id":5364},"migrating-forward-with-reports","Migrating Forward with Reports",[15,5367,5368],{},"Over the years, RAD Studio has bundled various reporting components to enable developers to create basic reporting. These components have included “lite” versions of QuickReport, Rave Reports, and since 2011, FastReport.",[15,5370,5371,5372,5375],{},"Regardless of the reporting components chosen for your project, ",[19,5373,5374],{},"the simplest approach is often to use the latest version of the reporting component you are currently using",", providing it still meets the needs of your migrated project. This ensures compatibility with the latest RAD Studio versions and minimizes the effort required for migration.",[15,5377,5378],{},"If however, you would rather use what is bundled with RAD Studio, then it's worth being aware FastReport has a converter that can help migrate a large amount of existing reports from several alternative options.",[57,5380,5381,5386],{},[15,5382,5383],{},[19,5384,5385],{},"Three main reporting paths",[32,5387,5388,5394,5400],{},[35,5389,5390,5393],{},[19,5391,5392],{},"Stay on your current engine"," and upgrade to the latest version from the same vendor.",[35,5395,5396,5399],{},[19,5397,5398],{},"Move to FastReport",", the cross-platform reporting solution bundled with RAD Studio.",[35,5401,5402,5405],{},[19,5403,5404],{},"Adopt a full BI platform"," (such as Yellowfin) when you need dashboards, web reporting, and advanced analytics.",[24,5407,5409],{"id":5408},"the-advantage-of-fastreport","The Advantage of FastReport",[15,5411,5412,5413,5416,5417,5420],{},"RAD Studio now ships with ",[19,5414,5415],{},"FastReport",", a decision driven by the need for a robust, cross-platform reporting solution that supports Unicode. FastReport stands out due to its powerful capabilities, including a visual report designer, scriptable reports, and extensive export options. Its support for both ",[19,5418,5419],{},"VCL and FMX applications"," makes it a versatile choice for modern Delphi and C++Builder projects. FastReport's cross-platform support ensures that your reports can run on Windows, macOS, Linux, iOS, and Android, providing a consistent user experience across all platforms.",[24,5422,5424],{"id":5423},"transitioning-from-crystal-reports","Transitioning from Crystal Reports",[15,5426,5427,5428,5431,5432,5435],{},"Crystal Reports was a popular reporting tool among Delphi developers in the late 90s and early 2000s, known for its advanced formatting and powerful data analysis capabilities. However, ",[19,5429,5430],{},"the original owner has since deprecated Crystal Reports",", prompting many companies to seek more modern solutions. For many software development teams, this provides an opportunity to embed full ",[19,5433,5434],{},"Business Intelligence (BI) solutions"," that offer comprehensive analytics and reporting features.",[24,5437,5439],{"id":5438},"exploring-modern-bi-solutions","Exploring Modern BI Solutions",[15,5441,5442,5443,5448],{},"For those looking to migrate from Crystal Reports or other legacy reporting tools, modern BI solutions like Yellowfin offer a compelling alternative. Yellowfin provides advanced BI capabilities, including interactive dashboards, data visualization, web reporting, and real-time analytics, which can be integrated into RAD Studio applications. ",[275,5444,5447],{"href":5445,"rel":5446},"https:\u002F\u002Fgithub.com\u002FDelphiABall\u002FYellowfin-Delphi-REST",[279],"Yellowfin's embedded BI examples"," and integration with RAD Studio ensure that developers can create sophisticated, data-driven applications with ease.",[270,5450,5451,5457],{},[15,5452,5453],{},[275,5454,5455],{"href":5455,"rel":5456},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=uhoLXg65o74",[279],[15,5458,5459],{},"Overview of embedding BI and modern reporting into RAD Studio applications using Yellowfin.",[24,5461,5463],{"id":5462},"migration-strategy-for-reporting","Migration Strategy for Reporting",[15,5465,5466],{},"When planning your reporting migration, it’s essential to choose the right path based on your current needs and future goals. Here’s a detailed strategy covering three primary options:",[554,5468,5470],{"id":5469},"_1-simplest-path-migrate-forward-using-existing-components","1) Simplest Path - Migrate Forward Using Existing Components",[15,5472,5473],{},"The simplest migration path involves updating your existing reporting components to their latest versions. If your current tool still meets your needs, purchasing the latest version ensures compatibility with the newest RAD Studio releases, minimizes code changes, and reduces the learning curve for your development team.",[32,5475,5476,5482,5488,5494],{},[35,5477,5478,5481],{},[19,5479,5480],{},"Identify Current Components",": Determine the reporting components currently in use (e.g., QuickReport, FastReport, ReportBuilder).",[35,5483,5484,5487],{},[19,5485,5486],{},"Purchase Latest Versions",": Acquire the latest versions of these components to ensure compatibility and access to new features.",[35,5489,5490,5493],{},[19,5491,5492],{},"Update Project References",": If required, replace old component references in your project with the updated versions.",[35,5495,5496,5499],{},[19,5497,5498],{},"Test Thoroughly",": Ensure all existing reports function correctly with the new component versions.",[554,5501,5503],{"id":5502},"_2-migrate-to-the-latest-embedded-reporting-solutions","2) Migrate to the Latest Embedded Reporting Solutions",[15,5505,5506],{},"For those wanting the advantages of modern embedded reporting solutions, FastReport, which is bundled with RAD Studio, offers an excellent choice due to its cross-platform support and robust feature set.",[32,5508,5509,5515,5521],{},[35,5510,5511,5514],{},[19,5512,5513],{},"Evaluate Requirements",": Assess your current reporting needs and determine if FastReport can meet these requirements.",[35,5516,5517,5520],{},[19,5518,5519],{},"Transition to FastReport",": Migrate your existing reports to FastReport by redesigning or converting them using FastReport’s tools.",[35,5522,5523,5526],{},[19,5524,5525],{},"Testing and Validation",": Test the migrated reports across all target platforms to ensure they meet your standards.",[554,5528,5530],{"id":5529},"_3-enhance-features-with-modern-bi-solutions","3) Enhance Features with Modern BI Solutions",[15,5532,5533],{},"If you aim to offer enhanced features like web reporting, business intelligence (BI), and integration with various data sources, migrating to a modern BI solution can transform your reporting into a revenue-generating stream. This approach makes your product more attractive and sticky for your users.",[32,5535,5536,5542,5548,5554,5560],{},[35,5537,5538,5541],{},[19,5539,5540],{},"Evaluate BI Solutions",": Explore BI tools like Yellowfin, which provide advanced analytics, interactive dashboards, and real-time reporting.",[35,5543,5544,5547],{},[19,5545,5546],{},"Integration",": Embed the chosen BI solution into your RAD Studio application, allowing seamless data analysis and reporting capabilities.",[35,5549,5550,5553],{},[19,5551,5552],{},"Expand Offerings",": Use the BI tool to integrate data from multiple sources, providing comprehensive insights and analytics.",[35,5555,5556,5559],{},[19,5557,5558],{},"Monetize Reporting",": Turn your enhanced reporting capabilities into a revenue stream by offering premium features, training services, and custom reporting solutions to your clients.",[35,5561,5562,5565],{},[19,5563,5564],{},"Training and Support",": Provide training services and support to your users to maximize the value they get from the enhanced reporting features.",[270,5567,5568,5574],{},[15,5569,5570],{},[275,5571,5572],{"href":5572,"rel":5573},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=UaYkcPg2z1c",[279],[15,5575,5576,5579],{},[19,5577,5578],{},"Embedding BI into RAD Studio"," — webinar replay with Q&A covering how to integrate Yellowfin and modern BI tools into existing applications.",[174,5581],{"description":5582,"icon":183,"title":5583,"url":5584},"A practical guide to integrating Yellowfin's analytics and dashboards into Delphi and C++Builder projects.","Embedding BI into RAD Studio Applications with Yellowfin","https:\u002F\u002Fwww.yellowfinbi.com\u002Fblog\u002Fembedding-bi-into-rad-studio-applications-with-yellowfin",[174,5586],{"description":5582,"icon":1438,"title":5447,"url":5445},{"title":187,"searchDepth":188,"depth":188,"links":5588},[5589,5590,5591,5592],{"id":5408,"depth":188,"text":5409},{"id":5423,"depth":188,"text":5424},{"id":5438,"depth":188,"text":5439},{"id":5462,"depth":188,"text":5463,"children":5593},[5594,5595,5596],{"id":5469,"depth":790,"text":5470},{"id":5502,"depth":790,"text":5503},{"id":5529,"depth":790,"text":5530},{"slug":5598},"reporting","\u002Fupgrading\u002Freporting",[2483,206],{"title":5359,"description":5368},"upgrade\u002Freporting_components.md","upgrading\u002Freporting","The three paths for reporting migration: migrate forward, move to FastReport, or upgrade to modern BI with Yellowfin.","lp7D2zZatBT3iuQzaobawvV7vNXkgNGxmXm2vBQKdhg",{"id":5607,"title":4957,"body":5608,"ctaPrimary":194,"ctaPrimaryLink":195,"ctaPrimaryType":195,"ctaSecondary":187,"ctaSecondaryLink":195,"ctaSecondaryType":195,"description":5615,"extension":197,"isTrackOverview":198,"meta":5793,"navigation":201,"order":2480,"path":4956,"personaTags":5795,"routeGroup":3589,"seo":5796,"sourceDoc":5797,"status":210,"stem":5798,"summary":5799,"urgencyHook":187,"__hash__":5800},"content\u002Fupgrading\u002Funicode.md",{"type":7,"value":5609,"toc":5786},[5610,5613,5616,5641,5645,5653,5656,5660,5667,5673,5680,5687,5690,5694,5699,5704,5709,5714,5718,5725,5748,5752,5756,5771],[10,5611,4957],{"id":5612},"unicode-migration",[15,5614,5615],{},"Many developers are still confused by Unicode. Perhaps this is no surprise because it mostly works transparently in the background so there's no real reason to go deeper. However, some developers worry if Unicode could have a significant impact on their project, especially if it predates 2009.",[57,5617,5618,5623],{},[15,5619,5620],{},[19,5621,5622],{},"What changes in practice",[32,5624,5625,5628,5635,5638],{},[35,5626,5627],{},"Most legacy ANSI text is converted to Unicode implicitly by RAD Studio.",[35,5629,5630,5631,5634],{},"The main area you need to review is ",[19,5632,5633],{},"string types"," and how they interact with external APIs and file I\u002FO.",[35,5636,5637],{},"Non-string data types are largely unaffected by the migration.",[35,5639,5640],{},"If you are already on RAD Studio 2009 or later, you are almost certainly using Unicode today.",[24,5642,5644],{"id":5643},"what-is-unicode","What is Unicode?",[15,5646,5647,5649,5650,603],{},[19,5648,4535],{}," is a way of representing an extended set of characters including accented alphabetical letters, as well as things like emoticons, the ubiquitous smiley faces to things like diphthongs and icons. Unicode replaces the more limited ",[19,5651,5652],{},"ANSI character encoding",[15,5654,5655],{},"Here's a brief and simple way to understand the practical implications of Unicode's effect on your project.",[24,5657,5659],{"id":5658},"how-does-rad-studio-deal-with-unicode","How does RAD Studio deal with Unicode?",[15,5661,5662,5663,5666],{},"For most cases of legacy code, ",[19,5664,5665],{},"Unicode conversion from the older ANSI encoding is implicit"," and that's really good news for your projects. RAD Studio automatically handles the conversion of ANSI characters and maps them to Unicode. This means, as a developer, there's often very little for you to do in most cases.",[15,5668,5669,5670,5672],{},"Understanding Unicode mainly means knowing how it works within ",[19,5671,5633],{},". All you have to do is know the changes for strings. The rest of the data types are not affected by it at all.",[15,5674,5675,5676,5679],{},"If your application isn't multilingual and uses simple ANSI strings for displaying labels, text, messages, and data, it is ",[19,5677,5678],{},"unlikely you will run into any major issues",". Again, all this is because of RAD Studio's implicit handling.",[15,5681,5682,5683,5686],{},"If your application is already migrated and working with ",[19,5684,5685],{},"RAD Studio 2009 or later"," then you are probably already using Unicode even if you were not aware of it.",[15,5688,5689],{},"Finally, it's been over 15 years since Unicode was implemented in RAD Studio. The compiler and libraries are mature and handle the majority of tasks, from the simple to the complex that may occur whilst interacting with other 3rd-party systems that communicate in Unicode-encoded data.",[24,5691,5693],{"id":5692},"helpful-articles-on-unicode","Helpful articles on Unicode",[174,5695],{"description":5696,"icon":177,"title":5697,"url":5698},"Start from the beginning for the history, or jump straight to page 6 for the implementation details.","Delphi Unicode Migration — Cary Jensen White Paper","https:\u002F\u002Fwww.embarcadero.com\u002Fimages\u002Fdm\u002Ftechnical-papers\u002Fdelphi-unicode-migration.pdf",[174,5700],{"description":5701,"icon":177,"title":5702,"url":5703},"An in-depth look at Unicode in Delphi covering string types, encoding, and practical migration guidance.","Delphi and Unicode — Marco Cantù","https:\u002F\u002Fd2ohlsp9gwqc7h.cloudfront.net\u002Fimages\u002Fold\u002Fpdf\u002FDelphi-Unicode181213.pdf",[174,5705],{"description":5706,"icon":177,"title":5707,"url":5708},"A practical checklist of pitfalls to look out for in legacy applications.","Enabling Applications for Unicode","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FEnabling_Applications_for_Unicode",[174,5710],{"description":5711,"icon":177,"title":5712,"url":5713},"Under-the-hood details when you really need to understand the implementation.","Unicode in RAD Studio","https:\u002F\u002Fdocwiki.embarcadero.com\u002FRADStudio\u002Fen\u002FUnicode_in_RAD_Studio",[24,5715,5717],{"id":5716},"tools-for-unicode-migration","Tools for Unicode Migration",[15,5719,5720,5721,5724],{},"Embarcadero has a tool that scans your existing legacy code and highlights possible places you may want to review for Unicode compatibility. The ",[19,5722,5723],{},"Unicode Statistics Tool"," helps you estimate the time and effort needed to migrate by listing:",[32,5726,5727,5730,5733],{},[35,5728,5729],{},"All used units (including Delphi units) and how many times each one is used.",[35,5731,5732],{},"Number of files and lines of code.",[35,5734,5735,5736,72,5738,72,5741,72,5744,5747],{},"Instances of key tokens such as ",[355,5737,4821],{},[355,5739,5740],{},"Read",[355,5742,5743],{},"Write",[355,5745,5746],{},"SizeOf",", and more.",[174,5749],{"description":5750,"icon":183,"title":5723,"url":5751},"Download and scan your legacy codebase to estimate Unicode migration effort and identify hotspots.","https:\u002F\u002Fdrive.google.com\u002Ffile\u002Fd\u002F1BqN3VX4hG-5IPffEmTRDwINNb_hUtjsk\u002Fview?usp=drive_link",[24,5753,5755],{"id":5754},"unicode-migration-videos","Unicode Migration Videos",[270,5757,5758,5764],{},[15,5759,5760],{},[275,5761,5762],{"href":5762,"rel":5763},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=7EnKXZ9-Pc8",[279],[15,5765,5766,5767,5770],{},"Overall migration webinar. For the Unicode-specific section, jump to ",[19,5768,5769],{},"00:15:17–00:42:19"," to see the Unicode Statistics Tool in action and common surprises you may encounter.",[270,5772,5773,5779],{},[15,5774,5775],{},[275,5776,5777],{"href":5777,"rel":5778},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=QgSiQiE8lKg&t=2s",[279],[15,5780,5781,5782,5785],{},"Unicode migration walkthrough for ",[19,5783,5784],{},"C++Builder"," projects, covering the key string type and API changes when moving C++ codebases to Unicode.",{"title":187,"searchDepth":188,"depth":188,"links":5787},[5788,5789,5790,5791,5792],{"id":5643,"depth":188,"text":5644},{"id":5658,"depth":188,"text":5659},{"id":5692,"depth":188,"text":5693},{"id":5716,"depth":188,"text":5717},{"id":5754,"depth":188,"text":5755},{"slug":5794},"unicode",[2483,206],{"title":4957,"description":5615},"upgrade\u002Funicode.md","upgrading\u002Funicode","What Unicode is, why RAD Studio handles most of it automatically, and what to watch for in your code.","wx3v11PLAjxlGdplAY2POplykG_FTa-t74icVefd6MY",1778765039697]