<meta content="https://avatars0.githubusercontent.com/u/6212462?v=4&s=400" property="og:image" /><meta content="GitHub" property="og:site_name" /><meta content="object" property="og:type" /><meta content="lunasoft/sw-sdk-visual-delphi" property="og:title" /><meta content="https://github.com/lunasoft/sw-sdk-visual-delphi" property="og:url" /><meta content="sw-sdk-visual-delphi - SW SmarterWeb Client Library for Visual Delphi" property="og:description" />
<meta name="hostname" content="github.com">
<meta name="expected-hostname" content="github.com">
<meta name="js-proxy-site-detection-payload" content="Y2RiZmI1N2M4ZDhlMTVmNGMyYjU1ZmQ4ZDhhZmQ2YWE4MWI1YzY4NDUwYzhiMjFkNzQ1NzI1Y2E4YmNhNmMzM3x7InJlbW90ZV9hZGRyZXNzIjoiMTQ4LjI0MC4yMDAuMTgwIiwicmVxdWVzdF9pZCI6IkM3ODU6NzNGNDoxNDIxRkY5OjIzNURFQUM6NTlBOUIxQjEiLCJ0aW1lc3RhbXAiOjE1MDQyOTMyOTcsImhvc3QiOiJnaXRodWIuY29tIn0=">
<meta name="enabled-features" content="UNIVERSE_BANNER">
<link href="https://github.com/lunasoft/sw-sdk-visual-delphi/commits/0.0.3.1.atom" rel="alternate" title="Recent Commits to sw-sdk-visual-delphi:0.0.3.1" type="application/atom+xml">
<link rel="canonical" href="https://github.com/lunasoft/sw-sdk-visual-delphi/blob/0.0.3.1/README.md" data-pjax-transient>
</div>
<div class="HeaderMenu d-flex flex-justify-between flex-auto">
<div class="d-flex">
<div class="">
<div class="header-search scoped-search site-scoped-search js-site-search" role="search">
<label class="form-control header-search-wrapper js-chromeless-input-container">
<a href="https://github.com/lunasoft/sw-sdk-visual-delphi/blob/0.0.3.1/README.md" class="header-search-scope no-underline">This repository</a>
<input type="text"
class="form-control header-search-input js-site-search-focus js-site-search-field is-clearable"
data-hotkey="s"
name="q"
value=""
placeholder="Search"
aria-label="Search this repository"
data-unscoped-placeholder="Search GitHub"
data-scoped-placeholder="Search"
autocapitalize="off">
<input type="hidden" class="js-site-search-type-field" name="type" >
</label>
</div>
<ul class="d-flex pl-2 flex-items-center text-bold list-style-none" role="navigation">
<li>
<a href="https://github.com/pulls" aria-label="Pull requests you created" class="js-selected-navigation-item HeaderNavlink px-2" data-ga-click="Header, click, Nav menu - item:pulls context:user" data-hotkey="g p" data-selected-links="/pulls /pulls/assigned /pulls/mentioned /pulls">
Pull requests
<div class="d-flex">
-
</span> -
New repository Import repository New gist New organization
<div class="dropdown-menu-content js-menu-content"> <ul class="dropdown-menu dropdown-menu-sw">This repositoryNew issue</ul> </div> -
<details class="dropdown-details d-flex pl-2 flex-items-center"> <summary class="HeaderNavlink name" aria-label="View profile and more" data-ga-click="Header, show menu, icon:avatar"> <img alt="@ecs515" class="avatar" src="https://avatars2.githubusercontent.com/u/30845192?v=4&s=40" height="20" width="20"> <span class="dropdown-caret"></span> </summary> <ul class="dropdown-menu dropdown-menu-sw"> <li class="dropdown-header header-nav-current-user css-truncate"> Signed in as <strong class="css-truncate-target">ecs515</strong> </li> <li class="dropdown-divider"></li> <li><a class="dropdown-item" href="https://github.com/ecs515" data-ga-click="Header, go to profile, text:your profile"> Your profile </a></li> <li><a class="dropdown-item" href="https://github.com/ecs515?tab=stars" data-ga-click="Header, go to starred repos, text:your stars"> Your stars </a></li> <li><a class="dropdown-item" href="https://gist.github.com/" data-ga-click="Header, your gists, text:your gists">Your Gists</a></li> <li class="dropdown-divider"></li> <li><a class="dropdown-item" href="https://help.github.com" data-ga-click="Header, go to help, text:help"> Help </a></li> <li><a class="dropdown-item" href="https://github.com/settings/profile" data-ga-click="Header, go to settings, icon:settings"> Settings </a></li> <li><!-- '"` --><!-- </textarea></xmp> --></option></form><form accept-charset="UTF-8" action="/logout" class="logout-form" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="kgqQhfEzk5p0o9u42NaDU6nCzMVh6ZBAF2z6Jhuo9YTa7ZgvfhCElLT2tG2WLeLesrw3s9Mk6jRp5T0xpGG5zQ==" /></div> <button type="submit" class="dropdown-item dropdown-signout" data-ga-click="Header, sign out, icon:logout"> Sign out </button> </form></li> </ul> </details>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form accept-charset="UTF-8" action="/logout" class="sr-only right-0" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="gQPOkAOe/XF9085zrk2YpvB/EK05j+zuFxnL3HnGuKvJ5MY6jL3qf72Goabgtvkr6wHr24tClpppkAzLxg/04g==" /></div>
<button type="submit" class="dropdown-item dropdown-signout" data-ga-click="Header, sign out, icon:logout">
Sign out
</button>
<div id="js-flash-container">
<div class="pagehead repohead instapaper_ignore readability-menu experiment-repo-nav">
<div class="container repohead-details-container">
<ul class="pagehead-actions">
<div class="select-menu js-menu-container js-select-menu">
<a href="https://github.com/lunasoft/sw-sdk-visual-delphi/subscription"
class="btn btn-sm btn-with-count select-menu-button js-menu-target"
role="button"
aria-haspopup="true"
aria-expanded="false"
aria-label="Toggle repository notifications menu"
data-ga-click="Repository, click Watch settings, action:blob#show">
<span class="js-select-button">
<svg aria-hidden="true" class="octicon octicon-eye" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z"/></svg>
Watch
</span>
</a>
<a class="social-count js-social-count"
href="https://github.com/lunasoft/sw-sdk-visual-delphi/watchers"
aria-label="5 users are watching this repository">
5
</a>
<div class="select-menu-modal-holder">
<div class="select-menu-modal subscription-menu-modal js-menu-content">
<div class="select-menu-header js-navigation-enable" tabindex="-1">
<svg aria-label="Close" class="octicon octicon-x js-menu-close" height="16" role="img" version="1.1" viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z"/></svg>
<span class="select-menu-title">Notifications</span>
</div>
<div class="select-menu-list js-navigation-container" role="menu">
<div class="select-menu-item js-navigation-item selected" role="menuitem" tabindex="0">
<svg aria-hidden="true" class="octicon octicon-check select-menu-item-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5z"/></svg>
<div class="select-menu-item-text">
<input checked="checked" id="do_included" name="do" type="radio" value="included" />
<span class="select-menu-item-heading">Not watching</span>
<span class="description">Be notified when participating or @mentioned.</span>
<span class="js-select-button-text hidden-select-button-text">
<svg aria-hidden="true" class="octicon octicon-eye" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z"/></svg>
Watch
</span>
</div>
</div>
<div class="select-menu-item js-navigation-item " role="menuitem" tabindex="0">
<svg aria-hidden="true" class="octicon octicon-check select-menu-item-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5z"/></svg>
<div class="select-menu-item-text">
<input id="do_subscribed" name="do" type="radio" value="subscribed" />
<span class="select-menu-item-heading">Watching</span>
<span class="description">Be notified of all conversations.</span>
<span class="js-select-button-text hidden-select-button-text">
<svg aria-hidden="true" class="octicon octicon-eye" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z"/></svg>
Unwatch
</span>
</div>
</div>
<div class="select-menu-item js-navigation-item " role="menuitem" tabindex="0">
<svg aria-hidden="true" class="octicon octicon-check select-menu-item-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5z"/></svg>
<div class="select-menu-item-text">
<input id="do_ignore" name="do" type="radio" value="ignore" />
<span class="select-menu-item-heading">Ignoring</span>
<span class="description">Never be notified.</span>
<span class="js-select-button-text hidden-select-button-text">
<svg aria-hidden="true" class="octicon octicon-mute" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M8 2.81v10.38c0 .67-.81 1-1.28.53L3 10H1c-.55 0-1-.45-1-1V7c0-.55.45-1 1-1h2l3.72-3.72C7.19 1.81 8 2.14 8 2.81zm7.53 3.22l-1.06-1.06-1.97 1.97-1.97-1.97-1.06 1.06L11.44 8 9.47 9.97l1.06 1.06 1.97-1.97 1.97 1.97 1.06-1.06L13.56 8l1.97-1.97z"/></svg>
Stop ignoring
</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="fork-destination-box" style="display: none;">
<h2 class="facebox-header" data-facebox-id="facebox-header">Where should we fork this repository?</h2>
<include-fragment src=""
class="js-fork-select-fragment fork-select-fragment"
data-url="/lunasoft/sw-sdk-visual-delphi/fork?fragment=1">
<img alt="Loading" height="64" src="https://assets-cdn.github.com/images/spinners/octocat-spinner-128.gif" width="64" />
</include-fragment>
</div>
<a href="https://github.com/lunasoft/sw-sdk-visual-delphi/network" class="social-count"
aria-label="0 users forked this repository">
0
</a>
<h1 class="public ">
</div>
<div class="container">
<span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
<a href="https://github.com/lunasoft/sw-sdk-visual-delphi/issues" class="js-selected-navigation-item reponav-item" data-hotkey="g i" data-selected-links="repo_issues repo_labels repo_milestones /lunasoft/sw-sdk-visual-delphi/issues" itemprop="url">
<svg aria-hidden="true" class="octicon octicon-issue-opened" height="16" version="1.1" viewBox="0 0 14 16" width="14"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"/></svg>
<span itemprop="name">Issues</span>
<span class="Counter">0</span>
<meta itemprop="position" content="2">
Pull requests 1
<a href="https://github.com/lunasoft/sw-sdk-visual-delphi/projects" class="js-selected-navigation-item reponav-item" data-selected-links="repo_projects new_repo_project repo_project /lunasoft/sw-sdk-visual-delphi/projects">
<svg aria-hidden="true" class="octicon octicon-project" height="16" version="1.1" viewBox="0 0 15 16" width="15"><path fill-rule="evenodd" d="M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 0 0-1 1v14a1 1 0 0 0 1 1h13a1 1 0 0 0 1-1V1a1 1 0 0 0-1-1z"/></svg>
Projects
<span class="Counter" >0</span>
</div>
</div>
type="button" aria-label="Switch branches or tags" aria-expanded="false" aria-haspopup="true">
<i>Branch:</i>
<span class="js-select-button css-truncate-target">0.0.3.1</span>
<div class="select-menu-modal">
<div class="select-menu-header">
<svg aria-label="Close" class="octicon octicon-x js-menu-close" height="16" role="img" version="1.1" viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z"/></svg>
<span class="select-menu-title">Switch branches/tags</span>
</div>
<div class="select-menu-filters">
<div class="select-menu-text-filter">
<input type="text" aria-label="Find or create a branch…" id="context-commitish-filter-field" class="form-control js-filterable-field js-navigation-enable" placeholder="Find or create a branch…">
</div>
<div class="select-menu-tabs">
<ul>
<li class="select-menu-tab">
<a href="#" data-tab-filter="branches" data-filter-placeholder="Find or create a branch…" class="js-select-menu-tab" role="tab">Branches</a>
</li>
<li class="select-menu-tab">
<a href="#" data-tab-filter="tags" data-filter-placeholder="Find a tag…" class="js-select-menu-tab" role="tab">Tags</a>
</li>
</ul>
</div>
</div>
<div class="select-menu-list select-menu-tab-bucket js-select-menu-tab-bucket" data-tab-filter="branches" role="menu">
<div data-filterable-for="context-commitish-filter-field" data-filterable-type="substring">
<a class="select-menu-item js-navigation-item js-navigation-open selected"
href="https://github.com/lunasoft/sw-sdk-visual-delphi/blob/0.0.3.1/README.md"
data-name="0.0.3.1"
data-skip-pjax="true"
rel="nofollow">
<svg aria-hidden="true" class="octicon octicon-check select-menu-item-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5z"/></svg>
<span class="select-menu-item-text css-truncate-target js-select-menu-filter-text">
0.0.3.1
</span>
</a>
<a class="select-menu-item js-navigation-item js-navigation-open "
href="https://github.com/lunasoft/sw-sdk-visual-delphi/blob/develop/README.md"
data-name="develop"
data-skip-pjax="true"
rel="nofollow">
<svg aria-hidden="true" class="octicon octicon-check select-menu-item-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5z"/></svg>
<span class="select-menu-item-text css-truncate-target js-select-menu-filter-text">
develop
</span>
</a>
<a class="select-menu-item js-navigation-item js-navigation-open "
href="https://github.com/lunasoft/sw-sdk-visual-delphi/blob/master/README.md"
data-name="master"
data-skip-pjax="true"
rel="nofollow">
<svg aria-hidden="true" class="octicon octicon-check select-menu-item-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5z"/></svg>
<span class="select-menu-item-text css-truncate-target js-select-menu-filter-text">
master
</span>
</a>
</div>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form accept-charset="UTF-8" action="/lunasoft/sw-sdk-visual-delphi/branches" class="js-create-branch select-menu-item select-menu-new-item-form js-navigation-item js-new-item-form" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="236n1wymxOcS3PEme/IwC0NPcQGZlz59JGcYV5VRpDFIxAdUnCaNVumwgxXSIiW5EJ2iKxa2wB76R38EglS+oQ==" /></div>
<svg aria-hidden="true" class="octicon octicon-git-branch select-menu-item-icon" height="16" version="1.1" viewBox="0 0 10 16" width="10"><path fill-rule="evenodd" d="M10 5c0-1.11-.89-2-2-2a1.993 1.993 0 0 0-1 3.72v.3c-.02.52-.23.98-.63 1.38-.4.4-.86.61-1.38.63-.83.02-1.48.16-2 .45V4.72a1.993 1.993 0 0 0-1-3.72C.88 1 0 1.89 0 3a2 2 0 0 0 1 1.72v6.56c-.59.35-1 .99-1 1.72 0 1.11.89 2 2 2 1.11 0 2-.89 2-2 0-.53-.2-1-.53-1.36.09-.06.48-.41.59-.47.25-.11.56-.17.94-.17 1.05-.05 1.95-.45 2.75-1.25S8.95 7.77 9 6.73h-.02C9.59 6.37 10 5.73 10 5zM2 1.8c.66 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2C1.35 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2zm0 12.41c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm6-8c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z"/></svg>
<div class="select-menu-item-text">
<span class="select-menu-item-heading">Create branch: <span class="js-new-item-name"></span></span>
<span class="description">from ‘0.0.3.1’</span>
</div>
<input type="hidden" name="name" id="name" class="js-new-item-value">
<input type="hidden" name="branch" id="branch" value="0.0.3.1">
<input type="hidden" name="path" id="path" value="README.md">
<div class="select-menu-list select-menu-tab-bucket js-select-menu-tab-bucket" data-tab-filter="tags">
<div data-filterable-for="context-commitish-filter-field" data-filterable-type="substring">
<a class="select-menu-item js-navigation-item js-navigation-open "
href="https://github.com/lunasoft/sw-sdk-visual-delphi/tree/v0.0.2.1/README.md"
data-name="v0.0.2.1"
data-skip-pjax="true"
rel="nofollow">
<svg aria-hidden="true" class="octicon octicon-check select-menu-item-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5z"/></svg>
<span class="select-menu-item-text css-truncate-target" title="v0.0.2.1">
v0.0.2.1
</span>
</a>
</div>
<div class="select-menu-no-results">Nothing to show</div>
</div>
</div>
<div class="BtnGroup float-right">
<a href="https://github.com/lunasoft/sw-sdk-visual-delphi/find/0.0.3.1"
class="js-pjax-capture-input btn btn-sm BtnGroup-item"
data-pjax
data-hotkey="t">
Find file
</a>
<button aria-label="Copy file path to clipboard" class="js-zeroclipboard btn btn-sm BtnGroup-item tooltipped tooltipped-s" data-copied-hint="Copied!" type="button">Copy path</button>
</div>
<div class="breadcrumb js-zeroclipboard-target">
<span class="repo-root js-repo-root"><span class="js-path-segment"><a href="https://github.com/lunasoft/sw-sdk-visual-delphi/tree/0.0.3.1"><span>sw-sdk-visual-delphi</span></a></span></span><span class="separator">/</span><strong class="final-path">README.md</strong>
</div>
<div class="commit-tease-contributors">
<button type="button" class="btn-link muted-link contributors-toggle" data-facebox="#blob_contributors_box">
<strong>2</strong>
contributors
</button>
<a class="avatar-link tooltipped tooltipped-s" aria-label="alxcodes" href="https://github.com/lunasoft/sw-sdk-visual-delphi/commits/0.0.3.1/README.md?author=alxcodes"><img alt="@alxcodes" class="avatar" height="20" src="https://avatars1.githubusercontent.com/u/23086346?v=4&s=40" width="20" /> </a>
<a class="avatar-link tooltipped tooltipped-s" aria-label="ecs515" href="https://github.com/lunasoft/sw-sdk-visual-delphi/commits/0.0.3.1/README.md?author=ecs515"><img alt="@ecs515" class="avatar" height="20" src="https://avatars2.githubusercontent.com/u/30845192?v=4&s=40" width="20" /> </a>
</div>
<div id="blob_contributors_box" style="display:none">
<h2 class="facebox-header" data-facebox-id="facebox-header">Users who have contributed to this file</h2>
<ul class="facebox-user-list" data-facebox-id="facebox-description">
<li class="facebox-user-list-item">
<img alt="@alxcodes" height="24" src="https://avatars3.githubusercontent.com/u/23086346?v=4&s=48" width="24" />
<a href="https://github.com/alxcodes">alxcodes</a>
</li>
<li class="facebox-user-list-item">
<img alt="@ecs515" height="24" src="https://avatars0.githubusercontent.com/u/30845192?v=4&s=48" width="24" />
<a href="https://github.com/ecs515">ecs515</a>
</li>
</ul>
</div>
<div class="BtnGroup">
<a href="https://github.com/lunasoft/sw-sdk-visual-delphi/raw/0.0.3.1/README.md" class="btn btn-sm BtnGroup-item" id="raw-url">Raw</a>
<a href="https://github.com/lunasoft/sw-sdk-visual-delphi/blame/0.0.3.1/README.md" class="btn btn-sm js-update-url-with-hash BtnGroup-item" data-hotkey="b">Blame</a>
<a href="https://github.com/lunasoft/sw-sdk-visual-delphi/commits/0.0.3.1/README.md" class="btn btn-sm BtnGroup-item" rel="nofollow">History</a>
</div>
<a class="btn-octicon tooltipped tooltipped-nw"
href="https://desktop.github.com"
aria-label="Open this file in GitHub Desktop"
data-ga-click="Repository, open with desktop, type:windows">
<svg aria-hidden="true" class="octicon octicon-device-desktop" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M15 2H1c-.55 0-1 .45-1 1v9c0 .55.45 1 1 1h5.34c-.25.61-.86 1.39-2.34 2h8c-1.48-.61-2.09-1.39-2.34-2H15c.55 0 1-.45 1-1V3c0-.55-.45-1-1-1zm0 9H1V3h14v8z"/></svg>
</a>
<!-- '"` --><!-- </textarea></xmp> --></option></form><form accept-charset="UTF-8" action="/lunasoft/sw-sdk-visual-delphi/edit/0.0.3.1/README.md" class="inline-form js-update-url-with-hash" method="post"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="✓" /><input name="authenticity_token" type="hidden" value="Q2xWUmwu/UUArnfRM8OuylJ78SF2iLTtDtYbFe6Q/a/3u5mPk34CXm13TwvcUg1Ezd6MShppcybnEOg+xI0cWw==" /></div>
<button class="btn-octicon tooltipped tooltipped-nw" type="submit"
aria-label="Edit this file" data-hotkey="e" data-disable-with>
<svg aria-hidden="true" class="octicon octicon-pencil" height="16" version="1.1" viewBox="0 0 14 16" width="14"><path fill-rule="evenodd" d="M0 12v3h3l8-8-3-3-8 8zm3 2H1v-2h1v1h1v1zm10.3-9.3L12 6 9 3l1.3-1.3a.996.996 0 0 1 1.41 0l1.59 1.59c.39.39.39 1.02 0 1.41z"/></svg>
</button>
Para utilizar los servicios de SW con Delphi se debe tener primeramente el fichero DLL correspondiente a SWServices.dll y su dependencia MSXML2_TLB.dcu.
- Para poder correr el ejemplo necesitas tener instalado Embarcadero® Delphi 10.2
-
Ambos archivos se pueden encontrar en el repositorio de github correspondiente al proyecto sw-sdk-visual-delphi https://github.com/lunasoft/sw-sdk-visual-delphi en la carpeta Release (https://github.com/lunasoft/sw-sdk-visual-delphi/releases).
-
Otra alternativa seria clonar el proyecto y compilarlo para generar la DLL y el archivo DCU.
El proyecto de ejemplo cuenta con un formulario principal el cual tiene botones referentes a los servicios Autenticar, Timbrado, Cancelacion y Consulta de Saldo
Para incluir la DLL de nuestro servicio es necesaria indicarla de la siguiente manera:
function Authentication(User, Password, URL: String):String; stdcall external 'SWServices.dll';
function StampV1(URL, XML, Token: String):String; stdcall external 'SWServices.dll';
function StampV2(URL, XML, Token: String):String; stdcall external 'SWServices.dll';
function StampV3(URL, XML, Token: String):String; stdcall external 'SWServices.dll';
function StampV4(URL, XML, Token: String):String; stdcall external 'SWServices.dll';
function CancelByPFX (Token, URL, PFX, UUID, PasswordKey, RFC: String):String; stdcall external 'SWServices.dll';
function CancelByXML (Token, URL, XML: String):String; stdcall external 'SWServices.dll';
function CancelByCSD (Token, URL, UUID, PasswordKey, RFC, Cer, Key: String):String; stdcall external 'SWServices.dll';
function AccountBalance(Token, URL: String):String; stdcall external 'SWServices.dll';
Dentro de nuestro proyecto declararemos las constantes siguientes
User : String = 'demo';
Password : String = '123456789';
URL : String = 'http://services.test.sw.com.mx';
- El String User recibe el Usuario que se utilizara para autenticarse el cual en nuestro ambiente de pruebas seria 'demo'
- El String Password recibe la Contraseña que necesita para poder obtener el token el cual seria '123456789'
- El URL User recibe la Url a donde apuntara el servicio la cual en nuestro ambiente de prueba sería 'http://services.test.sw.com.mx/security/authenticate'
ShowMessage(Authentication(User, Password, URL) );
- El ShowMessage arroja el resultado del servicio de autenticación
-
Aquí tenemos cuatro formas de timbrado(V1, V2, V3, V4) todos los metodos necesitan de un XML ya selllado
-
En todos los metódos enviaremos los parametros en el siguiente orden: URL, XML y Autenticación, esta última podemos acceder a ella mediante la función de Authentication
-
Timbrado Versión 1 devuelve solo el TFD de la factura
XML: String;FileStream : TFileStream; Bytes: TBytes; Respuesta: String; begin FileStream := TFileStream.Create( 'C:\Users\office-user\Documents\Embarcadero\Studio\Projects\Timbrado\Data\cancelar.xml', fmOpenRead or fmShareDenyWrite); SetLength(Bytes, FileStream.Size); FileStream.Read(Bytes[0], FileStream.Size); XML := TEncoding.ASCII.GetString(Bytes); FileStream.Free; ShowMessage(StampV1(URL, XML, Token) );
- Timbrado Versión 2 devuelve solo el TFD y el CFDI de la factura
XML: String;
FileStream : TFileStream;
Bytes: TBytes;
Respuesta: String;
begin
FileStream := TFileStream.Create( 'C:\Users\office-user\Documents\Embarcadero\Studio\Projects\Timbrado\Data\cancelar.xml', fmOpenRead or fmShareDenyWrite);
SetLength(Bytes, FileStream.Size);
FileStream.Read(Bytes[0], FileStream.Size);
XML := TEncoding.ASCII.GetString(Bytes);
FileStream.Free;
ShowMessage(StampV2(URL, XML, Token) );
- Timbrado Versión 3 devuelve solo el TFD y el TFD ya unidos de la factura
var XML: String; FileStream : TFileStream; Bytes: TBytes; Respuesta: String; begin FileStream := TFileStream.Create( 'C:\Users\office-user\Documents\Embarcadero\Studio\Projects\Timbrado\Data\cancelar.xml', fmOpenRead or fmShareDenyWrite); SetLength(Bytes, FileStream.Size); FileStream.Read(Bytes[0], FileStream.Size); XML := TEncoding.ASCII.GetString(Bytes); FileStream.Free; ShowMessage(Stampv3(URL, XML, Token) ); end;En caso
- Timbrado Versión 4 este servicio devuelve CFDI, TFD, CadenaOriginal, noCertificadoSat, noCertificadoCFDI, UUID, selloSAT, selloCFDI, fechaTimbrado y QR. Este servicio recibe el comprobante ya sellado.
var
XML: String;
FileStream : TFileStream;
Bytes: TBytes;
Respuesta: String;
begin
FileStream := TFileStream.Create( 'C:\Users\office-user\Documents\Embarcadero\Studio\Projects\Timbrado\Data\cancelar.xml', fmOpenRead or fmShareDenyWrite);
SetLength(Bytes, FileStream.Size);
FileStream.Read(Bytes[0], FileStream.Size);
XML := TEncoding.ASCII.GetString(Bytes);
FileStream.Free;
ShowMessage(Stampv4(URL, XML, Token) );
-
Cancelación por CSD Como su nombre lo indica, este servicio recibe todos los elementos que componen el CSD en base64 los cuales son los siguientes:
Certificado (.cer)
Key (.key)
Password del archivo key
RFC emisor
var XML, UUID, Cer, Key, PasswordKey, RFC: String; FileStream : TFileStream; Bytes: TBytes; begin
UUID := '091f85fb-6b7b-4738-ad41-da42752af610'; RFC := 'LAN7008173R5';FileStream := TFileStream.Create( 'C:\Users\office-user\Documents\Embarcadero\Studio\Projects\Timbrado\Data\XML.xml', fmOpenRead or fmShareDenyWrite); SetLength(Bytes, FileStream.Size); FileStream.Read(Bytes[0], FileStream.Size); XML := TEncoding.ASCII.GetString(Bytes); FileStream.Free;
FileStream := TFileStream.Create( 'C:\Users\office-user\Documents\Embarcadero\Studio\Projects\Timbrado\Data\RFC.cer', fmOpenRead or fmShareDenyWrite); SetLength(Bytes, FileStream.Size); FileStream.Read(Bytes[0], FileStream.Size); Cer := TEncoding.ASCII.GetString(Bytes); FileStream.Free;
FileStream := TFileStream.Create( 'C:\Users\office-user\Documents\Embarcadero\Studio\Projects\Timbrado\Data\RFC.key', fmOpenRead or fmShareDenyWrite); SetLength(Bytes, FileStream.Size); FileStream.Read(Bytes[0], FileStream.Size); Key := Base64Encode(TEncoding.ASCII.GetString(Bytes)); FileStream.Free;
ShowMessage(CancelByCSD(Authentication(User, Password, URL), URL, UUID, PasswordKey, RFC, Cer, Key));end;
-
Cancelación por XML
Como su nombre lo indica, este servicio recibe únicamente el XML sellado con los UUID a cancelar.
var XML: String; FileStream : TFileStream; Bytes: TBytes; begin FileStream := TFileStream.Create( 'C:\Users\office-user\Documents\Embarcadero\Studio\Projects\Timbrado\Data\cancelar.xml', fmOpenRead or fmShareDenyWrite); SetLength(Bytes, FileStream.Size); FileStream.Read(Bytes[0], FileStream.Size); XML := TEncoding.ASCII.GetString(Bytes); FileStream.Free;ShowMessage(CancelByXML(Authentication(User, Password, URL),URL, XML));
end;
- Cancelacion por PFX
Como su nombre lo indica, este servicio recibe todos los elementos que componen el PFX los cuales son los siguientes:
PFX
Password del archivo key
RFC emisor
Enviaremos los siguientes parametros
var XML, PFX, UUID, PasswordKey, RFC: String; FileStream : TFileStream; Bytes: TBytes; begin RFC := 'LAN7008173R5'; PasswordKey := '12345678a'; UUID := '091f85fb-6b7b-4738-ad41-da42752af610';FileStream := TFileStream.Create( 'C:\Users\office-user\Documents\Embarcadero\Studio\Projects\Timbrado\Data\certificado.pfx', fmOpenRead or fmShareDenyWrite); SetLength(Bytes, FileStream.Size); FileStream.Read(Bytes[0], FileStream.Size); PFX := Base64Encode(TEncoding.ASCII.GetString(Bytes)); FileStream.Free; ShowMessage(CancelByPFX(Authentication(User, Password, URL), URL, PFX, UUID, PasswordKey, RFC));
end;
- Consulta de Saldo
Este servicio recibe el token y genera los elementos que componen la consulta de saldos:
begin
ShowMessage(AccountBalance(Authentication(User, Password, URL),URL));
end;
Jump to Line
</div>
<a href="https://github.com" aria-label="Homepage" class="footer-octicon" title="GitHub">
<svg aria-hidden="true" class="octicon octicon-mark-github" height="24" version="1.1" viewBox="0 0 16 16" width="24"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8-8z"/></svg>
<script crossorigin="anonymous" integrity="sha256-ADlWtmO0Qfn/6JFR8DV8xKaQfuJQgDIYo/A0n82SxfQ=" src="https://assets-cdn.github.com/assets/frameworks-003956b663b441f9ffe89151f0357cc4a6907ee250803218a3f0349fcd92c5f4.js"></script>
<script async="async" crossorigin="anonymous" integrity="sha256-MPSh3jBvoVPCMsiIExfnJPw7HK2nk4BuVM4pHCrAaRI=" src="https://assets-cdn.github.com/assets/github-30f4a1de306fa153c232c8881317e724fc3b1cada793806e54ce291c2ac06912.js"></script>