Nick Hodges avatar Nick Hodges committed 983a9aa

Adding code for DAPUG presentations

Comments (0)

Files changed (364)

 (?i)\.cbk
 (?i)\.ovr
 (?i)\.dcr
+(?i)\.pptx
+(?i)\.docx
 syntax: glob
 */_ReSharper.*
 *.ReSharper.user

Denmark/1 - Interfaces/Code/InterfacesDemoGroup.groupproj

+	<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+		<PropertyGroup>
+			<ProjectGuid>{1A2F40CC-E60F-4EA1-848C-D3FF64C74929}</ProjectGuid>
+		</PropertyGroup>
+		<ItemGroup>
+			<Projects Include="Step1.dproj">
+				<Dependencies/>
+			</Projects>
+			<Projects Include="Step2.dproj">
+				<Dependencies/>
+			</Projects>
+			<Projects Include="Step3.dproj">
+				<Dependencies/>
+			</Projects>
+			<Projects Include="Step4.dproj">
+				<Dependencies/>
+			</Projects>
+			<Projects Include="MultipleImplementations\MultipleImplementations.dproj">
+				<Dependencies/>
+			</Projects>
+		</ItemGroup>
+		<ProjectExtensions>
+			<Borland.Personality>Default.Personality.12</Borland.Personality>
+			<Borland.ProjectType/>
+			<BorlandProject>
+				<Default.Personality/>
+			</BorlandProject>
+		</ProjectExtensions>
+		<Target Name="Step1">
+			<MSBuild Projects="Step1.dproj"/>
+		</Target>
+		<Target Name="Step1:Clean">
+			<MSBuild Projects="Step1.dproj" Targets="Clean"/>
+		</Target>
+		<Target Name="Step1:Make">
+			<MSBuild Projects="Step1.dproj" Targets="Make"/>
+		</Target>
+		<Target Name="Step2">
+			<MSBuild Projects="Step2.dproj"/>
+		</Target>
+		<Target Name="Step2:Clean">
+			<MSBuild Projects="Step2.dproj" Targets="Clean"/>
+		</Target>
+		<Target Name="Step2:Make">
+			<MSBuild Projects="Step2.dproj" Targets="Make"/>
+		</Target>
+		<Target Name="Step3">
+			<MSBuild Projects="Step3.dproj"/>
+		</Target>
+		<Target Name="Step3:Clean">
+			<MSBuild Projects="Step3.dproj" Targets="Clean"/>
+		</Target>
+		<Target Name="Step3:Make">
+			<MSBuild Projects="Step3.dproj" Targets="Make"/>
+		</Target>
+		<Target Name="Step4">
+			<MSBuild Projects="Step4.dproj"/>
+		</Target>
+		<Target Name="Step4:Clean">
+			<MSBuild Projects="Step4.dproj" Targets="Clean"/>
+		</Target>
+		<Target Name="Step4:Make">
+			<MSBuild Projects="Step4.dproj" Targets="Make"/>
+		</Target>
+		<Target Name="MultipleImplementations">
+			<MSBuild Projects="MultipleImplementations\MultipleImplementations.dproj"/>
+		</Target>
+		<Target Name="MultipleImplementations:Clean">
+			<MSBuild Projects="MultipleImplementations\MultipleImplementations.dproj" Targets="Clean"/>
+		</Target>
+		<Target Name="MultipleImplementations:Make">
+			<MSBuild Projects="MultipleImplementations\MultipleImplementations.dproj" Targets="Make"/>
+		</Target>
+		<Target Name="Build">
+			<CallTarget Targets="Step1;Step2;Step3;Step4;MultipleImplementations"/>
+		</Target>
+		<Target Name="Clean">
+			<CallTarget Targets="Step1:Clean;Step2:Clean;Step3:Clean;Step4:Clean;MultipleImplementations:Clean"/>
+		</Target>
+		<Target Name="Make">
+			<CallTarget Targets="Step1:Make;Step2:Make;Step3:Make;Step4:Make;MultipleImplementations:Make"/>
+		</Target>
+		<Import Condition="Exists('$(BDS)\Bin\CodeGear.Group.Targets')" Project="$(BDS)\Bin\CodeGear.Group.Targets"/>
+	</Project>
Add a comment to this file

Denmark/1 - Interfaces/Code/MultipleImplementations/Demo.Spring.MultipleImplementations.res

Binary file added.

Denmark/1 - Interfaces/Code/MultipleImplementations/Demo.Spring.dpr

+program Demo.Spring;
+
+uses
+  Vcl.Forms,
+  frmMultipleImplementations in 'frmMultipleImplementations.pas' {Form30},
+  uCreditCardInterface in 'uCreditCardInterface.pas';
+
+{$R *.res}
+
+begin
+  Application.Initialize;
+  Application.MainFormOnTaskbar := True;
+  Application.CreateForm(TForm30, Form30);
+  Application.Run;
+end.

Denmark/1 - Interfaces/Code/MultipleImplementations/MultipleImplementations.dpr

+program MultipleImplementations;
+
+uses
+  Forms,
+  frmMultipleImplementations in 'frmMultipleImplementations.pas' {MultipleImplementationsForm},
+  uCreditCardInterface in 'uCreditCardInterface.pas',
+  uCreditCards in 'uCreditCards.pas';
+
+{$R *.res}
+
+begin
+  Application.Initialize;
+  Application.MainFormOnTaskbar := True;
+  Application.CreateForm(TMultipleImplementationsForm, MultipleImplementationsForm);
+  Application.Run;
+end.

Denmark/1 - Interfaces/Code/MultipleImplementations/MultipleImplementations.dproj

+	<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+		<PropertyGroup>
+			<ProjectGuid>{E68D06C2-CDAB-447F-9F9C-ECC81638FFEA}</ProjectGuid>
+			<ProjectVersion>13.4</ProjectVersion>
+			<FrameworkType>VCL</FrameworkType>
+			<MainSource>MultipleImplementations.dpr</MainSource>
+			<Base>True</Base>
+			<Config Condition="'$(Config)'==''">Debug</Config>
+			<Platform Condition="'$(Platform)'==''">Win32</Platform>
+			<TargetedPlatforms>1</TargetedPlatforms>
+			<AppType>Application</AppType>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
+			<Base_Win64>true</Base_Win64>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
+			<Base_Win32>true</Base_Win32>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+			<Cfg_1>true</Cfg_1>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
+			<Cfg_1_Win32>true</Cfg_1_Win32>
+			<CfgParent>Cfg_1</CfgParent>
+			<Cfg_1>true</Cfg_1>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+			<Cfg_2>true</Cfg_2>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base)'!=''">
+			<DCC_UsePackage>bindcompfmx;fmx;rtl;dbrtl;IndySystem;DbxClientDriver;bindcomp;inetdb;DBXInterBaseDriver;DataSnapCommon;DataSnapClient;DataSnapServer;DataSnapProviderClient;xmlrtl;ibxpress;DbxCommonDriver;IndyProtocols;DBXMySQLDriver;dbxcds;soaprtl;bindengine;DBXOracleDriver;dsnap;DBXInformixDriver;IndyCore;fmxase;CloudService;DBXFirebirdDriver;inet;fmxobj;inetdbxpress;DBXSybaseASADriver;fmxdae;dbexpress;DataSnapIndy10ServerTransport;IPIndyImpl;$(DCC_UsePackage)</DCC_UsePackage>
+			<Icon_MainIcon>$(BDS)\bin\delphi_PROJECTICON.ico</Icon_MainIcon>
+			<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;$(DCC_Namespace)</DCC_Namespace>
+			<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
+			<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
+			<DCC_E>false</DCC_E>
+			<DCC_N>false</DCC_N>
+			<DCC_S>false</DCC_S>
+			<DCC_F>false</DCC_F>
+			<DCC_K>false</DCC_K>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base_Win64)'!=''">
+			<DCC_UsePackage>TeeDB;vclib;Tee;DBXOdbcDriver;DataBindings;DBXSybaseASEDriver;vclimg;vclactnband;vcldb;TeeUI;bindcompvcl;vcldsnap;vclie;vcltouch;DBXDb2Driver;websnap;VclSmp;vcl;DataSnapConnectors;DBXMSSQLDriver;dsnapcon;vclx;webdsnap;DSharp.Core;adortl;$(DCC_UsePackage)</DCC_UsePackage>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base_Win32)'!=''">
+			<DCC_UsePackage>vcldbx;TeeDB;VirtualTreesD;Rave100VCL;vclib;Tee;inetdbbde;DBXOdbcDriver;DataBindings;svnui;DBXSybaseASEDriver;vclimg;intrawebdb_120_160;fmi;vclactnband;FMXTee;vcldb;TeeUI;bindcompvcl;vcldsnap;vclie;vcltouch;Intraweb_120_160;DBXDb2Driver;websnap;vclribbon;VclSmp;vcl;DataSnapConnectors;CodeSiteExpressPkg;DBXMSSQLDriver;FmxTeeUI;dsnapcon;vclx;webdsnap;svn;DSharp.Core;bdertl;adortl;$(DCC_UsePackage)</DCC_UsePackage>
+			<VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo>
+			<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
+			<VerInfo_Locale>1033</VerInfo_Locale>
+			<Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File>
+			<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_1)'!=''">
+			<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
+			<DCC_Optimize>false</DCC_Optimize>
+			<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
+			<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+			<DCC_RemoteDebug>true</DCC_RemoteDebug>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
+			<DCC_RemoteDebug>false</DCC_RemoteDebug>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_2)'!=''">
+			<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
+			<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
+			<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
+			<DCC_DebugInformation>false</DCC_DebugInformation>
+		</PropertyGroup>
+		<ItemGroup>
+			<DelphiCompile Include="$(MainSource)">
+				<MainSource>MainSource</MainSource>
+			</DelphiCompile>
+			<DCCReference Include="frmMultipleImplementations.pas">
+				<Form>MultipleImplementationsForm</Form>
+			</DCCReference>
+			<DCCReference Include="uCreditCardInterface.pas"/>
+			<DCCReference Include="uCreditCards.pas"/>
+			<BuildConfiguration Include="Release">
+				<Key>Cfg_2</Key>
+				<CfgParent>Base</CfgParent>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Base">
+				<Key>Base</Key>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Debug">
+				<Key>Cfg_1</Key>
+				<CfgParent>Base</CfgParent>
+			</BuildConfiguration>
+		</ItemGroup>
+		<ProjectExtensions>
+			<Borland.Personality>Delphi.Personality.12</Borland.Personality>
+			<Borland.ProjectType/>
+			<BorlandProject>
+				<Delphi.Personality>
+					<VersionInfo>
+						<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
+						<VersionInfo Name="AutoIncBuild">False</VersionInfo>
+						<VersionInfo Name="MajorVer">1</VersionInfo>
+						<VersionInfo Name="MinorVer">0</VersionInfo>
+						<VersionInfo Name="Release">0</VersionInfo>
+						<VersionInfo Name="Build">0</VersionInfo>
+						<VersionInfo Name="Debug">False</VersionInfo>
+						<VersionInfo Name="PreRelease">False</VersionInfo>
+						<VersionInfo Name="Special">False</VersionInfo>
+						<VersionInfo Name="Private">False</VersionInfo>
+						<VersionInfo Name="DLL">False</VersionInfo>
+						<VersionInfo Name="Locale">1033</VersionInfo>
+						<VersionInfo Name="CodePage">1252</VersionInfo>
+					</VersionInfo>
+					<VersionInfoKeys>
+						<VersionInfoKeys Name="CompanyName"/>
+						<VersionInfoKeys Name="FileDescription"/>
+						<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="InternalName"/>
+						<VersionInfoKeys Name="LegalCopyright"/>
+						<VersionInfoKeys Name="LegalTrademarks"/>
+						<VersionInfoKeys Name="OriginalFilename"/>
+						<VersionInfoKeys Name="ProductName"/>
+						<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="Comments"/>
+					</VersionInfoKeys>
+					<Source>
+						<Source Name="MainSource">MultipleImplementations.dpr</Source>
+					</Source>
+				</Delphi.Personality>
+				<Deployment/>
+				<Platforms>
+					<Platform value="Win64">False</Platform>
+					<Platform value="Win32">True</Platform>
+				</Platforms>
+			</BorlandProject>
+			<ProjectFileVersion>12</ProjectFileVersion>
+		</ProjectExtensions>
+		<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
+		<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
+	</Project>
Add a comment to this file

Denmark/1 - Interfaces/Code/MultipleImplementations/MultipleImplementations.res

Binary file added.

Denmark/1 - Interfaces/Code/MultipleImplementations/frmMultipleImplementations.dfm

+object MultipleImplementationsForm: TMultipleImplementationsForm
+  Left = 0
+  Top = 0
+  Caption = 'One Interface, Many Implementations'
+  ClientHeight = 200
+  ClientWidth = 686
+  Color = clBtnFace
+  Font.Charset = DEFAULT_CHARSET
+  Font.Color = clWindowText
+  Font.Height = -11
+  Font.Name = 'Tahoma'
+  Font.Style = []
+  OldCreateOrder = False
+  OnCreate = FormCreate
+  DesignSize = (
+    686
+    200)
+  PixelsPerInch = 96
+  TextHeight = 13
+  object GroupBox1: TGroupBox
+    Left = 8
+    Top = 8
+    Width = 121
+    Height = 161
+    Caption = 'Credit Card Type'
+    TabOrder = 0
+    object Image2: TImage
+      Left = 48
+      Top = 114
+      Width = 33
+      Height = 22
+      Picture.Data = {
+        0954474946496D61676547494638376116001600C40003FFFFFFF1FAFDE4F1F8
+        CFE6F2C3DFEFB2D2E9A0CCE697C5E381CBEF7AC7EC8BBDDD6FC0E967BCE67BB4
+        D95EB5E26AAFD74FADDD55A0D04D9ACD3AA7D7378FC8199DD23085C2008FC90D
+        80C00579BD0170B9006CB7006AB60068B50067B50061B22C0000000016001600
+        84FFFFFFF1FAFDE4F1F8CFE6F2C3DFEFB2D2E9A0CCE697C5E381CBEF7AC7EC8B
+        BDDD6FC0E967BCE67BB4D95EB5E26AAFD74FADDD55A0D04D9ACD3AA7D7378FC8
+        199DD23085C2008FC90D80C00579BD0170B9006CB7006AB60068B50067B50061
+        B205FFA0C32C24E34053755D189669DAC6759E3726F862A22AFBC6B3DA228128
+        2616A7D4CA0593D13CC322E2C8E02D7F1B279468D4597DCD19ED96DB29C1C0A7
+        88C136F7981A4EADF3F94016469C63C29F50FE80181F16140C02030201870209
+        038E0204910403040A8E0405140D000D1A0600031911071812110A1606031605
+        01110511030F1611010F12120A180A079016199F051811160D0D0F0F11A314BA
+        C888161A0500120F0609129A041F07990A190F0D99E11805BD0894060200AD02
+        0502070A0A0605950604111419B4CAA6B8FEFF822848D800A3A0160F751226A4
+        F5A1A0C31859C4D4A8F14193872C1833729038D1038D0F1E368A1CD9E149C793
+        25530CA63CC9B2A5CB973063D60801003B}
+      OnClick = Image2Click
+    end
+    object Image3: TImage
+      Left = 48
+      Top = 58
+      Width = 41
+      Height = 22
+      Picture.Data = {
+        0954474946496D61676547494638396125001600C40003FFFFFFF1F9FCF3EBE9
+        DCE7F7E1DDE7FAEAC7EECEC1CAC7D9E6B2B2C3B6C7E39C9CE4AC78FAC26AFBB5
+        4AFBA427FF9900F38100E06E09E2560ADE5003D53C3CC33529D1150ACB0101B0
+        6C35916385DA5B5DDF706FAB7F95D68489B0A0B7FBD08F21F90401000000002C
+        000000002500160084FFFFFFF1F9FCF3EBE9DCE7F7E1DDE7FAEAC7EECEC1CAC7
+        D9E6B2B2C3B6C7E39C9CE4AC78FAC26AFBB54AFBA427FF9900F38100E06E09E2
+        560ADE5003D53C3CC33529D1150ACB0101B06C35916385DA5B5DDF706FAB7F95
+        D68489B0A0B7FBD08F05FF20208EC0A65556AA6DE4C834CEF3380DD3DE6575ED
+        FC6E69AE986C2873D870064A6FC9AB2C84C4E8CCD032E8984C0B44CA9D9294D8
+        6C6ADB253A469D3053026997A5C7ABBA59A957C8EF19203D6F4A26801378791F
+        1A170A69087C3D3F12118F108F0F1F051F5C100E1F0D161501081C9E1D060A16
+        0A06A01A1A06860A1C07021C0B940C990C0C0607050E1719010909011D191E03
+        AF191C041DB004A0C40D911C1E02C009B0039617AE0407C908DC19C91DADBE07
+        095602310EB8D3061E0513070C0F17091ECC04049F0415BD03ADFB151228B870
+        CD018151DB1648631000C6B06101C11DF0902019B20AC43A783094A118B28909
+        1A543870C0408D457D385661905061C2230C2F1F45780001E6CC0F00E4CCB120
+        33C2A03767F6F4E1912245853C4382020093B2CDCF320D328CB032D4C7532E0E
+        0A5461AAC6099432EA70E408F32348172362499840A182C58D170EE2D238D222
+        04003B}
+      OnClick = Image3Click
+    end
+    object Image4: TImage
+      Left = 48
+      Top = 86
+      Width = 41
+      Height = 22
+      Picture.Data = {
+        0954474946496D61676547494638396123001600D50003FFFFFF1C151E120F18
+        0E0509251F28311D1B3B31304D403247444360513F4B6C4A66605C5F795E7670
+        6D6E8B6B7A6B4F8A77519C8B61A08233AF713BB25C379C5B31A358239D4D2692
+        582A824F2A8C393394392883342A84361C6F381F56221BA63B23AE381DB44F2B
+        B74A35C44E34C7532ECE5727D34929D44C34D85939CE593BD8632CE25529EB64
+        36EC6F2FF16D2FE97C2EF57C27DF7224DA8231D16F3BC86D26B8521DFA5325EF
+        7940FD8F27FF891DF8AF36F4D164A1A39085A183B4C8B121F90401000000002C
+        000000002300160085FFFFFF1C151E120F180E0509251F28311D1B3B31304D40
+        3247444360513F4B6C4A66605C5F795E76706D6E8B6B7A6B4F8A77519C8B61A0
+        8233AF713BB25C379C5B31A358239D4D2692582A824F2A8C393394392883342A
+        84361C6F381F56221BA63B23AE381DB44F2BB74A35C44E34C7532ECE5727D349
+        29D44C34D85939CE593BD8632CE25529EB6436EC6F2FF16D2FE97C2EF57C27DF
+        7224DA8231D16F3BC86D26B8521DFA5325EF7940FD8F27FF891DF8AF36F4D164
+        A1A39085A183B4C8B106FF40808110081089C662A128082C934E6261F93C080B
+        135A46E099043293426536F31C6A33CC87E6195428A2582DE3A2610E882F4E84
+        EB74681F38162230171618313A39393532190135362C1B1E2A22172D0508041B
+        25031D2A20231F291D2B1E0202163A3B3C393225141F281E2594231C1D240179
+        1A254E292725A41B29054D263A3C3C3B2E212520241F2A24212327371F020705
+        1BBB1C29D1D31E281D4520373138372C1F232C1CB34B2321281C02BD2F362D1E
+        1E2E35300A709053E3C20A453136A8D2F1A1C00B1C254C74F09069C8070C1650
+        5DC4D0264017090D25487824E062002E192636ECF021499397A99A9C143020D5
+        809A3169E6DC0905A6CCF498337306DDC993C84FA0447F9E6412C040010308F0
+        2C2520C0C081040B0E183030E0C083AF0F201C1880006CD82110204458DB83AB
+        916D11203C489060EC81B478C726C09B16ED5AB6630948A97BA0B00101050C17
+        A66A75ABD5220BD23678D0632C9429539C52F5C9392601040B1A2C58F003C180
+        2489E9261882646950D7A9088C6ED0A047E9268313CC85FDF27511A6A043D3A6
+        0AE58851A0BE7F3331C0408173063E10E02ED2DA4981D6A9942BC7D7DC878F1F
+        B7AB1649A02940D8B46391CBFC5DF57B0F070A1848E76524CFA6C2858F21D77E
+        D2C07B060032C0950100089644754618689C600C7E86C0839B08400000410000
+        3B}
+      OnClick = Image4Click
+    end
+    object Image1: TImage
+      Left = 48
+      Top = 30
+      Width = 41
+      Height = 22
+      Picture.Data = {
+        0954474946496D61676547494638376123001600B30003F7F5F2FFE1BDFED7A0
+        B7C3D3A5B4C78D9CB57886A9556D91385881032D61FF9905FFB86C0000000000
+        000000000000002C000000002300160083F7F5F2FFE1BDFED7A0B7C3D3A5B4C7
+        8D9CB57886A9556D91385881032D61FF9905FFB86C0000000000000000000000
+        0004D5109949ABBDD8CA41BAFF60287A00959C68AAAE2C4A986D2CBBF06CAFEF
+        84EC7CEFFF40DE6002281A8FC8A41249340E0F84A2E13028504BBB82716A4836
+        8D85C4013048200088C4E0604E0FC8A8F7F15B2C9FD304BB9E5C4C1BD44C5D47
+        76046600615D69085170077F725B82478A806E456C09516987095A7392466909
+        8286727F5027A29E9149A2458876A2047E0669639F49569E0457053C798E7507
+        AB525D01C7C8C9CACBCCC825060B0AD2D3D4D5D6D7D30213D1D8DDDED9DBDFE2
+        D8DAD0E3E7D4E5020BECEDEEEFF0F1ED01B519F6F7170811003B}
+      OnClick = Image1Click
+    end
+    object RadioButton1: TRadioButton
+      Left = 24
+      Top = 35
+      Width = 18
+      Height = 17
+      TabOrder = 0
+      OnClick = RadioButton1Click
+    end
+    object RadioButton2: TRadioButton
+      Left = 24
+      Top = 58
+      Width = 18
+      Height = 17
+      TabOrder = 1
+      OnClick = RadioButton2Click
+    end
+    object RadioButton3: TRadioButton
+      Left = 24
+      Top = 86
+      Width = 18
+      Height = 17
+      TabOrder = 2
+      OnClick = RadioButton3Click
+    end
+    object RadioButton4: TRadioButton
+      Left = 24
+      Top = 114
+      Width = 18
+      Height = 17
+      TabOrder = 3
+      OnClick = RadioButton4Click
+    end
+  end
+  object Button1: TButton
+    Left = 152
+    Top = 24
+    Width = 161
+    Height = 25
+    Caption = 'Validate Card'
+    TabOrder = 1
+    OnClick = Button1Click
+  end
+  object Button2: TButton
+    Left = 152
+    Top = 82
+    Width = 161
+    Height = 25
+    Caption = 'Charge Amount to Card'
+    TabOrder = 2
+    OnClick = Button2Click
+  end
+  object Memo1: TMemo
+    Left = 336
+    Top = 26
+    Width = 342
+    Height = 166
+    Anchors = [akLeft, akTop, akRight, akBottom]
+    Lines.Strings = (
+      '')
+    ScrollBars = ssVertical
+    TabOrder = 3
+  end
+  object Edit1: TEdit
+    Left = 152
+    Top = 55
+    Width = 161
+    Height = 21
+    MaxLength = 12
+    TabOrder = 4
+    Text = '411111111111'
+  end
+  object SpinEdit1: TSpinEdit
+    Left = 152
+    Top = 113
+    Width = 161
+    Height = 22
+    MaxValue = 1000
+    MinValue = 1
+    TabOrder = 5
+    Value = 50
+  end
+end

Denmark/1 - Interfaces/Code/MultipleImplementations/frmMultipleImplementations.pas

+unit frmMultipleImplementations;
+
+interface
+
+uses
+  Windows, Messages, SysUtils, Variants, Classes, Graphics,
+  Controls, Forms, Dialogs, ExtCtrls, StdCtrls, GIFImg, Spin
+
+  , uCreditCardInterface
+  , uCreditCards
+  ;
+
+type
+  TMultipleImplementationsForm = class(TForm)
+    GroupBox1: TGroupBox;
+    RadioButton1: TRadioButton;
+    RadioButton2: TRadioButton;
+    RadioButton3: TRadioButton;
+    RadioButton4: TRadioButton;
+    Image2: TImage;
+    Image3: TImage;
+    Image4: TImage;
+    Button1: TButton;
+    Button2: TButton;
+    Memo1: TMemo;
+    Image1: TImage;
+    Edit1: TEdit;
+    SpinEdit1: TSpinEdit;
+    procedure Button1Click(Sender: TObject);
+    procedure FormCreate(Sender: TObject);
+    procedure RadioButton1Click(Sender: TObject);
+    procedure RadioButton2Click(Sender: TObject);
+    procedure RadioButton3Click(Sender: TObject);
+    procedure RadioButton4Click(Sender: TObject);
+    procedure Button2Click(Sender: TObject);
+    procedure Image1Click(Sender: TObject);
+    procedure Image2Click(Sender: TObject);
+    procedure Image3Click(Sender: TObject);
+    procedure Image4Click(Sender: TObject);
+  private
+    { Private declarations }
+    CurrentCard: ICreditCard;
+  public
+    { Public declarations }
+  end;
+
+var
+  MultipleImplementationsForm: TMultipleImplementationsForm;
+
+implementation
+
+{$R *.dfm}
+
+function RandomString(aLength: Integer; aInputChars: string): string;
+begin
+  Result := '';
+  if Length(aInputChars) <= 0 then
+  begin
+    Exit;
+  end;
+
+  repeat
+    Result := Result + aInputChars[Random(Length(aInputChars)) + 1];
+  until (Length(Result) = aLength);
+end;
+
+procedure TMultipleImplementationsForm.Button1Click(Sender: TObject);
+begin
+  CurrentCard.IsValid(Edit1.Text);
+  Edit1.Text := RandomString(Edit1.MaxLength, '1234567890');
+end;
+
+procedure TMultipleImplementationsForm.Button2Click(Sender: TObject);
+begin
+  CurrentCard.ChargeAmount(Edit1.Text, SpinEdit1.Value);
+  SpinEdit1.Value := Random(SpinEdit1.MaxValue) + SpinEdit1.MinValue;
+end;
+
+procedure TMultipleImplementationsForm.FormCreate(Sender: TObject);
+begin
+  RadioButton1.Checked := True;
+  Randomize;
+end;
+
+procedure TMultipleImplementationsForm.Image1Click(Sender: TObject);
+begin
+  RadioButton1.Checked := True;
+end;
+
+procedure TMultipleImplementationsForm.Image2Click(Sender: TObject);
+begin
+  RadioButton4.Checked := True;
+end;
+
+procedure TMultipleImplementationsForm.Image3Click(Sender: TObject);
+begin
+  RadioButton2.Checked := True;
+end;
+
+procedure TMultipleImplementationsForm.Image4Click(Sender: TObject);
+begin
+  RadioButton3.Checked := True;
+end;
+
+procedure TMultipleImplementationsForm.RadioButton1Click(Sender: TObject);
+begin
+  CurrentCard := TVisa.Create(Memo1.Lines);
+end;
+
+procedure TMultipleImplementationsForm.RadioButton2Click(Sender: TObject);
+begin
+  CurrentCard := TMasterCard.Create(Memo1.Lines );
+end;
+
+procedure TMultipleImplementationsForm.RadioButton3Click(Sender: TObject);
+begin
+  CurrentCard := TDiscover.Create(Memo1.Lines);
+end;
+
+procedure TMultipleImplementationsForm.RadioButton4Click(Sender: TObject);
+begin
+  CurrentCard := TAMEX.Create(Memo1.Lines);
+end;
+
+end.

Denmark/1 - Interfaces/Code/MultipleImplementations/uCreditCardInterface.pas

+unit uCreditCardInterface;
+
+interface
+
+type
+  ICreditCard = interface
+    ['{6490640C-0E2B-4F7D-908C-0E6A74DCC0A0}']
+    function IsValid(aCreditCardNumber: string): boolean;
+    function ChargeAmount(aCreditCardNumber: string; aAmount: Double): Boolean;
+  end;
+
+const
+  Visa = 'VISA';
+  Mastercard = 'MasterCard';
+  Discover = 'Discover';
+  AMEX = 'AMEX';
+
+implementation
+
+end.

Denmark/1 - Interfaces/Code/MultipleImplementations/uCreditCards.pas

+unit uCreditCards;
+
+interface
+
+uses
+     uCreditCardInterface
+   , SysUtils
+   , Classes
+   ;
+
+type
+
+  ECreditCardException = class(Exception);
+
+  TCreditCard = class(TInterfacedObject, ICreditCard)
+  strict private
+    fStrings: TStrings;
+    FName: string;
+  strict protected
+    constructor Create(aName: string; aStrings: TStrings); overload;
+  public
+    function ChargeAmount(aCreditCardNumber: string; aAmount: Double): Boolean; virtual;
+    function IsValid(aCreditCardNumber: string): Boolean; virtual;
+    property Name: string read FName;
+  end;
+
+  TVisa = class(TCreditCard)
+  public
+    constructor Create(aStrings: TStrings); overload;
+  end;
+
+  TMasterCard = class(TCreditCard)
+  public
+    constructor Create(aStrings: TStrings); overload;
+  end;
+
+  TDiscover = class(TCreditCard)
+  public
+    constructor Create(aStrings: TStrings); overload;
+  end;
+
+  TAMEX = class(TCreditCard)
+  public
+    constructor Create(aStrings: TStrings); overload;
+  end;
+
+
+implementation
+
+{ TCreditCard }
+
+constructor TCreditCard.Create(aName: string; aStrings: TStrings);
+begin
+  inherited Create;
+  if aStrings = nil then
+  begin
+    raise ECreditCardException.Create('aStrings cannot be nil');
+  end;
+  if aName = '' then
+  begin
+    raise ECreditCardException.Create('A credit card must have a name');
+  end;
+  FStrings := aStrings;
+  FName := aName;
+end;
+
+function TCreditCard.ChargeAmount(aCreditCardNumber: string; aAmount: Double): Boolean;
+begin
+  FStrings.Add(Format('This %s card: %s has been charged $%f', [Name, aCreditCardNumber, aAmount]));
+  Result := True;
+end;
+
+function TCreditCard.IsValid(aCreditCardNumber: string): Boolean;
+begin
+  Result := True;
+  FStrings.Add(Format('This %s card: %s is valid.', [Name, aCreditCardNumber]));
+end;
+
+{ TVisa }
+
+constructor TVisa.Create(aStrings: TStrings);
+begin
+  inherited Create;
+  Create(VISA, aStrings);
+end;
+
+{ TMasterCard }
+
+constructor TMasterCard.Create(aStrings: TStrings);
+begin
+  inherited Create;
+  Create(MasterCard, aStrings);
+end;
+
+{ TDiscover }
+
+constructor TDiscover.Create(aStrings: TStrings);
+begin
+  inherited Create;
+  Create(Discover, aStrings);
+end;
+
+{ TAMEX }
+
+constructor TAMEX.Create(aStrings: TStrings);
+begin
+  inherited Create;
+  Create(AMEX, aStrings);
+end;
+
+
+
+end.

Denmark/1 - Interfaces/Code/SampleInterfaces.pas

+unit SampleInterfaces;
+
+interface
+
+type
+  IGetText = interface
+    ['{112C9CA5-013E-4E0A-BF2B-382C1AB5C54C}']
+    function GetText: string;
+  end;
+
+  IGetHTML = interface(IGetText)
+    ['{8EEEF287-9729-4A7F-8631-9DF9B8363603}']
+    function GetHTML: string;
+  end;
+
+implementation
+
+end.

Denmark/1 - Interfaces/Code/Step1.dpr

+program Step1;
+
+{$APPTYPE CONSOLE}
+
+{$R *.res}
+
+uses
+  System.SysUtils,
+  SampleInterfaces in 'SampleInterfaces.pas';
+
+type
+    TGetTextImplementation = class(TObject, IGetText)
+    public
+      function GetText: string;
+    end;
+
+
+{ TGetTextImplementation }
+
+function TGetTextImplementation.GetText: string;
+begin
+  Result := 'Hello World';
+end;
+
+begin
+  try
+    { TODO -oUser -cConsole Main : Insert code here }
+
+    //Oops, this won't compile!
+
+  except
+    on E: Exception do
+      Writeln(E.ClassName, ': ', E.Message);
+  end;
+end.

Denmark/1 - Interfaces/Code/Step1.dproj

+	<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+		<PropertyGroup>
+			<ProjectGuid>{DC787B31-12B2-4748-B93C-E8FF8182CA67}</ProjectGuid>
+			<ProjectVersion>13.4</ProjectVersion>
+			<FrameworkType>None</FrameworkType>
+			<MainSource>Step1.dpr</MainSource>
+			<Base>True</Base>
+			<Config Condition="'$(Config)'==''">Debug</Config>
+			<Platform Condition="'$(Platform)'==''">Win32</Platform>
+			<TargetedPlatforms>1</TargetedPlatforms>
+			<AppType>Console</AppType>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
+			<Base_Win64>true</Base_Win64>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
+			<Base_Win32>true</Base_Win32>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+			<Cfg_1>true</Cfg_1>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
+			<Cfg_1_Win32>true</Cfg_1_Win32>
+			<CfgParent>Cfg_1</CfgParent>
+			<Cfg_1>true</Cfg_1>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+			<Cfg_2>true</Cfg_2>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base)'!=''">
+			<DCC_UsePackage>bindcompfmx;fmx;rtl;dbrtl;IndySystem;DbxClientDriver;bindcomp;inetdb;DBXInterBaseDriver;DataSnapCommon;DataSnapClient;DataSnapServer;DataSnapProviderClient;xmlrtl;ibxpress;DbxCommonDriver;IndyProtocols;DBXMySQLDriver;dbxcds;soaprtl;bindengine;DBXOracleDriver;CustomIPTransport;dsnap;DBXInformixDriver;fmxase;IndyCore;DBXFirebirdDriver;inet;fmxobj;inetdbxpress;DBXSybaseASADriver;fmxdae;IPIndyImpl;dbexpress;DataSnapIndy10ServerTransport;$(DCC_UsePackage)</DCC_UsePackage>
+			<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
+			<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
+			<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
+			<DCC_E>false</DCC_E>
+			<DCC_N>false</DCC_N>
+			<DCC_S>false</DCC_S>
+			<DCC_F>false</DCC_F>
+			<DCC_K>false</DCC_K>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base_Win64)'!=''">
+			<DCC_UsePackage>TeeDB;vclib;Tee;DBXOdbcDriver;DBXSybaseASEDriver;vclimg;vclactnband;TeeUI;vcldb;bindcompvcl;vcldsnap;vclie;vcltouch;DBXDb2Driver;websnap;VclSmp;vcl;DataSnapConnectors;DBXMSSQLDriver;dsnapcon;vclx;webdsnap;adortl;$(DCC_UsePackage)</DCC_UsePackage>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base_Win32)'!=''">
+			<DCC_UsePackage>vcldbx;frx16;TeeDB;Rave100VCL;vclib;Tee;inetdbbde;DBXOdbcDriver;DBXSybaseASEDriver;svnui;vclimg;fmi;intrawebdb_120_160;frxDB16;fs16;vclactnband;FMXTee;TeeUI;vcldb;bindcompvcl;vcldsnap;vclie;vcltouch;Intraweb_120_160;DBXDb2Driver;websnap;vclribbon;VclSmp;fsDB16;frxe16;vcl;DataSnapConnectors;CloudService;DBXMSSQLDriver;CodeSiteExpressPkg;FmxTeeUI;dsnapcon;vclx;webdsnap;svn;bdertl;adortl;$(DCC_UsePackage)</DCC_UsePackage>
+			<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
+			<VerInfo_Locale>1033</VerInfo_Locale>
+			<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_1)'!=''">
+			<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
+			<DCC_Optimize>false</DCC_Optimize>
+			<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
+			<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+			<DCC_RemoteDebug>true</DCC_RemoteDebug>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
+			<DCC_RemoteDebug>false</DCC_RemoteDebug>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_2)'!=''">
+			<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
+			<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
+			<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
+			<DCC_DebugInformation>false</DCC_DebugInformation>
+		</PropertyGroup>
+		<ItemGroup>
+			<DelphiCompile Include="$(MainSource)">
+				<MainSource>MainSource</MainSource>
+			</DelphiCompile>
+			<DCCReference Include="SampleInterfaces.pas"/>
+			<BuildConfiguration Include="Release">
+				<Key>Cfg_2</Key>
+				<CfgParent>Base</CfgParent>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Base">
+				<Key>Base</Key>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Debug">
+				<Key>Cfg_1</Key>
+				<CfgParent>Base</CfgParent>
+			</BuildConfiguration>
+		</ItemGroup>
+		<ProjectExtensions>
+			<Borland.Personality>Delphi.Personality.12</Borland.Personality>
+			<Borland.ProjectType/>
+			<BorlandProject>
+				<Delphi.Personality>
+					<VersionInfo>
+						<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
+						<VersionInfo Name="AutoIncBuild">False</VersionInfo>
+						<VersionInfo Name="MajorVer">1</VersionInfo>
+						<VersionInfo Name="MinorVer">0</VersionInfo>
+						<VersionInfo Name="Release">0</VersionInfo>
+						<VersionInfo Name="Build">0</VersionInfo>
+						<VersionInfo Name="Debug">False</VersionInfo>
+						<VersionInfo Name="PreRelease">False</VersionInfo>
+						<VersionInfo Name="Special">False</VersionInfo>
+						<VersionInfo Name="Private">False</VersionInfo>
+						<VersionInfo Name="DLL">False</VersionInfo>
+						<VersionInfo Name="Locale">1033</VersionInfo>
+						<VersionInfo Name="CodePage">1252</VersionInfo>
+					</VersionInfo>
+					<VersionInfoKeys>
+						<VersionInfoKeys Name="CompanyName"/>
+						<VersionInfoKeys Name="FileDescription"/>
+						<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="InternalName"/>
+						<VersionInfoKeys Name="LegalCopyright"/>
+						<VersionInfoKeys Name="LegalTrademarks"/>
+						<VersionInfoKeys Name="OriginalFilename"/>
+						<VersionInfoKeys Name="ProductName"/>
+						<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="Comments"/>
+					</VersionInfoKeys>
+					<Source>
+						<Source Name="MainSource">Step1.dpr</Source>
+					</Source>
+				</Delphi.Personality>
+				<Deployment/>
+				<Platforms>
+					<Platform value="Win64">False</Platform>
+					<Platform value="OSX32">False</Platform>
+					<Platform value="Win32">True</Platform>
+				</Platforms>
+			</BorlandProject>
+			<ProjectFileVersion>12</ProjectFileVersion>
+		</ProjectExtensions>
+		<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
+		<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
+	</Project>
Add a comment to this file

Denmark/1 - Interfaces/Code/Step1.res

Binary file added.

Denmark/1 - Interfaces/Code/Step2.dpr

+program Step2;
+
+{$APPTYPE CONSOLE}
+
+{$R *.res}
+
+uses
+  System.SysUtils,
+  SampleInterfaces in 'SampleInterfaces.pas';
+
+type
+    TGetTextImplementation = class(TInterfacedObject, IGetText)
+    public
+      function GetText: string;
+    end;
+
+
+{ TGetTextImplementation }
+
+function TGetTextImplementation.GetText: string;
+begin
+  Result := 'Greetings from Pennsylvania!';
+end;
+
+var
+  GetTextImpl: IGetText;
+
+begin
+  try
+    GetTextImpl := TGetTextImplementation.Create;
+    WriteLn(GetTextImpl.GetText);
+  except
+    on E: Exception do
+      Writeln(E.ClassName, ': ', E.Message);
+  end;
+  ReadLn;
+
+end.

Denmark/1 - Interfaces/Code/Step2.dproj

+	<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+		<PropertyGroup>
+			<ProjectGuid>{B292161E-649F-41BF-A1CA-EA62E0DAE4C0}</ProjectGuid>
+			<ProjectVersion>13.4</ProjectVersion>
+			<FrameworkType>None</FrameworkType>
+			<MainSource>Step2.dpr</MainSource>
+			<Base>True</Base>
+			<Config Condition="'$(Config)'==''">Debug</Config>
+			<Platform Condition="'$(Platform)'==''">Win32</Platform>
+			<TargetedPlatforms>1</TargetedPlatforms>
+			<AppType>Console</AppType>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
+			<Base_Win64>true</Base_Win64>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
+			<Base_Win32>true</Base_Win32>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+			<Cfg_1>true</Cfg_1>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
+			<Cfg_1_Win32>true</Cfg_1_Win32>
+			<CfgParent>Cfg_1</CfgParent>
+			<Cfg_1>true</Cfg_1>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+			<Cfg_2>true</Cfg_2>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base)'!=''">
+			<DCC_UsePackage>bindcompfmx;fmx;rtl;dbrtl;IndySystem;DbxClientDriver;bindcomp;inetdb;DBXInterBaseDriver;DataSnapCommon;DataSnapClient;DataSnapServer;DataSnapProviderClient;xmlrtl;ibxpress;DbxCommonDriver;IndyProtocols;DBXMySQLDriver;dbxcds;soaprtl;bindengine;DBXOracleDriver;CustomIPTransport;dsnap;DBXInformixDriver;fmxase;IndyCore;DBXFirebirdDriver;inet;fmxobj;inetdbxpress;DBXSybaseASADriver;fmxdae;IPIndyImpl;dbexpress;DataSnapIndy10ServerTransport;$(DCC_UsePackage)</DCC_UsePackage>
+			<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
+			<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
+			<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
+			<DCC_E>false</DCC_E>
+			<DCC_N>false</DCC_N>
+			<DCC_S>false</DCC_S>
+			<DCC_F>false</DCC_F>
+			<DCC_K>false</DCC_K>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base_Win64)'!=''">
+			<DCC_UsePackage>TeeDB;vclib;Tee;DBXOdbcDriver;DBXSybaseASEDriver;vclimg;vclactnband;TeeUI;vcldb;bindcompvcl;vcldsnap;vclie;vcltouch;DBXDb2Driver;websnap;VclSmp;vcl;DataSnapConnectors;DBXMSSQLDriver;dsnapcon;vclx;webdsnap;adortl;$(DCC_UsePackage)</DCC_UsePackage>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base_Win32)'!=''">
+			<DCC_UsePackage>vcldbx;frx16;TeeDB;Rave100VCL;vclib;Tee;inetdbbde;DBXOdbcDriver;DBXSybaseASEDriver;svnui;vclimg;fmi;intrawebdb_120_160;frxDB16;fs16;vclactnband;FMXTee;TeeUI;vcldb;bindcompvcl;vcldsnap;vclie;vcltouch;Intraweb_120_160;DBXDb2Driver;websnap;vclribbon;VclSmp;fsDB16;frxe16;vcl;DataSnapConnectors;CloudService;DBXMSSQLDriver;CodeSiteExpressPkg;FmxTeeUI;dsnapcon;vclx;webdsnap;svn;bdertl;adortl;$(DCC_UsePackage)</DCC_UsePackage>
+			<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
+			<VerInfo_Locale>1033</VerInfo_Locale>
+			<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_1)'!=''">
+			<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
+			<DCC_Optimize>false</DCC_Optimize>
+			<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
+			<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+			<DCC_RemoteDebug>true</DCC_RemoteDebug>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
+			<DCC_RemoteDebug>false</DCC_RemoteDebug>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_2)'!=''">
+			<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
+			<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
+			<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
+			<DCC_DebugInformation>false</DCC_DebugInformation>
+		</PropertyGroup>
+		<ItemGroup>
+			<DelphiCompile Include="$(MainSource)">
+				<MainSource>MainSource</MainSource>
+			</DelphiCompile>
+			<DCCReference Include="SampleInterfaces.pas"/>
+			<BuildConfiguration Include="Release">
+				<Key>Cfg_2</Key>
+				<CfgParent>Base</CfgParent>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Base">
+				<Key>Base</Key>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Debug">
+				<Key>Cfg_1</Key>
+				<CfgParent>Base</CfgParent>
+			</BuildConfiguration>
+		</ItemGroup>
+		<ProjectExtensions>
+			<Borland.Personality>Delphi.Personality.12</Borland.Personality>
+			<Borland.ProjectType/>
+			<BorlandProject>
+				<Delphi.Personality>
+					<VersionInfo>
+						<VersionInfo Name="IncludeVerInfo">False</VersionInfo>
+						<VersionInfo Name="AutoIncBuild">False</VersionInfo>
+						<VersionInfo Name="MajorVer">1</VersionInfo>
+						<VersionInfo Name="MinorVer">0</VersionInfo>
+						<VersionInfo Name="Release">0</VersionInfo>
+						<VersionInfo Name="Build">0</VersionInfo>
+						<VersionInfo Name="Debug">False</VersionInfo>
+						<VersionInfo Name="PreRelease">False</VersionInfo>
+						<VersionInfo Name="Special">False</VersionInfo>
+						<VersionInfo Name="Private">False</VersionInfo>
+						<VersionInfo Name="DLL">False</VersionInfo>
+						<VersionInfo Name="Locale">1033</VersionInfo>
+						<VersionInfo Name="CodePage">1252</VersionInfo>
+					</VersionInfo>
+					<VersionInfoKeys>
+						<VersionInfoKeys Name="CompanyName"/>
+						<VersionInfoKeys Name="FileDescription"/>
+						<VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="InternalName"/>
+						<VersionInfoKeys Name="LegalCopyright"/>
+						<VersionInfoKeys Name="LegalTrademarks"/>
+						<VersionInfoKeys Name="OriginalFilename"/>
+						<VersionInfoKeys Name="ProductName"/>
+						<VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
+						<VersionInfoKeys Name="Comments"/>
+					</VersionInfoKeys>
+					<Source>
+						<Source Name="MainSource">Step2.dpr</Source>
+					</Source>
+				</Delphi.Personality>
+				<Deployment/>
+				<Platforms>
+					<Platform value="Win64">False</Platform>
+					<Platform value="OSX32">False</Platform>
+					<Platform value="Win32">True</Platform>
+				</Platforms>
+			</BorlandProject>
+			<ProjectFileVersion>12</ProjectFileVersion>
+		</ProjectExtensions>
+		<Import Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')" Project="$(BDS)\Bin\CodeGear.Delphi.Targets"/>
+		<Import Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')" Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj"/>
+	</Project>
Add a comment to this file

Denmark/1 - Interfaces/Code/Step2.res

Binary file added.

Denmark/1 - Interfaces/Code/Step3.dpr

+  program Step3;
+
+{$APPTYPE CONSOLE}
+
+{$R *.res}
+
+uses
+  System.SysUtils,
+  SampleInterfaces in 'SampleInterfaces.pas';
+
+type
+  TBoldText = class(TInterfacedObject, IGetHTML)//, IGetText)
+  private
+    FText: string;
+  public
+    constructor Create(aText: string);
+    function GetText: string;
+    function GetHTML: string;
+  end;
+
+{ TBoldText }
+
+constructor TBoldText.Create(aText: string);
+begin
+  inherited Create;
+  FText := aText;
+end;
+
+function TBoldText.GetHTML: string;
+begin
+  Result := '<b>' + FText + '</b>';
+end;
+
+function TBoldText.GetText: string;
+begin
+  Result := FText;
+end;
+
+var
+  BoldText: IGetText;
+  BoldHTML: IGetHTML;
+
+begin
+  try
+    BoldText := TBoldText.Create('Hello from BoldText');
+    WriteLn(BoldText.GetText);
+
+    BoldHTML := TBoldText.Create('Hello from BoldText');
+    WriteLn(BoldHTML.GetText);
+    WriteLn(BoldHTML.GetHTML);
+
+  except
+    on E: Exception do
+      Writeln(E.ClassName, ': ', E.Message);
+  end;
+  ReadLn;
+end.
+

Denmark/1 - Interfaces/Code/Step3.dproj

+	<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+		<PropertyGroup>
+			<ProjectGuid>{850F0B11-24BA-461D-B172-8DAD1E161E44}</ProjectGuid>
+			<ProjectVersion>13.4</ProjectVersion>
+			<FrameworkType>None</FrameworkType>
+			<MainSource>Step3.dpr</MainSource>
+			<Base>True</Base>
+			<Config Condition="'$(Config)'==''">Debug</Config>
+			<Platform Condition="'$(Platform)'==''">Win32</Platform>
+			<TargetedPlatforms>1</TargetedPlatforms>
+			<AppType>Console</AppType>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win64' and '$(Base)'=='true') or '$(Base_Win64)'!=''">
+			<Base_Win64>true</Base_Win64>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''">
+			<Base_Win32>true</Base_Win32>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+			<Cfg_1>true</Cfg_1>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_1)'=='true') or '$(Cfg_1_Win32)'!=''">
+			<Cfg_1_Win32>true</Cfg_1_Win32>
+			<CfgParent>Cfg_1</CfgParent>
+			<Cfg_1>true</Cfg_1>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+			<Cfg_2>true</Cfg_2>
+			<CfgParent>Base</CfgParent>
+			<Base>true</Base>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base)'!=''">
+			<DCC_UsePackage>bindcompfmx;fmx;rtl;dbrtl;IndySystem;DbxClientDriver;bindcomp;inetdb;DBXInterBaseDriver;DataSnapCommon;DataSnapClient;DataSnapServer;DataSnapProviderClient;xmlrtl;ibxpress;DbxCommonDriver;IndyProtocols;DBXMySQLDriver;dbxcds;soaprtl;bindengine;DBXOracleDriver;CustomIPTransport;dsnap;DBXInformixDriver;fmxase;IndyCore;DBXFirebirdDriver;inet;fmxobj;inetdbxpress;DBXSybaseASADriver;fmxdae;IPIndyImpl;dbexpress;DataSnapIndy10ServerTransport;$(DCC_UsePackage)</DCC_UsePackage>
+			<DCC_Namespace>System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace)</DCC_Namespace>
+			<DCC_DcuOutput>.\$(Platform)\$(Config)</DCC_DcuOutput>
+			<DCC_ExeOutput>.\$(Platform)\$(Config)</DCC_ExeOutput>
+			<DCC_E>false</DCC_E>
+			<DCC_N>false</DCC_N>
+			<DCC_S>false</DCC_S>
+			<DCC_F>false</DCC_F>
+			<DCC_K>false</DCC_K>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base_Win64)'!=''">
+			<DCC_UsePackage>TeeDB;vclib;Tee;DBXOdbcDriver;DBXSybaseASEDriver;vclimg;vclactnband;TeeUI;vcldb;bindcompvcl;vcldsnap;vclie;vcltouch;DBXDb2Driver;websnap;VclSmp;vcl;DataSnapConnectors;DBXMSSQLDriver;dsnapcon;vclx;webdsnap;adortl;$(DCC_UsePackage)</DCC_UsePackage>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Base_Win32)'!=''">
+			<DCC_UsePackage>vcldbx;frx16;TeeDB;Rave100VCL;vclib;Tee;inetdbbde;DBXOdbcDriver;DBXSybaseASEDriver;svnui;vclimg;fmi;intrawebdb_120_160;frxDB16;fs16;vclactnband;FMXTee;TeeUI;vcldb;bindcompvcl;vcldsnap;vclie;vcltouch;Intraweb_120_160;DBXDb2Driver;websnap;vclribbon;VclSmp;fsDB16;frxe16;vcl;DataSnapConnectors;CloudService;DBXMSSQLDriver;CodeSiteExpressPkg;FmxTeeUI;dsnapcon;vclx;webdsnap;svn;bdertl;adortl;$(DCC_UsePackage)</DCC_UsePackage>
+			<DCC_Namespace>Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace>
+			<VerInfo_Locale>1033</VerInfo_Locale>
+			<VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=</VerInfo_Keys>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_1)'!=''">
+			<DCC_Define>DEBUG;$(DCC_Define)</DCC_Define>
+			<DCC_Optimize>false</DCC_Optimize>
+			<DCC_GenerateStackFrames>true</DCC_GenerateStackFrames>
+			<DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+			<DCC_RemoteDebug>true</DCC_RemoteDebug>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_1_Win32)'!=''">
+			<DCC_RemoteDebug>false</DCC_RemoteDebug>
+		</PropertyGroup>
+		<PropertyGroup Condition="'$(Cfg_2)'!=''">
+			<DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols>
+			<DCC_Define>RELEASE;$(DCC_Define)</DCC_Define>
+			<DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo>
+			<DCC_DebugInformation>false</DCC_DebugInformation>
+		</PropertyGroup>
+		<ItemGroup>
+			<DelphiCompile Include="$(MainSource)">
+				<MainSource>MainSource</MainSource>
+			</DelphiCompile>
+			<DCCReference Include="SampleInterfaces.pas"/>
+			<BuildConfiguration Include="Release">
+				<Key>Cfg_2</Key>
+				<CfgParent>Base</CfgParent>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Base">
+				<Key>Base</Key>
+			</BuildConfiguration>
+			<BuildConfiguration Include="Debug">
+				<Key>Cfg_1</Key>