<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#38; pourquoi j’n’écrirais pas ça ? &#187; 2009</title>
	<atom:link href="http://blogs.wittwer.fr/whiler/tag/2009/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.wittwer.fr/whiler</link>
	<description>Pour partager des choses que j&#039;ai envie d&#039;écrire...</description>
	<lastBuildDate>Fri, 20 Jan 2012 19:07:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Session All-Access du CodeWay 3</title>
		<link>http://blogs.wittwer.fr/whiler/2009/11/20/video-all-access/</link>
		<comments>http://blogs.wittwer.fr/whiler/2009/11/20/video-all-access/#comments</comments>
		<pubDate>Fri, 20 Nov 2009 12:30:24 +0000</pubDate>
		<dc:creator>Whiler</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[2009]]></category>
		<category><![CDATA[Embarcadero]]></category>

		<guid isPermaLink="false">http://blogs.wittwer.fr/whiler/?p=893</guid>
		<description><![CDATA[Lors du CodeWay 3, j&#8217;ai présenté une session sur Embarcadero All-Access. Le sujet était : Qui ne souhaiterait pas accéder à un ensemble de fonctionnalités simplifiant, accélérant et pouvant automatiser des tâches récurrentes ou spécifiques via un point d’accès unique ? All-Access est une suite de logiciels de développement et d’outils de bases de données, [...]]]></description>
			<content:encoded><![CDATA[<p>Lors du <a target="_blank" href="http://codegear.logix.fr/blog/index.php/2009/11/13/agenda-codeway-3-plus-que-quelques-jours-pour-sinscrire/">CodeWay 3</a>, j&#8217;ai présenté une session sur <a target="_blank" href="http://www.embarcadero.com/products/all-access">Embarcadero All-Access</a>.<br />
Le sujet était :</p>
<blockquote><p>Qui ne souhaiterait pas accéder à un ensemble de fonctionnalités simplifiant, accélérant et pouvant automatiser des tâches récurrentes ou spécifiques via un point d’accès unique ?</p>
<p>All-Access est <a target="_blank" href="http://www.embarcadero.com/products/all-access/all-access-products">une suite de logiciels</a> de développement et d’outils de bases de données, centralisée, accessible au sein de l’entreprise, sans installation spécifique sur les postes des développeurs…</p>
<p>Au cours de cette session, nous survolerons l&#8217;ensemble de la gamme des outils offert par cette solution et verrons sa simplicité de mise en œuvre (comment <a target="_blank" href="https://downloads.embarcadero.com/free/aa_client">évaluer</a>, comment <a target="_blank" href="http://docs.embarcadero.com/products/all_access/">démarrer</a>).</p></blockquote>
<p>Si vous l&#8217;avez ratée ou désirez la revoir, la voici divisée en trois partie :<span id="more-893"></span></p>
<h2>Les diapositives commentées</h2>
<p><center><object width="420" height="336"><param name="movie" value="http://www.dailymotion.com/swf/xb7lv3_embarcadero-allaccess-session-du-co_tech" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://www.dailymotion.com/swf/xb7lv3_embarcadero-allaccess-session-du-co_tech" allowscriptaccess="always" allowfullscreen="true" width="420" height="336"></embed></object></center></p>
<p>
&nbsp;</p>
<h2>Comment évaluer la solution</h2>
<p><center><object width="420" height="336"><param name="movie" value="http://www.dailymotion.com/swf/xb7lnh_embarcadero-allaccess-session-du-co_tech" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://www.dailymotion.com/swf/xb7lnh_embarcadero-allaccess-session-du-co_tech" allowscriptaccess="always" allowfullscreen="true" width="420" height="336"></embed></object></center></p>
<p>
&nbsp;</p>
<h2>Utilisation des serveurs All-Access &#038; ELC</h2>
<p><center><object width="420" height="336"><param name="movie" value="http://www.dailymotion.com/swf/xb7lx2_embarcadero-allaccess-session-du-co_tech" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed src="http://www.dailymotion.com/swf/xb7lx2_embarcadero-allaccess-session-du-co_tech" allowscriptaccess="always" allowfullscreen="true" width="420" height="336"></embed></object></center></p>
<p>
&nbsp;</p>
<p>Pour rappel, l&#8217;évaluation de cette solution est disponible ici :<br />
<center><a target="_blank" href="https://downloads.embarcadero.com/free/aa_client">https://downloads.embarcadero.com/free/aa_client</a></center></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.wittwer.fr/whiler/2009/11/20/video-all-access/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Localisations…</title>
		<link>http://blogs.wittwer.fr/whiler/2009/11/19/cw3sample/</link>
		<comments>http://blogs.wittwer.fr/whiler/2009/11/19/cw3sample/#comments</comments>
		<pubDate>Thu, 19 Nov 2009 13:00:40 +0000</pubDate>
		<dc:creator>Whiler</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[2009]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Embarcadero]]></category>
		<category><![CDATA[GeoLite]]></category>
		<category><![CDATA[localisation]]></category>
		<category><![CDATA[MaxMind]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[translate]]></category>

		<guid isPermaLink="false">http://blogs.wittwer.fr/whiler/?p=872</guid>
		<description><![CDATA[Depuis le début de la semaine, je suis le CodeWay 3… Dans cet article, je vous propose de retrouver une application mettant en œuvre différents points abordés durant les diverses sessions dont : Les composants TMS Software, l TWebGoogleMap de Thierry Laborde, comment internationaliser une application Delphi...]]></description>
			<content:encoded><![CDATA[<p>Depuis le début de la semaine, je suis le <a target="_blank" href="http://codegear.logix.fr/blog/index.php/2009/11/13/agenda-codeway-3-plus-que-quelques-jours-pour-sinscrire/">CodeWay 3</a>&#8230;</p>
<p>Dans cet article, je vous propose de retrouver une application mettant en œuvre différents points abordés durant les diverses sessions dont :</p>
<ul>
<li>Les composants <a target="_blank" href="http://www.tmssoftware.com/site/advsmoothcontrols.asp">TMS Software</a></li>
<li>Le TWebGoogleMap de <a target="_blank" href="http://www.thierry-laborde.com/">Thierry Laborde</a></li>
<li>Comment <a target="_blank" href="http://www.obones.com/codeway3">internationaliser</a> une application Delphi</li>
</ul>
<p>L&#8217;application ressemble à ceci :<br />
<div id="attachment_874" class="wp-caption aligncenter" style="width: 310px"><a title="Interface en français" href="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/map.jpg" rel="lightbox[872]"><img src="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/map-300x223.jpg" alt="Interface en français" title="Cliquer pour agrandir" width="300" height="223" class="size-medium wp-image-874" /></a><p class="wp-caption-text">Interface en français</p></div></p>
<p>On remarquera que l&#8217;interface est en français sur la capture ci-dessus. </p>
<p>Cette fois-ci, l&#8217;interface est en anglais :<span id="more-872"></span><br />
<div id="attachment_873" class="wp-caption aligncenter" style="width: 310px"><a title="Carte mixte, interface en anglais" href="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/hybrid.jpg" rel="lightbox[872]"><img src="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/hybrid-300x223.jpg" alt="Carte mixte, interface en anglais" title="Cliquer pour agrandir" width="300" height="223" class="size-medium wp-image-873" /></a><p class="wp-caption-text">Carte mixte, interface en anglais</p></div></p>
<p>La mise en œuvre est parfaitement décrite dans la <a target="_blank" href="http://www.obones.com/codeway3">session d&#8217;Olivier Sannier</a> ainsi que dans la <a target="_blank" href="http://dxgettext.po.dk/documentation">documentation</a> fournie avec le programme d&#8217;installation de <a target="_blank" href="http://dxgettext.po.dk/">dxgettext</a> permettant d&#8217;avoir tout sous la main.</p>
<p>Dans mon exemple, j&#8217;ai mis en œuvre :</p>
<ul>
<li>traduction simple</li>
<li>traduction avec plusieurs variables</li>
<li>traduction avec pluriel</li>
<li>utilisation de la langue courante de l&#8217;OS</li>
<li>modification de la langue à chaud</li>
</ul>
<p>Le TWebGoogleMap de Thierry utilise l&#8217;<a target="_blank" href="http://code.google.com/intl/fr/apis/maps/documentation/reference.html">API de Google</a> pour afficher l&#8217;interface de <a target="_blank" href="http://maps.google.com/maps?hl=fr">Google Maps</a> et permet de gérer très facilement l&#8217;ajout de <a target="_blank" href="http://code.google.com/intl/fr/apis/maps/documentation/reference.html#GMarker">marqueurs</a>, les différents <a target="_blank" href="http://code.google.com/intl/fr/apis/maps/documentation/reference.html#GMapType">types de cartes</a>, les <a target="_blank" href="http://code.google.com/intl/fr/apis/maps/documentation/reference.html#GMap2.setZoom">zooms</a>, &#8230;<br />
<div id="attachment_875" class="wp-caption aligncenter" style="width: 310px"><a title="Carte du relief" href="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/terrain.jpg" rel="lightbox[872]"><img src="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/terrain-300x223.jpg" alt="Carte du relief" title="Cliquer pour agrandir" width="300" height="223" class="size-medium wp-image-875" /></a><p class="wp-caption-text">Carte du relief</p></div></p>
<p>Avec le TWebGoogleMap, j&#8217;ai mis en œuvre :</p>
<ul>
<li>latitude et longitude</li>
<li>les types de cartes</li>
<li>le zoom</li>
<li>les marqueurs : ajout, suppression, click</li>
</ul>
<p>Les sources sont disponibles ici : <a href='http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/wgeoipgs_src.zip'>Sources</a><br />
Pour tester l&#8217;application compilée, il suffit de décompacter le fichier suivant : <a href='http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/wgeoipgs.zip'>Application compilée</a><br />
Avant d&#8217;effectuer une première recherche, vous devez avoir la <a title="Cliquer pour télécharger la base de données de Maxmind" href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz">base de données de Maxmind</a> dans le même répertoire que l&#8217;application. Vous pouvez retourner sur le <a href="http://blogs.wittwer.fr/whiler/2009/10/19/sample-geolite-city-delphi/">précédent article</a> plus détaillé sur la géolocalisation.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.wittwer.fr/whiler/2009/11/19/cw3sample/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Personnalisation d’un clavier visuel dans Delphi</title>
		<link>http://blogs.wittwer.fr/whiler/2009/11/06/delphi-custom-clavier-visuel/</link>
		<comments>http://blogs.wittwer.fr/whiler/2009/11/06/delphi-custom-clavier-visuel/#comments</comments>
		<pubDate>Thu, 05 Nov 2009 23:30:14 +0000</pubDate>
		<dc:creator>Whiler</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[-Belly-]]></category>
		<category><![CDATA[2009]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[coloration syntaxique]]></category>
		<category><![CDATA[localisation]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://blogs.wittwer.fr/whiler/?p=769</guid>
		<description><![CDATA[Delphi 2010 ajoute encore de nouveaux composants à la VCL… Parmi ceux-ci, on trouve un clavier visuel, permettant d’étendre les capacités de ses applications en ayant la possibilité de le proposer dans son interface, très pratique sur des périphériques à écrans tactiles !
Depuis la palette d’outils de l’environnement de conception de Delphi, dans la catégorie Tactile, on trouve le composant TTouchKeyboard. Il suffit simplement de l’ajouter dans la fiche de son choix.
Le clavier tactile s’adapte automatiquement à celui du système d’exploitation : On utilise un Windows en français, on a un clavier AZERTY. On est sous un Windows anglais, on a un QWERTY.
On peut personnaliser le clavier en modifiant ses propriétés directement depuis l’inspecteur d’objets. Dans le code ci-dessous, je vais montrer comment surcharger une méthode de ce clavier pour redéfinir l’apparence des différentes touches…]]></description>
			<content:encoded><![CDATA[<p><a href="http://fr.wikipedia.org/wiki/Delphi_(informatique)" rel="glossary" target="_blank" title="Wikipedia, D&eacute;finition de&nbsp;: Delphi" style="" >Delphi</a><sup style="font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA" ><em>W</em></sup> 2010 ajoute encore de nouveaux composants à la <a href="http://fr.wikipedia.org/wiki/VCL" rel="glossary" target="_blank" title="Wikipedia, D&eacute;finition de&nbsp;: VCL" style="" >VCL</a><sup style="font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA" ><em>W</em></sup>&#8230;</p>
<p>Parmi ceux-ci, on trouve un clavier visuel, permettant d&#8217;étendre les capacités de ses applications en ayant la possibilité de le proposer dans son interface, très pratique sur des périphériques à <a href="http://fr.wikipedia.org/wiki/Écran_tactile" rel="glossary" target="_blank" title="Wikipedia, D&eacute;finition de&nbsp;: écrans tactiles" style="" >écrans tactiles</a><sup style="font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA" ><em>W</em></sup> <img src='http://blogs.wittwer.fr/whiler/wp-includes/images/smilies/cool.gif' alt=':cool:' class='wp-smiley' />  </p>
<p>Depuis la palette d&#8217;outils de l&#8217;environnement de conception de Delphi, dans la catégorie <em>Tactile</em>, on trouve le composant <a title="Cliquer pour voir la documentation du composant" target="_blank" href="http://docwiki.embarcadero.com/VCL/en/Keyboard.TTouchKeyboard"><code class="codecolorer delphi dawn"><span class="delphi">TTouchKeyboard</span></code></a>. Il suffit simplement de l&#8217;ajouter dans la fiche de son choix.<br />
Voici son aspect par défaut, avec un <a href="http://fr.wikipedia.org/wiki/Système_d'exploitation" rel="glossary" target="_blank" title="Wikipedia, D&eacute;finition de&nbsp;: OS" style="" >OS</a><sup style="font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA" ><em>W</em></sup> en français :<br />
<div id="attachment_770" class="wp-caption aligncenter" style="width: 310px"><a title="Delphi : Clavier tactile" href="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/keyboard-delphi-2010.jpg" rel="lightbox[769]"><img src="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/keyboard-delphi-2010-300x176.jpg" alt="Delphi : Clavier tactile" title="Cliquer pour agrandir" width="300" height="176" class="size-medium wp-image-770" /></a><p class="wp-caption-text">Delphi : Clavier tactile</p></div></p>
<p>Le clavier tactile s&#8217;adapte automatiquement à celui du système d&#8217;exploitation : On utilise un Windows en français, on a un clavier <a href="http://fr.wikipedia.org/wiki/AZERTY" rel="glossary" target="_blank" title="Wikipedia, D&eacute;finition de&nbsp;: AZERTY" style="" >AZERTY</a><sup style="font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA" ><em>W</em></sup>. On est sous un Windows anglais, on a un <a href="http://fr.wikipedia.org/wiki/QWERTY" rel="glossary" target="_blank" title="Wikipedia, D&eacute;finition de&nbsp;: QWERTY" style="" >QWERTY</a><sup style="font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA" ><em>W</em></sup>.</p>
<p>On peut personnaliser le clavier en modifiant ses propriétés directement depuis l&#8217;inspecteur d&#8217;objets. Mais trouvant le design par défaut trop joli, je vais dans le code ci-dessous, montrer comment surcharger une méthode de ce clavier pour redéfinir l&#8217;apparence des différentes touches.<br />
<span id="more-769"></span><br />
Pour cela, j&#8217;ai besoin de Delphi 2010, actuellement <a title="Visiter la page de téléchargement de Delphi" target="_blank" href="https://downloads.embarcadero.com/free/delphi">téléchargeable</a> depuis le site d&#8217;<a title="Cliquer pour visiter le site d'Embarcadero" target="_blank" href="http://www.embarcadero.com/">Embarcadero</a>.<br />
<center><a title="Visiter le site Web de Delphi" href="http://www.embarcadero.com/products/delphi"><img src="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/logo-delphi.png" alt="Delphi" width="114" height="114" class="size-full wp-image-776" /></a></center></p>
<p>
&nbsp;</p</p>
<p>On>Application Fiches VCL &#8211; Delphi</em>.<br />
Puis on place un composant <code class="codecolorer delphi dawn"><span class="delphi">TTouchKeyboard</span></code> sur la fiche.</p>
<p>On peut ensuite aller dans le code afin d&#8217;ajouter les types et fonctions nécessaires.<br />
J&#8217;ai trouvé un code sur un <a title="Aller voir le blog japonais" target="_blank" href="http://d.hatena.ne.jp/tales/20090926">blog japonais</a> qui m&#8217;a servi de base pour l&#8217;implémentation et comprendre le fonctionnement.<br />
Le principe est simple, on va hériter de la classe représentant une touche du clavier, afin de pouvoir surcharger sa procédure Paint. On peut ainsi la redessiner à sa guise.</p>
<p>Voici la première version :</p>
<div class="codecolorer-container delphi dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:480px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br /></div></td><td><div class="delphi codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">unit</span> main<span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">interface</span><br />
<br />
<span style="color: #000000; font-weight: bold;">uses</span><br />
&nbsp; Windows<span style="color: #000066;">,</span> Messages<span style="color: #000066;">,</span> SysUtils<span style="color: #000066;">,</span> Variants<span style="color: #000066;">,</span> Classes<span style="color: #000066;">,</span> Graphics<span style="color: #000066;">,</span> Controls<span style="color: #000066;">,</span> Forms<span style="color: #000066;">,</span><br />
&nbsp; Dialogs<span style="color: #000066;">,</span> Keyboard<span style="color: #000066;">,</span> KeyboardTypes<span style="color: #000066;">,</span> Math<span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">type</span><br />
&nbsp; TTempTouchKeyboard <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">class</span><span style="color: #000066;">&#40;</span>TCustomTouchKeyboard<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; TMyKeyboardButton &nbsp;<span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">class</span><span style="color: #000066;">&#40;</span>TCustomKeyboardButton<span style="color: #000066;">&#41;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">public</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">procedure</span> Paint<span style="color: #000066;">&#40;</span>Canvas<span style="color: #000066;">:</span> TCustomCanvas <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">nil</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">override</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">type</span><br />
&nbsp; TfrmMain <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">class</span><span style="color: #000066;">&#40;</span>TForm<span style="color: #000066;">&#41;</span><br />
&nbsp; TouchKeyboard1<span style="color: #000066;">:</span> TTouchKeyboard<span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">procedure</span> FormCreate<span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; frmMain<span style="color: #000066;">:</span> TfrmMain<span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">implementation</span><br />
<br />
<span style="color: #008000; font-style: italic;">{$R *.dfm}</span><br />
<br />
<span style="color: #000000; font-weight: bold;">procedure</span> TMyKeyboardButton<span style="color: #000066;">.</span><span style="color: #006600;">Paint</span><span style="color: #000066;">&#40;</span>Canvas<span style="color: #000066;">:</span> TCustomCanvas<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; LRect<span style="color: #000066;">:</span> &nbsp; &nbsp;TRect<span style="color: #000066;">;</span><br />
&nbsp; LCanvas<span style="color: #000066;">:</span> &nbsp;TCanvas<span style="color: #000066;">;</span><br />
&nbsp; LCaption<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">String</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">const</span><br />
&nbsp; <span style="color: #808080; font-style: italic;">//TDrawState = (dsNormal, dsPressed, dsDisabled);</span><br />
&nbsp; acKeyColors<span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">array</span><span style="color: #000066;">&#91;</span>TDrawState<span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> TColor <span style="color: #000066;">=</span> <span style="color: #000066;">&#40;</span>clWhite<span style="color: #000066;">,</span> clYellow<span style="color: #000066;">,</span> clGray<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #000000; font-weight: bold;">procedure</span> DrawOneChar<span style="color: #000066;">&#40;</span>rSize<span style="color: #000066;">:</span> TRect<span style="color: #000066;">;</span> cWhere<span style="color: #000066;">:</span> TCanvas<span style="color: #000066;">;</span> sWhat<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; rSize<span style="color: #000066;">.</span><span style="color: #006600;">Left</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> rSize<span style="color: #000066;">.</span><span style="color: #006600;">Left</span> <span style="color: #000066;">+</span> <span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span>rSize<span style="color: #000066;">.</span><span style="color: #006600;">Right</span><span style="color: #000066;">-</span>rSize<span style="color: #000066;">.</span><span style="color: #006600;">Left</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">-</span> cWhere<span style="color: #000066;">.</span><span style="color: #006600;">TextWidth</span><span style="color: #000066;">&#40;</span>sWhat<span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">div</span> <span style="color: #0000ff;">2</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; rSize<span style="color: #000066;">.</span><span style="color: #006600;">Top</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> rSize<span style="color: #000066;">.</span><span style="color: #006600;">Top</span> <span style="color: #000066;">+</span> <span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span>rSize<span style="color: #000066;">.</span><span style="color: #006600;">Bottom</span><span style="color: #000066;">-</span>rSize<span style="color: #000066;">.</span><span style="color: #006600;">Top</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">-</span> cWhere<span style="color: #000066;">.</span><span style="color: #006600;">TextHeight</span><span style="color: #000066;">&#40;</span>sWhat<span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">div</span> <span style="color: #0000ff;">2</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; &nbsp; cWhere<span style="color: #000066;">.</span><span style="color: #006600;">TextOut</span><span style="color: #000066;">&#40;</span>rSize<span style="color: #000066;">.</span><span style="color: #006600;">Left</span><span style="color: #000066;">,</span> rSize<span style="color: #000066;">.</span><span style="color: #006600;">Top</span><span style="color: #000066;">,</span> sWhat<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #000000; font-weight: bold;">function</span> GetOverrideCaption<span style="color: #000066;">&#40;</span>Keyboard<span style="color: #000066;">:</span> TCustomTouchKeyboard<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">const</span> Key<span style="color: #000066;">:</span> TVirtualKey<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> Caption<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Boolean</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> Keyboard<span style="color: #000066;">.</span><span style="color: #006600;">CaptionOverrides</span><span style="color: #000066;">.</span><span style="color: #006600;">HasCaption</span><span style="color: #000066;">&#40;</span>Key<span style="color: #000066;">.</span><span style="color: #006600;">PublishedName</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; Caption <span style="color: #000066;">:</span><span style="color: #000066;">=</span> Keyboard<span style="color: #000066;">.</span><span style="color: #006600;">CaptionOverrides</span><span style="color: #000066;">.</span><span style="color: #006600;">GetCaption</span><span style="color: #000066;">&#40;</span>Key<span style="color: #000066;">.</span><span style="color: #006600;">PublishedName</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">True</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> Keyboard<span style="color: #000066;">.</span><span style="color: #006600;">CaptionOverrides</span><span style="color: #000066;">.</span><span style="color: #006600;">HasCaption</span><span style="color: #000066;">&#40;</span>Key<span style="color: #000066;">.</span><span style="color: #006600;">PublishedName</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; Caption <span style="color: #000066;">:</span><span style="color: #000066;">=</span> Keyboard<span style="color: #000066;">.</span><span style="color: #006600;">CaptionOverrides</span><span style="color: #000066;">.</span><span style="color: #006600;">GetCaption</span><span style="color: #000066;">&#40;</span>Key<span style="color: #000066;">.</span><span style="color: #006600;">PublishedName</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">True</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">False</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> Canvas &lt;&gt; <span style="color: #000000; font-weight: bold;">nil</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; LCanvas <span style="color: #000066;">:</span><span style="color: #000066;">=</span> Canvas <span style="color: #000000; font-weight: bold;">as</span> TCanvas<br />
&nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; LCanvas <span style="color: #000066;">:</span><span style="color: #000066;">=</span> TTempTouchKeyboard<span style="color: #000066;">&#40;</span>Parent<span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">Canvas</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; LRect <span style="color: #000066;">:</span><span style="color: #000066;">=</span> ClientRect<span style="color: #000066;">;</span><br />
&nbsp; LCanvas<span style="color: #000066;">.</span><span style="color: #006600;">Font</span><span style="color: #000066;">.</span><span style="color: #006600;">Name</span> &nbsp; <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">'Arial'</span><span style="color: #000066;">;</span><br />
&nbsp; LCanvas<span style="color: #000066;">.</span><span style="color: #006600;">Pen</span><span style="color: #000066;">.</span><span style="color: #006600;">Color</span> &nbsp; <span style="color: #000066;">:</span><span style="color: #000066;">=</span> clBlack<span style="color: #000066;">;</span><br />
&nbsp; LCanvas<span style="color: #000066;">.</span><span style="color: #006600;">Font</span><span style="color: #000066;">.</span><span style="color: #006600;">Color</span> &nbsp;<span style="color: #000066;">:</span><span style="color: #000066;">=</span> clBlack<span style="color: #000066;">;</span><br />
&nbsp; LCanvas<span style="color: #000066;">.</span><span style="color: #006600;">Font</span><span style="color: #000066;">.</span><span style="color: #006600;">Style</span> &nbsp;<span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">&#91;</span>fsBold<span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; LCanvas<span style="color: #000066;">.</span><span style="color: #006600;">Brush</span><span style="color: #000066;">.</span><span style="color: #006600;">Color</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> acKeyColors<span style="color: #000066;">&#91;</span>State<span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; LCanvas<span style="color: #000066;">.</span><span style="color: #006600;">Rectangle</span><span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #000000; font-weight: bold;">case</span> KeyImage <span style="color: #000000; font-weight: bold;">of</span><br />
&nbsp; &nbsp; kiOverride<span style="color: #000066;">:</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000000; font-weight: bold;">not</span> GetOverrideCaption<span style="color: #000066;">&#40;</span>Parent<span style="color: #000066;">,</span> Key<span style="color: #000066;">,</span> LCaption<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; LCaption <span style="color: #000066;">:</span><span style="color: #000066;">=</span> Caption<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; DrawOneChar<span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">,</span> LCanvas<span style="color: #000066;">,</span> LCaption<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; kiText<span style="color: #000066;">:</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">Length</span><span style="color: #000066;">&#40;</span>Caption<span style="color: #000066;">&#41;</span> &gt; <span style="color: #0000ff;">0</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span>Caption<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">=</span> <span style="color: #ff0000;">'^'</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">or</span> <span style="color: #000066;">&#40;</span>Caption<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">=</span> <span style="color: #ff0000;">'¨'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Caption <span style="color: #000066;">:</span><span style="color: #000066;">=</span> Caption<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; DrawOneChar<span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">,</span> LCanvas<span style="color: #000066;">,</span> Caption<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; kiTab<span style="color: #000066;">:</span> &nbsp; &nbsp; &nbsp; DrawOneChar<span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">,</span> LCanvas<span style="color: #000066;">,</span> <span style="color: #ff0000;">'Tabulation'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; kiShift<span style="color: #000066;">:</span> &nbsp; &nbsp; DrawOneChar<span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">,</span> LCanvas<span style="color: #000066;">,</span> <span style="color: #ff0000;">'Majuscule'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; kiEnter<span style="color: #000066;">:</span> &nbsp; &nbsp; DrawOneChar<span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">,</span> LCanvas<span style="color: #000066;">,</span> <span style="color: #ff0000;">'Entrée'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; kiBackspace<span style="color: #000066;">:</span> DrawOneChar<span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">,</span> LCanvas<span style="color: #000066;">,</span> <span style="color: #ff0000;">'←'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; kiUp<span style="color: #000066;">:</span> &nbsp; &nbsp; &nbsp; &nbsp;DrawOneChar<span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">,</span> LCanvas<span style="color: #000066;">,</span> <span style="color: #ff0000;">'↑'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; kiDown<span style="color: #000066;">:</span> &nbsp; &nbsp; &nbsp;DrawOneChar<span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">,</span> LCanvas<span style="color: #000066;">,</span> <span style="color: #ff0000;">'↓'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; kiLeft<span style="color: #000066;">:</span> &nbsp; &nbsp; &nbsp;DrawOneChar<span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">,</span> LCanvas<span style="color: #000066;">,</span> <span style="color: #ff0000;">'←'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; kiRight<span style="color: #000066;">:</span> &nbsp; &nbsp; DrawOneChar<span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">,</span> LCanvas<span style="color: #000066;">,</span> <span style="color: #ff0000;">'→'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; kiTallEnter<span style="color: #000066;">:</span> DrawOneChar<span style="color: #000066;">&#40;</span>LRect<span style="color: #000066;">,</span> LCanvas<span style="color: #000066;">,</span> <span style="color: #ff0000;">'Entrée'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">procedure</span> TfrmMain<span style="color: #000066;">.</span><span style="color: #006600;">FormCreate</span><span style="color: #000066;">&#40;</span>Sender<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">TObject</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; TouchKeyboard1<span style="color: #000066;">.</span><span style="color: #006600;">DefaultButtonClass</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> TMyKeyboardButton<span style="color: #000066;">;</span><br />
&nbsp; TTempTouchKeyboard<span style="color: #000066;">&#40;</span>TouchKeyboard1<span style="color: #000066;">&#41;</span><span style="color: #000066;">.</span><span style="color: #006600;">CreateKeyboard</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; TouchKeyboard1<span style="color: #000066;">.</span><span style="color: #006600;">Redraw</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">.</span></div></td></tr></tbody></table></div>
<p> <img src='http://blogs.wittwer.fr/whiler/wp-includes/images/smilies/icon_idea.gif' alt=':idea:' class='wp-smiley' />  On remarquera l&#8217;utilisation de chaînes <a href="http://fr.wikipedia.org/wiki/Unicode" rel="glossary" target="_blank" title="Wikipedia, D&eacute;finition de&nbsp;: Unicode" style="" >Unicode</a><sup style="font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA" ><em>W</em></sup>, ← ↑ ↓ ← →, afin de dessiner les touches pour déplacer le curseur et le retour-arrière. Mon fichier source a par conséquent été sauvegardé au format Unicode.</p>
<p>On obtient ainsi ce splendide clavier  <img src='http://blogs.wittwer.fr/whiler/wp-includes/images/smilies/happy.gif' alt=':oD' class='wp-smiley' /><br />
<div id="attachment_781" class="wp-caption aligncenter" style="width: 310px"><a title="Apparence personnalisée du clavier" href="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/keyboard-white.jpg" rel="lightbox[769]"><img src="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/11/keyboard-white-300x114.jpg" alt="Apparence personnalisée du clavier" title="Cliquer pour agrandir" width="300" height="114" class="size-medium wp-image-781" /></a><p class="wp-caption-text">Apparence personnalisée du clavier</p></div></p>
<p>Sur la page suivante, nous allons reprendre ce code pour ajouter un dégradé sur chaque touche&#8230; <img src='http://blogs.wittwer.fr/whiler/wp-includes/images/smilies/glass.gif' alt=':et?:' class='wp-smiley' />  </p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.wittwer.fr/whiler/2009/11/06/delphi-custom-clavier-visuel/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Exemple GeoLite City avec Delphi</title>
		<link>http://blogs.wittwer.fr/whiler/2009/10/19/sample-geolite-city-delphi/</link>
		<comments>http://blogs.wittwer.fr/whiler/2009/10/19/sample-geolite-city-delphi/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 21:30:06 +0000</pubDate>
		<dc:creator>Whiler</dc:creator>
				<category><![CDATA[Delphi]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[2009]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[coloration syntaxique]]></category>
		<category><![CDATA[données]]></category>
		<category><![CDATA[GeoLite]]></category>
		<category><![CDATA[localisation]]></category>
		<category><![CDATA[MaxMind]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://blogs.wittwer.fr/whiler/?p=557</guid>
		<description><![CDATA[MaxMind fournit des bases de données de géolocalisationW, dont GeoLite City, qui est gratuit et permet de localiser géographiquement une adresse IP.
[...]

Une API pour Delphi est disponible, mais celle-ci, au jour d’aujourd’hui, n’a pas encore été portée sous Delphi 2009, la première version Unicode qui introduit des nouveaux types de chaînes de caractères dans ce langage, et engendre une erreur avec l’API telle qu’elle est fournie.

Je suis donc parti de l’API fournie, et j’ai changé quelques types, casté quelques variables, et supprimé ainsi tous les warnings que j’obtenais… ]]></description>
			<content:encoded><![CDATA[<p><a target="_blank" href="http://www.maxmind.com/">MaxMind</a> fournit des bases de données de <a href="http://fr.wikipedia.org/wiki/géolocalisation" rel="glossary" target="_blank" title="Wikipedia, D&eacute;finition de&nbsp;: géolocalisation" style="" >géolocalisation</a><sup style="font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA" ><em>W</em></sup>, dont <a target="_blank" href="http://www.maxmind.com/app/geolitecity">GeoLite City</a>, qui est gratuit et permet de localiser géographiquement une adresse IP.<br />
Cette base de données est actualisée tous les mois.</p>
<p>Une <a target="_blank" href="http://www.maxmind.com/app/pascal">API pour Delphi</a> est disponible, mais celle-ci, au jour d&#8217;aujourd&#8217;hui, n&#8217;a pas encore été portée sous <a href="http://fr.wikipedia.org/wiki/Delphi_(informatique)" rel="glossary" target="_blank" title="Wikipedia, D&eacute;finition de&nbsp;: Delphi 2009" style="" >Delphi 2009</a><sup style="font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA" ><em>W</em></sup>, la première version <a href="http://fr.wikipedia.org/wiki/Unicode" rel="glossary" target="_blank" title="Wikipedia, D&eacute;finition de&nbsp;: Unicode" style="" >Unicode</a><sup style="font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA" ><em>W</em></sup> qui introduit des nouveaux types de chaînes de caractères dans ce langage, et engendre une erreur avec l&#8217;API telle qu&#8217;elle est fournie.</p>
<p>Je suis donc parti de l&#8217;<a href="http://fr.wikipedia.org/wiki/Interface_de_programmation" rel="glossary" target="_blank" title="Wikipedia, D&eacute;finition de&nbsp;: API" style="" >API</a><sup style="font-family: Georgia, Times New Roman, Serif; font-weight: bold; color: #AAAAAA" ><em>W</em></sup> fournie, et j&#8217;ai changé quelques types, casté quelques variables, et supprimé ainsi tous les warnings que j&#8217;obtenais&#8230; je ne suis pas un expert Delphi, loin de là, mais si cela vous interresse de récupérer un code qui compile, voici un exemple qui fonctionne. Vous aurez besoin de la base de géolocalisation, disponible à cette adresse pour pouvoir exécuter cette application : <a title="Télécharger la base" href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz">http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz</a></p>
<p>Je me suis également inspiré de l&#8217;<a target="_blank" href="http://wordpress.org/extend/plugins/visitor-maps/">extension</a> <a target="_blank" href="http://blogs.wittwer.fr/whiler/visitors/">installée</a> sur ce blog pour la localisation sur la planisphère et l&#8217;ajout des régions en toutes lettres&#8230;</p>
<p>Ces noms de régions viennent en plus de l&#8217;API standard&#8230; Les pays et régions sont soit en français, soit en anglais.<br />
<span id="more-557"></span><br />
Le fichier <a title="Enregistrez la cible du lien" href="http://blogs.wittwer.fr/whiler/wp-content/uploads/2009/10/GeoIP.pas">GeoIP.pas</a>, l&#8217;API avec les régions en plus (constantes volontairement tronquées dans l&#8217;affichage du blog) :</p>
<div class="codecolorer-container delphi dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:480px;height:300px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br />94<br />95<br />96<br />97<br />98<br />99<br />100<br />101<br />102<br />103<br />104<br />105<br />106<br />107<br />108<br />109<br />110<br />111<br />112<br />113<br />114<br />115<br />116<br />117<br />118<br />119<br />120<br />121<br />122<br />123<br />124<br />125<br />126<br />127<br />128<br />129<br />130<br />131<br />132<br />133<br />134<br />135<br />136<br />137<br />138<br />139<br />140<br />141<br />142<br />143<br />144<br />145<br />146<br />147<br />148<br />149<br />150<br />151<br />152<br />153<br />154<br />155<br />156<br />157<br />158<br />159<br />160<br />161<br />162<br />163<br />164<br />165<br />166<br />167<br />168<br />169<br />170<br />171<br />172<br />173<br />174<br />175<br />176<br />177<br />178<br />179<br />180<br />181<br />182<br />183<br />184<br />185<br />186<br />187<br />188<br />189<br />190<br />191<br />192<br />193<br />194<br />195<br />196<br />197<br />198<br />199<br />200<br />201<br />202<br />203<br />204<br />205<br />206<br />207<br />208<br />209<br />210<br />211<br />212<br />213<br />214<br />215<br />216<br />217<br />218<br />219<br />220<br />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br />319<br />320<br />321<br />322<br />323<br />324<br />325<br />326<br />327<br />328<br />329<br />330<br />331<br />332<br />333<br />334<br />335<br />336<br />337<br />338<br />339<br />340<br />341<br />342<br />343<br />344<br />345<br />346<br />347<br />348<br />349<br />350<br />351<br />352<br />353<br />354<br />355<br />356<br />357<br />358<br />359<br />360<br />361<br />362<br />363<br />364<br />365<br />366<br />367<br />368<br />369<br />370<br />371<br />372<br />373<br />374<br />375<br />376<br />377<br />378<br />379<br />380<br />381<br />382<br />383<br />384<br />385<br />386<br />387<br />388<br />389<br />390<br />391<br />392<br />393<br />394<br />395<br />396<br />397<br />398<br />399<br />400<br />401<br />402<br />403<br />404<br />405<br />406<br />407<br />408<br />409<br />410<br />411<br />412<br />413<br />414<br />415<br />416<br />417<br />418<br />419<br />420<br />421<br />422<br />423<br />424<br />425<br />426<br />427<br />428<br />429<br />430<br />431<br />432<br />433<br />434<br />435<br />436<br />437<br />438<br />439<br />440<br />441<br />442<br />443<br />444<br />445<br />446<br />447<br />448<br />449<br />450<br />451<br />452<br />453<br />454<br />455<br />456<br />457<br />458<br />459<br />460<br />461<br />462<br />463<br />464<br />465<br />466<br />467<br />468<br />469<br />470<br />471<br />472<br />473<br />474<br />475<br />476<br />477<br />478<br />479<br />480<br />481<br />482<br />483<br />484<br />485<br />486<br />487<br />488<br />489<br />490<br />491<br />492<br />493<br />494<br />495<br />496<br />497<br />498<br />499<br />500<br />501<br />502<br />503<br />504<br />505<br />506<br />507<br />508<br />509<br />510<br />511<br />512<br />513<br />514<br />515<br />516<br />517<br />518<br />519<br />520<br />521<br />522<br />523<br />524<br />525<br />526<br />527<br />528<br />529<br />530<br />531<br />532<br />533<br />534<br />535<br />536<br />537<br />538<br />539<br />540<br />541<br />542<br />543<br />544<br />545<br />546<br />547<br />548<br />549<br />550<br />551<br />552<br />553<br />554<br />555<br />556<br />557<br />558<br />559<br />560<br />561<br />562<br />563<br />564<br />565<br />566<br />567<br />568<br />569<br />570<br />571<br />572<br />573<br />574<br />575<br />576<br />577<br />578<br />579<br />580<br />581<br />582<br />583<br />584<br />585<br />586<br />587<br />588<br />589<br />590<br />591<br />592<br />593<br />594<br /></div></td><td><div class="delphi codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">{<br />
&nbsp;* Copyright (C) 2005 MaxMind LLC &nbsp;All Rights Reserved.<br />
&nbsp;*<br />
&nbsp;* This library is free software; you can redistribute it and/or<br />
&nbsp;* modify it under the terms of the GNU General Public<br />
&nbsp;* License as published by the Free Software Foundation; either<br />
&nbsp;* version 2 of the License, or (at your option) any later version.<br />
&nbsp;*<br />
&nbsp;* This library is distributed in the hope that it will be useful,<br />
&nbsp;* but WITHOUT ANY WARRANTY; without even the implied warranty of<br />
&nbsp;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. &nbsp;See the GNU<br />
&nbsp;* General Public License for more details.<br />
&nbsp;*<br />
&nbsp;* You should have received a copy of the GNU General Public<br />
&nbsp;* License along with this library; if not, write to the Free Software<br />
&nbsp;* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA &nbsp;02111-1307 &nbsp;USA<br />
<br />
&nbsp;* ChangeLog<br />
&nbsp;* 2003-04-09 Translation of C# class to Pascal provided by W. Tracz<br />
&nbsp;* 2005-07-20 Added support for GeoIP Region, City, ISP and Organization (Yvan Schwab/esoftys)<br />
&nbsp;* 2009-10-18 Compatible with Delphi 2009 and above (AnsiString) + regions added<br />
}</span><br />
<br />
<span style="color: #808080; font-style: italic;">{ Thanks to W. Tracz/Yvan Schwab for contributing this class }</span><br />
<br />
<span style="color: #000000; font-weight: bold;">unit</span> GeoIP<span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">interface</span><br />
<br />
<span style="color: #000000; font-weight: bold;">uses</span> Classes<span style="color: #000066;">,</span> SysUtils<span style="color: #000066;">,</span> WinSock<span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">type</span><br />
&nbsp; TGeoIPResult <span style="color: #000066;">=</span> <span style="color: #000066;">&#40;</span><br />
&nbsp; &nbsp; GEOIP_SUCCESS &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_NODATA &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066;">=</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_ERROR_IPADDR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066;">=</span> <span style="color: #0000ff;">2</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_ERROR_DBTYPE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066;">=</span> <span style="color: #0000ff;">3</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_ERROR_IO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066;">=</span> <span style="color: #0000ff;">4</span><br />
&nbsp; <span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; TGeoIPDBTypes <span style="color: #000066;">=</span> <span style="color: #000066;">&#40;</span><br />
&nbsp; &nbsp; GEOIP_COUNTRY_EDITION &nbsp; &nbsp; <span style="color: #000066;">=</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_REGION_EDITION_REV0 <span style="color: #000066;">=</span> <span style="color: #0000ff;">7</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_CITY_EDITION_REV0 &nbsp; <span style="color: #000066;">=</span> <span style="color: #0000ff;">6</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_ORG_EDITION &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">=</span> <span style="color: #0000ff;">5</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_ISP_EDITION &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">=</span> <span style="color: #0000ff;">4</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_CITY_EDITION_REV1 &nbsp; <span style="color: #000066;">=</span> <span style="color: #0000ff;">2</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_REGION_EDITION_REV1 <span style="color: #000066;">=</span> <span style="color: #0000ff;">3</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_PROXY_EDITION &nbsp; &nbsp; &nbsp; <span style="color: #000066;">=</span> <span style="color: #0000ff;">8</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; GEOIP_ASNUM_EDITION &nbsp; &nbsp; &nbsp; <span style="color: #000066;">=</span> <span style="color: #0000ff;">9</span><br />
&nbsp; <span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; TGeoIPCountry <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">record</span><br />
&nbsp; &nbsp; CountryCode<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; CountryName<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; TGeoIPRegion <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">record</span><br />
&nbsp; &nbsp; CountryCode<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; Region<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; TGeoIPCity <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">record</span><br />
&nbsp; &nbsp; CountryCode<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; CountryName<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; Region<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; City<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; PostalCode<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; Latitude<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Double</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; Longitude<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Double</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; DmaCode<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; AreaCode<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; TGeoIPOrg <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">record</span><br />
&nbsp; &nbsp; Name<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; TGeoIP <span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">class</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">private</span><br />
&nbsp; &nbsp; FInputFile<span style="color: #000066;">:</span> TFileStream<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; FDatabaseType<span style="color: #000066;">:</span> TGeoIPDBTypes<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; FDatabaseSegments<span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">array</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; FDatabaseInfo<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; FRecordLength<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; slRegions <span style="color: #000066;">:</span> TStringList<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> &nbsp;_GetCity<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPCity<span style="color: #000066;">:</span> TGeoIPCity<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> &nbsp;_GetCountry<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPCountry<span style="color: #000066;">:</span> TGeoIPCountry<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> &nbsp;_GetOrg<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPOrg<span style="color: #000066;">:</span> TGeoIPOrg<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> &nbsp;_GetRegion<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPRegion<span style="color: #000066;">:</span> TGeoIPRegion<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> &nbsp;AddrToNum<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> IPAddr<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">procedure</span> InitDBFile<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> &nbsp;SeekRecord<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">procedure</span> InitRegions<span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">public</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">constructor</span> Create<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> FileName<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">destructor</span> Destroy<span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">override</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> GetCity<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> IPAddr<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPCity<span style="color: #000066;">:</span> TGeoIPCity<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> GetCountry<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> IPAddr<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPCountry<span style="color: #000066;">:</span> TGeoIPCountry<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> GetDatabaseInfo<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> GetOrg<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> IPAddr<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPOrg<span style="color: #000066;">:</span> TGeoIPOrg<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">function</span> GetRegion<span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> IPAddr<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPRegion<span style="color: #000066;">:</span> TGeoIPRegion<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">const</span><br />
&nbsp; CountryCodes<span style="color: #000066;">:</span><span style="color: #000000; font-weight: bold;">array</span> <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">..</span><span style="color: #0000ff;">252</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">ansistring</span> <span style="color: #000066;">=</span> <span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'--'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AP'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'EU'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AD'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AF'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AI'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AL'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AQ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AS'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AT'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AU'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AW'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AZ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BB'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BD'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BF'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BH'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BI'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BJ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BS'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BT'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BV'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BW'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BY'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BZ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CC'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CD'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CF'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CH'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CI'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CK'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CL'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CU'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CV'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CX'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CY'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'CZ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'DE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'DJ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'DK'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'DM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'DO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'DZ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'EC'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'EE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'EG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'EH'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'ER'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'ES'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'ET'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'FI'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'FJ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'FK'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'FM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'FO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'FR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'FX'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GB'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GD'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GF'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GH'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GI'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GL'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GP'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GQ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GS'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GT'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GU'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GW'</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'GY'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'HK'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'HM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'HN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'HR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'HT'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'HU'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'ID'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'IE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'IL'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'IN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'IO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'IQ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'IR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'IS'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'IT'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'JM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'JO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'JP'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'KE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'KG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'KH'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'KI'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'KM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'KN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'KP'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'KR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'KW'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'KY'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'KZ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'LA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'LB'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'LC'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'LI'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'LK'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'LR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'LS'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'LT'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'LU'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'LV'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'LY'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MC'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MD'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MH'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MK'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'ML'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MP'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MQ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MS'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MT'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MU'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MV'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MW'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MX'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MY'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MZ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NC'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NF'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NI'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NL'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NP'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NU'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'NZ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'OM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PF'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PH'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PK'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PL'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PS'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PT'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PW'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'PY'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'QA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'RE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'RO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'RU'</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'RW'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SB'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SC'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SD'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SH'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SI'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SJ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SK'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SL'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'ST'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SV'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SY'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'SZ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TC'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TD'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TF'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TH'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TJ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TK'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TO'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TL'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TR'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TT'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TV'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TW'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'TZ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'UA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'UG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'UM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'US'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'UY'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'UZ'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'VA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'VC'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'VE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'VG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'VI'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'VN'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'VU'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'WF'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'WS'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'YE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'YT'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'RS'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'ZA'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'ZM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'ME'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'ZW'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'A1'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'A2'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'O1'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'AX'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'GG'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'IM'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'JE'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'BL'</span><span style="color: #000066;">,</span><span style="color: #ff0000;">'MF'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; CountryNames<span style="color: #000066;">:</span><span style="color: #000000; font-weight: bold;">array</span> <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">..</span><span style="color: #0000ff;">252</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">ansistring</span> <span style="color: #000066;">=</span> <span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'ND'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'Région Asie / Pacifique'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'Europe'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'Andorre'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'Émirats Arabes Unis'</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'Afghanistan'</span><span style="color: #000066;">,</span> <br />
<span style="color: #000066;">&#91;</span><span style="color: #000066;">...</span><span style="color: #000066;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">,</span> <span style="color: #ff0000;">'Saint-Barthélemy'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'Saint Martin'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; RegionNames<span style="color: #000066;">:</span><span style="color: #000000; font-weight: bold;">array</span> <span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">..</span><span style="color: #0000ff;">4209</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">ansistring</span> <span style="color: #000066;">=</span> <span style="color: #000066;">&#40;</span><span style="color: #ff0000;">'AD02=Canillo'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'AD03=Encamp'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'AD04=La Massana'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'AD05=Ordino'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'AD06=Sant Julia de Loria'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'AD07=Andorra la Vella'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'AD08=Escaldes-Engordany'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'AE01=Abu Dhabi'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'AE02=Ajman'</span><span style="color: #000066;">,</span> <span style="color: #ff0000;">'AE03=Dubai'</span><span style="color: #000066;">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">&#91;</span><span style="color: #000066;">...</span><span style="color: #000066;">&#93;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'ZW10=Harare'</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">implementation</span><br />
<br />
<span style="color: #000000; font-weight: bold;">const</span><br />
&nbsp; COUNTRY_BEGIN <span style="color: #000066;">=</span> <span style="color: #0000ff;">16776960</span><span style="color: #000066;">;</span><br />
&nbsp; STATE_BEGIN_REV0 <span style="color: #000066;">=</span> <span style="color: #0000ff;">16700000</span><span style="color: #000066;">;</span><br />
&nbsp; STATE_BEGIN_REV1 &nbsp;<span style="color: #000066;">=</span> <span style="color: #0000ff;">16000000</span><span style="color: #000066;">;</span><br />
&nbsp; STRUCTURE_INFO_MAX_SIZE <span style="color: #000066;">=</span> <span style="color: #0000ff;">20</span><span style="color: #000066;">;</span><br />
&nbsp; DATABASE_INFO_MAX_SIZE <span style="color: #000066;">=</span> <span style="color: #0000ff;">100</span><span style="color: #000066;">;</span><br />
&nbsp; SEGMENT_RECORD_LENGTH <span style="color: #000066;">=</span> <span style="color: #0000ff;">3</span><span style="color: #000066;">;</span><br />
&nbsp; STANDARD_RECORD_LENGTH <span style="color: #000066;">=</span> <span style="color: #0000ff;">3</span><span style="color: #000066;">;</span><br />
&nbsp; ORG_RECORD_LENGTH <span style="color: #000066;">=</span> <span style="color: #0000ff;">4</span><span style="color: #000066;">;</span><br />
&nbsp; MAX_RECORD_LENGTH <span style="color: #000066;">=</span> <span style="color: #0000ff;">4</span><span style="color: #000066;">;</span><br />
&nbsp; MAX_ORG_RECORD_LENGTH <span style="color: #000066;">=</span> <span style="color: #0000ff;">300</span><span style="color: #000066;">;</span><br />
&nbsp; FULL_RECORD_LENGTH <span style="color: #000066;">=</span> <span style="color: #0000ff;">50</span><span style="color: #000066;">;</span><br />
&nbsp; US_OFFSET <span style="color: #000066;">=</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">;</span><br />
&nbsp; CANADA_OFFSET <span style="color: #000066;">=</span> <span style="color: #0000ff;">677</span><span style="color: #000066;">;</span><br />
&nbsp; WORLD_OFFSET <span style="color: #000066;">=</span> <span style="color: #0000ff;">1353</span><span style="color: #000066;">;</span><br />
&nbsp; FIPS_RANGE <span style="color: #000066;">=</span> <span style="color: #0000ff;">360</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #808080; font-style: italic;">{ TGeoIP }</span><br />
<br />
<span style="color: #000000; font-weight: bold;">constructor</span> TGeoIP<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> FileName<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">inherited</span> Create<span style="color: #000066;">;</span><br />
&nbsp; FInputFile <span style="color: #000066;">:</span><span style="color: #000066;">=</span> TFileStream<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">&#40;</span>FileName<span style="color: #000066;">,</span> fmOpenRead <span style="color: #000000; font-weight: bold;">or</span> fmShareDenyNone<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; InitDBFile<span style="color: #000066;">;</span><br />
&nbsp; InitRegions<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">destructor</span> TGeoIP<span style="color: #000066;">.</span><span style="color: #006600;">Destroy</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">Assigned</span><span style="color: #000066;">&#40;</span>FInputFile<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #006600;">Free</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">Assigned</span><span style="color: #000066;">&#40;</span>slRegions<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; slRegions<span style="color: #000066;">.</span><span style="color: #006600;">Free</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">inherited</span> Destroy<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TGeoIP<span style="color: #000066;">.</span>_GetCity<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPCity<span style="color: #000066;">:</span> TGeoIPCity<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;SeekCity<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;RecordPointer<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;<span style="color: #000066;">StrLen</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;buf<span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">array</span><span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">..</span><span style="color: #006600;">FULL_RECORD_LENGTH</span><span style="color: #000066;">-</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">Byte</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;p<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">PAnsiChar</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;i<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;DmaAreaCombo<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>FDatabaseType &lt;&gt; GEOIP_CITY_EDITION_REV0<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>FDatabaseType &lt;&gt; GEOIP_CITY_EDITION_REV1<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_ERROR_DBTYPE<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; SeekCity <span style="color: #000066;">:</span><span style="color: #000066;">=</span> SeekRecord<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> SeekCity <span style="color: #000066;">=</span> FDatabaseSegments<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_NODATA<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; RecordPointer <span style="color: #000066;">:</span><span style="color: #000066;">=</span> SeekCity <span style="color: #000066;">+</span> <span style="color: #000066;">&#40;</span><span style="color: #0000ff;">2</span> <span style="color: #000066;">*</span> FRecordLength <span style="color: #000066;">-</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">*</span> FDatabaseSegments<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Seek</span><span style="color: #000066;">&#40;</span>RecordPointer<span style="color: #000066;">,</span> soFromBeginning<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Read</span><span style="color: #000066;">&#40;</span>buf<span style="color: #000066;">,</span> FULL_RECORD_LENGTH<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #808080; font-style: italic;">// get country</span><br />
&nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">CountryCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> CountryCodes<span style="color: #000066;">&#91;</span>buf<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">CountryName</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> CountryNames<span style="color: #000066;">&#91;</span>buf<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #808080; font-style: italic;">// get region</span><br />
&nbsp; p <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">@</span>buf<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000066;">StrLen</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #000066;">&#40;</span>p<span style="color: #000066;">&#91;</span><span style="color: #000066;">StrLen</span><span style="color: #000066;">&#93;</span> &lt;&gt; <span style="color: #ff0000;">#0</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Inc</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">StrLen</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Region</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">Copy</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">,</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">,</span> <span style="color: #000066;">StrLen</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #808080; font-style: italic;">// Region label</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span>GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Region</span> &lt;&gt; <span style="color: #ff0000;">''</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>slRegions<span style="color: #000066;">.</span><span style="color: #006600;">IndexOfName</span><span style="color: #000066;">&#40;</span><span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">&#40;</span>GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">CountryCode</span> <span style="color: #000066;">+</span> GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Region</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span> &lt;&gt; <span style="color: #000066;">-</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Region</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066; font-weight: bold;">AnsiString</span><span style="color: #000066;">&#40;</span>slRegions<span style="color: #000066;">.</span><span style="color: #006600;">Values</span><span style="color: #000066;">&#91;</span><span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">&#40;</span>GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">CountryCode</span> <span style="color: #000066;">+</span> GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Region</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #808080; font-style: italic;">// get city</span><br />
&nbsp; <span style="color: #000066;">Inc</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">,</span> <span style="color: #000066;">StrLen</span> <span style="color: #000066;">+</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000066;">StrLen</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #000066;">&#40;</span>p<span style="color: #000066;">&#91;</span><span style="color: #000066;">StrLen</span><span style="color: #000066;">&#93;</span> &lt;&gt; <span style="color: #ff0000;">#0</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Inc</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">StrLen</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">City</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">Copy</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">,</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">,</span> <span style="color: #000066;">StrLen</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #808080; font-style: italic;">// get postal code</span><br />
&nbsp; <span style="color: #000066;">Inc</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">,</span> <span style="color: #000066;">StrLen</span> <span style="color: #000066;">+</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000066;">StrLen</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #000066;">&#40;</span>p<span style="color: #000066;">&#91;</span><span style="color: #000066;">StrLen</span><span style="color: #000066;">&#93;</span> &lt;&gt; <span style="color: #ff0000;">#0</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Inc</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">StrLen</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">PostalCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">Copy</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">,</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">,</span> <span style="color: #000066;">StrLen</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #808080; font-style: italic;">// get latitude</span><br />
&nbsp; <span style="color: #000066;">Inc</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">,</span> <span style="color: #000066;">StrLen</span> <span style="color: #000066;">+</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Latitude</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0.0</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">to</span> <span style="color: #0000ff;">2</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Latitude</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Latitude</span> <span style="color: #000066;">+</span> <span style="color: #000066;">&#40;</span><span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">shl</span> <span style="color: #000066;">&#40;</span>i<span style="color: #000066;">*</span><span style="color: #0000ff;">8</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Latitude</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Latitude</span><span style="color: #000066;">/</span><span style="color: #0000ff;">10000</span> <span style="color: #000066;">-</span> <span style="color: #0000ff;">180</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #808080; font-style: italic;">// get longitude</span><br />
&nbsp; <span style="color: #000066;">Inc</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">,</span> <span style="color: #0000ff;">3</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Longitude</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0.0</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">to</span> <span style="color: #0000ff;">2</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Longitude</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Longitude</span> <span style="color: #000066;">+</span> <span style="color: #000066;">&#40;</span><span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">shl</span> <span style="color: #000066;">&#40;</span>i<span style="color: #000066;">*</span><span style="color: #0000ff;">8</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Longitude</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">Longitude</span><span style="color: #000066;">/</span><span style="color: #0000ff;">10000</span> <span style="color: #000066;">-</span> <span style="color: #0000ff;">180</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #808080; font-style: italic;">// get area code and dma code for post April 2002 databases and for US locations</span><br />
&nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">DmaCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
&nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">AreaCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> FDatabaseType <span style="color: #000066;">=</span> GEOIP_CITY_EDITION_REV1 <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">CountryCode</span> <span style="color: #000066;">=</span> <span style="color: #ff0000;">'US'</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">Inc</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">,</span> <span style="color: #0000ff;">3</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; DmaAreaCombo <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">to</span> <span style="color: #0000ff;">2</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; DmaAreaCombo <span style="color: #000066;">:</span><span style="color: #000066;">=</span> DmaAreaCombo <span style="color: #000066;">+</span> <span style="color: #000066;">&#40;</span><span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">shl</span> <span style="color: #000066;">&#40;</span>i<span style="color: #000066;">*</span><span style="color: #0000ff;">8</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">DmaCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> DmaAreaCombo <span style="color: #000000; font-weight: bold;">div</span> <span style="color: #0000ff;">1000</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; GeoIPCity<span style="color: #000066;">.</span><span style="color: #006600;">AreaCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> DmaAreaCombo <span style="color: #000000; font-weight: bold;">mod</span> <span style="color: #0000ff;">1000</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_SUCCESS<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TGeoIP<span style="color: #000066;">.</span>_GetCountry<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPCountry<span style="color: #000066;">:</span> TGeoIPCountry<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;ret<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>FDatabaseType &lt;&gt; GEOIP_COUNTRY_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>FDatabaseType &lt;&gt; GEOIP_PROXY_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_ERROR_DBTYPE<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; ret <span style="color: #000066;">:</span><span style="color: #000066;">=</span> SeekRecord<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">&#41;</span> <span style="color: #000066;">-</span> COUNTRY_BEGIN<span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> ret &gt; <span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; GeoIPCountry<span style="color: #000066;">.</span><span style="color: #006600;">CountryCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> CountryCodes<span style="color: #000066;">&#91;</span>ret<span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; GeoIPCountry<span style="color: #000066;">.</span><span style="color: #006600;">CountryName</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> CountryNames<span style="color: #000066;">&#91;</span>ret<span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_SUCCESS<span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_NODATA<span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TGeoIP<span style="color: #000066;">.</span>_GetOrg<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPOrg<span style="color: #000066;">:</span> TGeoIPOrg<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;SeekOrg<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;RecordPointer<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;<span style="color: #000066;">StrLen</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;buf<span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">array</span><span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">..</span><span style="color: #006600;">MAX_ORG_RECORD_LENGTH</span><span style="color: #000066;">-</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">Byte</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;p<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">PAnsiChar</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>FDatabaseType &lt;&gt; GEOIP_ORG_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>FDatabaseType &lt;&gt; GEOIP_ISP_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>FDatabaseType &lt;&gt; GEOIP_ASNUM_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_ERROR_DBTYPE<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; SeekOrg <span style="color: #000066;">:</span><span style="color: #000066;">=</span> SeekRecord<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> SeekOrg <span style="color: #000066;">=</span> FDatabaseSegments<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_NODATA<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; RecordPointer <span style="color: #000066;">:</span><span style="color: #000066;">=</span> SeekOrg <span style="color: #000066;">+</span> <span style="color: #000066;">&#40;</span><span style="color: #0000ff;">2</span> <span style="color: #000066;">*</span> FRecordLength <span style="color: #000066;">-</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">*</span> FDatabaseSegments<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Seek</span><span style="color: #000066;">&#40;</span>RecordPointer<span style="color: #000066;">,</span> soFromBeginning<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Read</span><span style="color: #000066;">&#40;</span>buf<span style="color: #000066;">,</span> FULL_RECORD_LENGTH<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; p <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">@</span>buf<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000066;">StrLen</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #000066;">&#40;</span>p<span style="color: #000066;">&#91;</span><span style="color: #000066;">StrLen</span><span style="color: #000066;">&#93;</span> &lt;&gt; <span style="color: #ff0000;">#0</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Inc</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">StrLen</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; GeoIPOrg<span style="color: #000066;">.</span><span style="color: #006600;">Name</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">Copy</span><span style="color: #000066;">&#40;</span>p<span style="color: #000066;">,</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">,</span> <span style="color: #000066;">StrLen</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_SUCCESS<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TGeoIP<span style="color: #000066;">.</span>_GetRegion<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPRegion<span style="color: #000066;">:</span> TGeoIPRegion<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;SeekRegion<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>FDatabaseType &lt;&gt; GEOIP_REGION_EDITION_REV0<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>FDatabaseType &lt;&gt; GEOIP_REGION_EDITION_REV1<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_ERROR_DBTYPE<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; SeekRegion <span style="color: #000066;">:</span><span style="color: #000066;">=</span> SeekRecord<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> FDatabaseType <span style="color: #000066;">=</span> GEOIP_REGION_EDITION_REV0 <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Region Edition, pre June 2003</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Dec</span><span style="color: #000066;">&#40;</span>SeekRegion<span style="color: #000066;">,</span> STATE_BEGIN_REV0<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> SeekRegion &gt;<span style="color: #000066;">=</span> <span style="color: #0000ff;">1000</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">CountryCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">'US'</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">Region</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066; font-weight: bold;">AnsiString</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">Chr</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span>SeekRegion <span style="color: #000066;">-</span> <span style="color: #0000ff;">1000</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">div</span> <span style="color: #0000ff;">26</span> <span style="color: #000066;">+</span> <span style="color: #0000ff;">65</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span> <span style="color: #000066;">Chr</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span>SeekRegion <span style="color: #000066;">-</span> <span style="color: #0000ff;">1000</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">mod</span> <span style="color: #0000ff;">26</span> <span style="color: #000066;">+</span> <span style="color: #0000ff;">65</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">CountryCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> CountryCodes<span style="color: #000066;">&#91;</span>SeekRegion<span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">Region</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> FDatabaseType <span style="color: #000066;">=</span> GEOIP_REGION_EDITION_REV1 <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Region Edition, post June 2003</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Dec</span><span style="color: #000066;">&#40;</span>SeekRegion<span style="color: #000066;">,</span> STATE_BEGIN_REV1<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> SeekRegion &lt; US_OFFSET <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Unknown</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">CountryCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">Region</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> SeekRegion &lt; CANADA_OFFSET <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// USA State</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">CountryCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">'US'</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">Region</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066; font-weight: bold;">AnsiString</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">Chr</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span>SeekRegion <span style="color: #000066;">-</span> US_OFFSET<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">div</span> <span style="color: #0000ff;">26</span> <span style="color: #000066;">+</span> <span style="color: #0000ff;">65</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span> <span style="color: #000066;">Chr</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span>SeekRegion <span style="color: #000066;">-</span> US_OFFSET<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">mod</span> <span style="color: #0000ff;">26</span> <span style="color: #000066;">+</span> <span style="color: #0000ff;">65</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> SeekRegion &lt; WORLD_OFFSET <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Canada Province</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">CountryCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">'CA'</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">Region</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066; font-weight: bold;">AnsiString</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">Chr</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span>SeekRegion <span style="color: #000066;">-</span> CANADA_OFFSET<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">div</span> <span style="color: #0000ff;">26</span> <span style="color: #000066;">+</span> <span style="color: #0000ff;">65</span><span style="color: #000066;">&#41;</span> <span style="color: #000066;">+</span> <span style="color: #000066;">Chr</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">&#40;</span>SeekRegion <span style="color: #000066;">-</span> CANADA_OFFSET<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">mod</span> <span style="color: #0000ff;">26</span> <span style="color: #000066;">+</span> <span style="color: #0000ff;">65</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Not US or Canada</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">CountryCode</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> CountryCodes<span style="color: #000066;">&#91;</span><span style="color: #000066;">&#40;</span>SeekRegion <span style="color: #000066;">-</span> WORLD_OFFSET<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">div</span> FIPS_RANGE<span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; GeoIPRegion<span style="color: #000066;">.</span><span style="color: #006600;">Region</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_SUCCESS<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TGeoIP<span style="color: #000066;">.</span><span style="color: #006600;">AddrToNum</span><span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> IPAddr<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;netlong<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;temp<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">PAnsiChar</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
temp <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066; font-weight: bold;">PAnsiChar</span><span style="color: #000066;">&#40;</span>IPAddr<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; netlong <span style="color: #000066;">:</span><span style="color: #000066;">=</span> inet_addr<span style="color: #000066;">&#40;</span>temp<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> netlong &lt;&gt; INADDR_NONE <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> ntohl<span style="color: #000066;">&#40;</span>netlong<span style="color: #000066;">&#41;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TGeoIP<span style="color: #000066;">.</span><span style="color: #006600;">GetCity</span><span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> IPAddr<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPCity<span style="color: #000066;">:</span> TGeoIPCity<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; IPNum <span style="color: #000066;">:</span><span style="color: #000066;">=</span> AddrToNum<span style="color: #000066;">&#40;</span>IPAddr<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> IPNum <span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_ERROR_IPADDR<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> _GetCity<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">,</span> GeoIPCity<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TGeoIP<span style="color: #000066;">.</span><span style="color: #006600;">GetCountry</span><span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> IPAddr<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPCountry<span style="color: #000066;">:</span> TGeoIPCountry<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; IPNum <span style="color: #000066;">:</span><span style="color: #000066;">=</span> AddrToNum<span style="color: #000066;">&#40;</span>IPAddr<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> IPNum <span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_ERROR_IPADDR<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> _GetCountry<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">,</span> GeoIPCountry<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TGeoIP<span style="color: #000066;">.</span><span style="color: #006600;">GetDatabaseInfo</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;i<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;delim<span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">array</span><span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">..</span><span style="color: #0000ff;">2</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">Byte</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;HasStructureInfo<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Boolean</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; FDatabaseInfo <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #ff0000;">''</span><span style="color: #000066;">;</span><br />
&nbsp; HasStructureInfo <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">False</span><span style="color: #000066;">;</span><br />
&nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Seek</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">-</span><span style="color: #0000ff;">3</span><span style="color: #000066;">,</span> soFromEnd<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">to</span> STRUCTURE_INFO_MAX_SIZE<span style="color: #000066;">-</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Read</span><span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">,</span> <span style="color: #0000ff;">3</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">=</span> <span style="color: #0000ff;">255</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">=</span> <span style="color: #0000ff;">255</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">2</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">=</span> <span style="color: #0000ff;">255</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; HasStructureInfo <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000000; font-weight: bold;">True</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">Break</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Seek</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">-</span><span style="color: #0000ff;">4</span><span style="color: #000066;">,</span> soFromCurrent<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> HasStructureInfo <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Seek</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">-</span><span style="color: #0000ff;">3</span><span style="color: #000066;">,</span> soFromCurrent<span style="color: #000066;">&#41;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// no structure info, must be pre Sep 2002 database, go back to end</span><br />
&nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Seek</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">-</span><span style="color: #0000ff;">3</span><span style="color: #000066;">,</span> soFromEnd<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">to</span> DATABASE_INFO_MAX_SIZE<span style="color: #000066;">-</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Read</span><span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">,</span> <span style="color: #0000ff;">3</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">2</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">SetLength</span><span style="color: #000066;">&#40;</span>FDatabaseInfo<span style="color: #000066;">,</span> i<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Read</span><span style="color: #000066;">&#40;</span><span style="color: #000066; font-weight: bold;">PChar</span><span style="color: #000066;">&#40;</span>FDatabaseInfo<span style="color: #000066;">&#41;</span><span style="color: #000066;">^</span><span style="color: #000066;">,</span> i<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">Break</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Seek</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">-</span><span style="color: #0000ff;">4</span><span style="color: #000066;">,</span> soFromCurrent<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> FDatabaseInfo<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TGeoIP<span style="color: #000066;">.</span><span style="color: #006600;">GetOrg</span><span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> IPAddr<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPOrg<span style="color: #000066;">:</span> TGeoIPOrg<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; IPNum <span style="color: #000066;">:</span><span style="color: #000066;">=</span> AddrToNum<span style="color: #000066;">&#40;</span>IPAddr<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> IPNum <span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_ERROR_IPADDR<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> _GetOrg<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">,</span> GeoIPOrg<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TGeoIP<span style="color: #000066;">.</span><span style="color: #006600;">GetRegion</span><span style="color: #000066;">&#40;</span><span style="color: #000000; font-weight: bold;">const</span> IPAddr<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">ansistring</span><span style="color: #000066;">;</span> <span style="color: #000000; font-weight: bold;">var</span> GeoIPRegion<span style="color: #000066;">:</span> TGeoIPRegion<span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> TGeoIPResult<span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; IPNum <span style="color: #000066;">:</span><span style="color: #000066;">=</span> AddrToNum<span style="color: #000066;">&#40;</span>IPAddr<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> IPNum <span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_ERROR_IPADDR<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> _GetRegion<span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">,</span> GeoIPRegion<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">procedure</span> TGeoIP<span style="color: #000066;">.</span><span style="color: #006600;">InitDBFile</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;i<span style="color: #000066;">,</span>j<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;delim<span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">array</span><span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">..</span><span style="color: #0000ff;">2</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">Byte</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;buf<span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">array</span><span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">..</span><span style="color: #006600;">SEGMENT_RECORD_LENGTH</span><span style="color: #000066;">-</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">Byte</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; <span style="color: #808080; font-style: italic;">// default to GeoIP Country Edition</span><br />
&nbsp; FDatabaseType <span style="color: #000066;">:</span><span style="color: #000066;">=</span> GEOIP_COUNTRY_EDITION<span style="color: #000066;">;</span><br />
&nbsp; FRecordLength <span style="color: #000066;">:</span><span style="color: #000066;">=</span> STANDARD_RECORD_LENGTH<span style="color: #000066;">;</span><br />
&nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Seek</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">-</span><span style="color: #0000ff;">3</span><span style="color: #000066;">,</span> soFromEnd<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">to</span> STRUCTURE_INFO_MAX_SIZE<span style="color: #000066;">-</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Read</span><span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">,</span> <span style="color: #0000ff;">3</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">=</span> <span style="color: #0000ff;">255</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">=</span> <span style="color: #0000ff;">255</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span>delim<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">2</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">=</span> <span style="color: #0000ff;">255</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Read</span><span style="color: #000066;">&#40;</span>FDatabaseType<span style="color: #000066;">,</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066; font-weight: bold;">Byte</span><span style="color: #000066;">&#40;</span>FDatabaseType<span style="color: #000066;">&#41;</span> &gt;<span style="color: #000066;">=</span> <span style="color: #0000ff;">106</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Backward compatibility with databases from April 2003 and earlier</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">Dec</span><span style="color: #000066;">&#40;</span>FDatabaseType<span style="color: #000066;">,</span> <span style="color: #0000ff;">105</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> FDatabaseType <span style="color: #000066;">=</span> GEOIP_REGION_EDITION_REV0 <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Region Edition, pre June 2003</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">SetLength</span><span style="color: #000066;">&#40;</span>FDatabaseSegments<span style="color: #000066;">,</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; FDatabaseSegments<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> STATE_BEGIN_REV0<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> FDatabaseType <span style="color: #000066;">=</span> GEOIP_REGION_EDITION_REV1 <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// Region Edition, post June 2003</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">SetLength</span><span style="color: #000066;">&#40;</span>FDatabaseSegments<span style="color: #000066;">,</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; FDatabaseSegments<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> STATE_BEGIN_REV1<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span> <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>FDatabaseType <span style="color: #000066;">=</span> GEOIP_CITY_EDITION_REV0<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">or</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">&#40;</span>FDatabaseType <span style="color: #000066;">=</span> GEOIP_CITY_EDITION_REV1<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">or</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">&#40;</span>FDatabaseType <span style="color: #000066;">=</span> GEOIP_ORG_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">or</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">&#40;</span>FDatabaseType <span style="color: #000066;">=</span> GEOIP_ISP_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">or</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">&#40;</span>FDatabaseType <span style="color: #000066;">=</span> GEOIP_ASNUM_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #808080; font-style: italic;">// City/Org Editions have two segments, read offset of second segment</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">SetLength</span><span style="color: #000066;">&#40;</span>FDatabaseSegments<span style="color: #000066;">,</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; FDatabaseSegments<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Read</span><span style="color: #000066;">&#40;</span>buf<span style="color: #000066;">,</span> SEGMENT_RECORD_LENGTH<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">for</span> j<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">to</span> SEGMENT_RECORD_LENGTH<span style="color: #000066;">-</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">Inc</span><span style="color: #000066;">&#40;</span>FDatabaseSegments<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">,</span> <span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">&#40;</span>buf<span style="color: #000066;">&#91;</span>j<span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">shl</span> <span style="color: #000066;">&#40;</span>j<span style="color: #000066;">*</span><span style="color: #0000ff;">8</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>FDatabaseType <span style="color: #000066;">=</span> GEOIP_ORG_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">or</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #000066;">&#40;</span>FDatabaseType <span style="color: #000066;">=</span> GEOIP_ISP_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;FRecordLength <span style="color: #000066;">:</span><span style="color: #000066;">=</span> ORG_RECORD_LENGTH<span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000066;">Break</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Seek</span><span style="color: #000066;">&#40;</span><span style="color: #000066;">-</span><span style="color: #0000ff;">4</span><span style="color: #000066;">,</span> soFromCurrent<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>FDatabaseType <span style="color: #000066;">=</span> GEOIP_COUNTRY_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">or</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #000066;">&#40;</span>FDatabaseType <span style="color: #000066;">=</span> GEOIP_PROXY_EDITION<span style="color: #000066;">&#41;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; <span style="color: #000066;">SetLength</span><span style="color: #000066;">&#40;</span>FDatabaseSegments<span style="color: #000066;">,</span> <span style="color: #0000ff;">1</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; FDatabaseSegments<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> COUNTRY_BEGIN<span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">procedure</span> TGeoIP<span style="color: #000066;">.</span><span style="color: #006600;">InitRegions</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; f<span style="color: #000066;">,</span>t<span style="color: #000066;">,</span>loop<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Integer</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; slRegions <span style="color: #000066;">:</span><span style="color: #000066;">=</span> TStringList<span style="color: #000066;">.</span><span style="color: #006600;">Create</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; f <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">Low</span><span style="color: #000066;">&#40;</span>RegionNames<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; t <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #000066;">High</span><span style="color: #000066;">&#40;</span>RegionNames<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
<br />
&nbsp; <span style="color: #000000; font-weight: bold;">for</span> loop <span style="color: #000066;">:</span><span style="color: #000066;">=</span> f <span style="color: #000000; font-weight: bold;">to</span> t <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; slRegions<span style="color: #000066;">.</span><span style="color: #006600;">Add</span><span style="color: #000066;">&#40;</span><span style="color: #000066; font-weight: bold;">string</span><span style="color: #000066;">&#40;</span>RegionNames<span style="color: #000066;">&#91;</span>loop<span style="color: #000066;">&#93;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> TGeoIP<span style="color: #000066;">.</span><span style="color: #006600;">SeekRecord</span><span style="color: #000066;">&#40;</span>IPNum<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">var</span><br />
&nbsp; &nbsp;depth<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;offset<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;i<span style="color: #000066;">,</span>j<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;x<span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">array</span><span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">..</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;y<span style="color: #000066;">:</span> <span style="color: #000066; font-weight: bold;">Cardinal</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp;buf<span style="color: #000066;">:</span> <span style="color: #000000; font-weight: bold;">array</span><span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">..</span><span style="color: #0000ff;">2</span><span style="color: #000066;">*</span>MAX_RECORD_LENGTH<span style="color: #000066;">-</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">of</span> <span style="color: #000066; font-weight: bold;">Byte</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; offset <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">for</span> depth<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">31</span> <span style="color: #000000; font-weight: bold;">downto</span> <span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Seek</span><span style="color: #000066;">&#40;</span><span style="color: #0000ff;">2</span> <span style="color: #000066;">*</span> FRecordLength <span style="color: #000066;">*</span> offset<span style="color: #000066;">,</span> soFromBeginning<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; FInputFile<span style="color: #000066;">.</span><span style="color: #000066;">Read</span><span style="color: #000066;">&#40;</span>buf<span style="color: #000066;">,</span> <span style="color: #0000ff;">2</span> <span style="color: #000066;">*</span> FRecordLength<span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">for</span> i<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">to</span> <span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; x<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">for</span> j<span style="color: #000066;">:</span><span style="color: #000066;">=</span><span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">to</span> FRecordLength<span style="color: #000066;">-</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; y <span style="color: #000066;">:</span><span style="color: #000066;">=</span> buf<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">*</span>FRecordLength<span style="color: #000066;">+</span>j<span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; x<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span> <span style="color: #000066;">:</span><span style="color: #000066;">=</span> x<span style="color: #000066;">&#91;</span>i<span style="color: #000066;">&#93;</span> <span style="color: #000066;">+</span> <span style="color: #000066;">&#40;</span>y <span style="color: #000000; font-weight: bold;">shl</span> <span style="color: #000066;">&#40;</span>j<span style="color: #000066;">*</span><span style="color: #0000ff;">8</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #000066;">&#40;</span>IPNum <span style="color: #000000; font-weight: bold;">and</span> <span style="color: #000066;">&#40;</span><span style="color: #0000ff;">1</span> <span style="color: #000000; font-weight: bold;">shl</span> depth<span style="color: #000066;">&#41;</span><span style="color: #000066;">&#41;</span> &lt;&gt; <span style="color: #0000ff;">0</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> x<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span> &gt;<span style="color: #000066;">=</span> FDatabaseSegments<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> x<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Offset <span style="color: #000066;">:</span><span style="color: #000066;">=</span> x<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">1</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">if</span> x<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> &gt;<span style="color: #000066;">=</span> FDatabaseSegments<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span> <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> x<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000066;">Exit</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">else</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">begin</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; Offset <span style="color: #000066;">:</span><span style="color: #000066;">=</span> x<span style="color: #000066;">&#91;</span><span style="color: #0000ff;">0</span><span style="color: #000066;">&#93;</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
&nbsp; Result <span style="color: #000066;">:</span><span style="color: #000066;">=</span> <span style="color: #0000ff;">0</span><span style="color: #000066;">;</span><br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">end</span><span style="color: #000066;">.</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://blogs.wittwer.fr/whiler/2009/10/19/sample-geolite-city-delphi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

