Delphi 1.0 Client/Server が無償公開されたので Windows 10 (64bit)  / 11 にインストールしてみる

# はじめに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7cd11d09-54df-09f3-5cd3-244756f93007.png)

**Delphi 25 周年**記念で、**Delphi 1.0 Client/Server** がアンティークソフトウェアとして無償公開されたのでこれをインストールして試した記事を書きました。

 - [Delphi 1.0 Client/Server が無償公開されたので Windows 7 の XP Mode にインストールしてみる (Qiita)](https://qiita.com/ht_deko/items/e02a7b42ef65baa5d175)

そちらにも書いたのですが、Delphi 1.0 は 16bit アプリケーションなので 64bit Windows にはインストールできません。

# winevdm on 64-bit Windows (OTVDM)
このソフトウェアは **winevdm**（16bit Windows エミュレータ）の 64bit Windows 版です。64bit Windows 上で 16bit Windows アプリケーションを実行する事ができます。

 - [winevdm on 64-bit Windows (GitHub)](https://github.com/otya128/winevdm)

## OTVDM のインストール方法
最新版を以下から持ってきます。

 - [winevdm (AppVeyor: otya128)](https://ci.appveyor.com/project/otya128/winevdm)

 1. [Job name] リストのいずれかをクリック。私は上を選択しました。
 2. [Artifacts] タブを選択。
 3. [File name] にリストされている ZIP をクリックしダウンロード。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/d5006884-3ea1-7b3f-84d6-c5cf91de8fe8.png)

 4. アーカイブを解凍したら名前を `OTVDM` に変更して `C:\` へ移動。つまり `C:\OTVDM` フォルダができる事になります。
 5. `C:\OTVDM` フォルダに移動、`install.inf` を Explorer で右クリックして [インストール]。

これでインストール完了です。

# Delphi 1.0 Client/Server
まずは Delphi 1.0 をダウンロードしてアーカイブを解凍します。解凍した先を `$(SOURCE)` とします。 

 - [Historic Delphi 1 Client/Server Install ISO (Embarcadero)](https://cc.embarcadero.com/item/30911)

`$(SOURCE)\INSTALL` フォルダにある **インストーラは動作しない**ので `$(SOURCE)\RUNIMAGE` フォルダの中身をコピーしてセットアップします。

:::note
2025/01/01 現在 (dev2564)、インストーラは遅いものの**正しく動作する**ようです。日本語版 Delphi もインストール可能です。インストールパスにだけ気を付けてインストールしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/8af44b8d-b7fa-72b5-e15b-13b4b8a5b7c8.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/897a4410-9baf-5b7d-110b-437602754f27.png)

`AUTOEXEC.BAT` への追記はスキップしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/d146f44f-cf60-c615-a3e4-99c1f769406c.png)
:::

## ファイルコピー

 1. フォルダが取っ散らかるので `C:\WIN16` フォルダを作成します。
 2. `$(SOURCE)\RUNIMAGE` フォルダの `WINDOWS` サブフォルダ**以外**を　`C:\WIN16` へコピーします。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/2291ee6c-cb94-e8e2-d779-29b24505a0f2.png)
 3. `$(SOURCE)\RUNIMAGE` フォルダの `WINDOWS` サブフォルダを　`C:\OTVDM` へコピーします (WINDOWS フォルダは既に存在するので上書きする形になります)。

## 環境変数 PATH の設定

Windows の環境変数に `PATH16` を追加します。これが OTVDM で参照されるパスとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/a8e1588b-25ea-6a8a-6f2a-738e3ec8263e.png)

システム環境変数の変更を行う `[システムのプロパティ | 詳細設定]` は `[ファイル名を指定して実行]` (〔Win〕+〔R〕) から `SystemPropertiesAdvanced` で開けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/3b30888f-7b69-a5ef-3cdc-e3d1f3b5057f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/a817ebaf-cf10-8be9-e0ab-8d6b658d2fb0.png)

環境変数 `PATH16` の値は `C:\;C:\WINDOWS;C:\WIN16\IBLOCAL\BIN;C:\WIN16\IDAPI;` です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/5ee80b69-c1ea-1175-701e-1ed331950542.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/46bae086-5cef-0652-70cf-86009ae89bf7.png)

## 環境設定ファイルの作成

`C:\OTVDM\WINDOWS` に 9 つのファイルを作成します。

```ini:DELPHI.INI
[Library]
SearchPath=C:\WIN16\DELPHI\LIB
ComponentLibrary=C:\WIN16\DELPHI\BIN\COMPLIB.DCL
[Gallery]
BaseDir=C:\WIN16\DELPHI\GALLERY
[Experts]
ExptDemo=C:\WIN16\DELPHI\BIN\EXPTDEMO.DLL
[ReportSmith]
ExePath=C:\WIN16\RPTSMITH
[Transfer]
Count=4
Title0=ReportSmith
Path0=RPTSMITH.EXE
WorkingDir0=C:\WIN16\RPTSMITH
Params0=
Title1=Image Editor
Path1=IMAGEDIT.EXE
WorkingDir1=
Params1=
Title2=Database Desktop
Path2=DBD.EXE
WorkingDir2=C:\WIN16\DBD
Params2=
Title3=BDE Config
Path3=BDECFG.EXE
WorkingDir3=C:\WIN16\IDAPI
Params3=
[Session]
Project=
```

```ini:ODBC.INI
[ODBC Data Sources]
InterBase=Borland Interbase
RS_Btrieve=Btrieve Data (file.ddf)
RS_MS_Access=Access Data (*.mdb)
RS_dBASE=dBase Files (*.dbf)
RS_Excel=Excel Files (*.xls)
RS_FoxPro=FoxPro Files (*.dbf)
RS_Paradox=Q+E ParadoxFile
RS_Text=Text Files (*.txt; *.csv)
[InterBase]
Driver=C:\WINDOWS\SYSTEM\BLINT04.DLL
Workarounds=29
[RS_Btrieve]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
FileType=Btrieve
SingleUser=False
[RS_MS_Access]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
FileType=RedISAM
SingleUser=False
UseSystemDB=False
[RS_dBASE]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
FileType=dBase4
SingleUser=False
DataDirectory=C:\WIN16\RPTSMITH\video
[RS_Excel]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
FileType=Excel
MaxScanRows=200
[RS_FoxPro]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
FileType=FoxPro 2.5
SingleUser=False
DataDirectory=C:\WIN16\RPTSMITH\video
[RS_Paradox]
Driver=C:\WINDOWS\SYSTEM\BIPDX04.DLL
TableVersion=4
SortOrder=ASCII
ReadConsistency=0
LockReadBlob=0
IntlSort=0
Database=C:\WIN16\RPTSMITH\video
[RS_Text]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
FileType=Text
ColNameHeader=False
Format=CSVDelimited
MaxScanRows=25
CharacterSet=OEM
```

```ini:ODBCINST.INI
[ODBC Drivers]
Borland InterBase=Installed
dBase Files (*.dbf)=Installed
Text Files (*.txt; *.csv)=Installed
Q+E ParadoxFile=Installed
Excel Files (*.xls)=Installed
FoxPro Files (*.dbf)=Installed
Btrieve Files (file.ddf)=Installed
Btrieve Data (file.ddf)=Installed
Access Files (*.mdb)=Installed
Access Data (*.mdb)=Installed
[Borland InterBase]
Driver=C:\WINDOWS\SYSTEM\BLINT04.DLL
Setup=C:\WINDOWS\SYSTEM\BLINT04.DLL
[dBase Files (*.dbf)]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
Setup=C:\WINDOWS\SYSTEM\SIMADMIN.DLL
[Text Files (*.txt; *.csv)]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
Setup=C:\WINDOWS\SYSTEM\SIMADMIN.DLL
[Q+E ParadoxFile]
Driver=C:\WINDOWS\SYSTEM\BIPDX04.DLL
Setup=C:\WINDOWS\SYSTEM\BIPDX04.DLL
[Excel Files (*.xls)]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
Setup=C:\WINDOWS\SYSTEM\SIMADMIN.DLL
[FoxPro Files (*.dbf)]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
Setup=C:\WINDOWS\SYSTEM\SIMADMIN.DLL
[Btrieve Files (file.ddf)]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
Setup=C:\WINDOWS\SYSTEM\SIMADMIN.DLL
[Btrieve Data (file.ddf)]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
Setup=C:\WINDOWS\SYSTEM\SIMADMIN.DLL
[Access Files (*.mdb)]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
Setup=C:\WINDOWS\SYSTEM\SIMADMIN.DLL
[Access Data (*.mdb)]
Driver=C:\WINDOWS\SYSTEM\SIMBA.DLL
Setup=C:\WINDOWS\SYSTEM\SIMADMIN.DLL
```

```ini:ODBCISAM.INI
[Installable ISAMS]
RedISAM=red110.dll
Btrieve=btrv110.dll
dBase4=xbs110.dll
FoxPro 2.5=xbs110.dll
Excel=xlsisam.dll
Text=txtisam.dll
[Red ISAM]
MaxBufferSize=512
NetworkAccess=On
PageTimeout=600
[Btrieve ISAM]
CollatingSequence=ASCII
NetworkAccess=On
PageTimeout=600
[dBase ISAM]
CollatingSequence=ASCII
Deleted=On
Statistics=Truth
NetworkAccess=On
PageTimeout=600
```

```ini:RPTSMITH.INI
[ReportSmith]
ReportOpenLastUsedDirectory=C:\WIN16\RPTSMITH\video
X=66
Y=87
Width=960
Height=787
Style=0
[OptionsSection]
StartupTask=0
NewTask=0
FontEnumMode=2
[MACRO]
MacroPath=C:\WIN16\RPTSMITH\macros
BinaryPath=C:\WIN16\RPTSMITH\macros
```

```ini:RS_RUN.INI
[OptionsSection]
StartupTask=2
NewTask=0
FontEnumMode=2
[MACRO]
MacroPath=C:\WIN16\RS_RUN\macros
BinaryPath=C:\WIN16\RS_RUN\macros
[RS_Runtime]
ExePath=C:\WIN16\RS_RUN
```

```ini:RS_SQLIF.INI
[dBase Files (*.dbf)]
IsLocal=1
CountStarSupport=1
OpListType=1
OpGrpDCount=4
OpGrpWCount=1
OpGrp1Title="Comparison operators:"
OpGrp1Count=2
OpGrp1Item1Disp="x IN (a, b, c, ...)"
OpGrp1Item1Text=" IN (\r) \n"
OpGrp1Item2Disp="x NOT IN (a, b, c, ...)"
OpGrp1Item2Text=" NOT IN (\r) \n"
OpGrp2Title="Patterns, ranges and lists:"
OpGrp2Count=2
OpGrp2Item1Disp="x BETWEEN y AND z"
OpGrp2Item1Text=" BETWEEN \n AND "
OpGrp2Item2Disp="x NOT BETWEEN y AND z"
OpGrp2Item2Text=" NOT BETWEEN \n AND "
OpGrp3Title="Constants:"
OpGrp3Count=1
OpGrp3Item1Disp="'YYYY-MM-DD' - date"
OpGrp3Item1Text=" '\n' "
OpGrp4Title="Summary functions:"
OpGrp4Count=6
OpGrp4Item1Disp="AVG(col) - Average of column or column expression"
OpGrp4Item1Text=" AVG(\r) \n"
OpGrp4Item2Disp="COUNT(*) - Count of rows"
OpGrp4Item2Text=" COUNT(*) \n"
OpGrp4Item3Disp="COUNT(col) - Count of rows"
OpGrp4Item3Text=" COUNT(\r) \n"
OpGrp4Item4Disp="MAX(col) - Maximum value of column or column expression"
OpGrp4Item4Text=" MAX(\r) \n"
OpGrp4Item5Disp="MIN(col) - Minimum value of column or column expression"
OpGrp4Item5Text=" MIN(\r) \n"
OpGrp4Item6Disp="SUM(col) - Sum of column or column expression"
OpGrp4Item6Text=" SUM(\r) \n"
OpGrp5Title="SQL statement keywords:"
OpGrp5Count=2
OpGrp5Item1Disp="GROUP BY colexp1, colexp2... - Group and summarize results"
OpGrp5Item1Text=" GROUP BY \n"
OpGrp5Item2Disp="HAVING expr - Additional selection criteria for groups"
OpGrp5Item2Text=" HAVING \n"
;FnListType=1
FnGrpCount=1
FnGrp1Count=1
FnGrp1Title="String functions:"
FnGrp1Item1Disp="CONVERT(col,data type) - Conversion of column into specified data type"
FnGrp1Item1Text=" {fn CONVERT(\r,\n)}"

[Btrieve Data (file.ddf)]
IsLocal=1
CountStarSupport=1
OpListType=1
OpGrpDCount=3
OpGrpWCount=2
OpGrp1Title="Comparison operators:"
OpGrp1Count=2
OpGrp1Item1Disp="x IN (a, b, c, ...)"
OpGrp1Item1Text=" IN (\r) \n"
OpGrp1Item2Disp="x NOT IN (a, b, c, ...)"
OpGrp1Item2Text=" NOT IN (\r) \n"
OpGrp2Title="Patterns, ranges and lists:"
OpGrp2Count=2
OpGrp2Item1Disp="x BETWEEN y AND z"
OpGrp2Item1Text=" BETWEEN \n AND "
OpGrp2Item2Disp="x NOT BETWEEN y AND z"
OpGrp2Item2Text=" NOT BETWEEN \n AND "
OpGrp3Title="Constants:"
OpGrp3Count=1
OpGrp3Item1Disp="'YYYY-MM-DD' - date"
OpGrp3Item1Text=" '\n' "
OpGrp4Title="SQL statement keywords:"
OpGrp4Count=2
OpGrp4Item1Disp="GROUP BY colexp1, colexp2... - Group and summarize results"
OpGrp4Item1Text=" GROUP BY \n"
OpGrp4Item2Disp="HAVING expr - Additional selection criteria for groups"
OpGrp4Item2Text=" HAVING \n"
OpGrp5Title="Summary functions:"
OpGrp5Count=6
OpGrp5Item1Disp="AVG(col) - Average of column or column expression"
OpGrp5Item1Text=" AVG(\r) \n"
OpGrp5Item2Disp="COUNT(*) - Count of rows"
OpGrp5Item2Text=" COUNT(*) \n"
OpGrp5Item3Disp="COUNT(col) - Count of rows"
OpGrp5Item3Text=" COUNT(\r) \n"
OpGrp5Item4Disp="MAX(col) - Maximum value of column or column expression"
OpGrp5Item4Text=" MAX(\r) \n"
OpGrp5Item5Disp="MIN(col) - Minimum value of column or column expression"
OpGrp5Item5Text=" MIN(\r) \n"
OpGrp5Item6Disp="SUM(col) - Sum of column or column expression"
OpGrp5Item6Text=" SUM(\r) \n"
;FnListType=1
FnGrpCount=1
FnGrp1Count=1
FnGrp1Title="String functions:"
FnGrp1Item1Disp="CONVERT(col,data type) - Conversion of column into specified data type"
FnGrp1Item1Text=" {fn CONVERT(\r,\n)}"

[Excel Files (*.xls)]
IsLocal=1
CountStarSupport=1
OpListType=1
OpGrpDCount=3
OpGrpWCount=2
OpGrp1Title="Comparison operators:"
OpGrp1Count=2
OpGrp1Item1Disp="x IN (a, b, c, ...)"
OpGrp1Item1Text=" IN (\r) \n"
OpGrp1Item2Disp="x NOT IN (a, b, c, ...)"
OpGrp1Item2Text=" NOT IN (\r) \n"
OpGrp2Title="Patterns, ranges and lists:"
OpGrp2Count=2
OpGrp2Item1Disp="x BETWEEN y AND z"
OpGrp2Item1Text=" BETWEEN \n AND "
OpGrp2Item2Disp="x NOT BETWEEN y AND z"
OpGrp2Item2Text=" NOT BETWEEN \n AND "
OpGrp3Title="Constants:"
OpGrp3Count=1
OpGrp3Item1Disp="'YYYY-MM-DD' - date"
OpGrp3Item1Text=" '\n' "
OpGrp4Title="SQL statement keywords:"
OpGrp4Count=2
OpGrp4Item1Disp="GROUP BY colexp1, colexp2... - Group and summarize results"
OpGrp4Item1Text=" GROUP BY \n"
OpGrp4Item2Disp="HAVING expr - Additional selection criteria for groups"
OpGrp4Item2Text=" HAVING \n"
OpGrp5Title="Summary functions:"
OpGrp5Count=6
OpGrp5Item1Disp="AVG(col) - Average of column or column expression"
OpGrp5Item1Text=" AVG(\r) \n"
OpGrp5Item2Disp="COUNT(*) - Count of rows"
OpGrp5Item2Text=" COUNT(*) \n"
OpGrp5Item3Disp="COUNT(col) - Count of rows"
OpGrp5Item3Text=" COUNT(\r) \n"
OpGrp5Item4Disp="MAX(col) - Maximum value of column or column expression"
OpGrp5Item4Text=" MAX(\r) \n"
OpGrp5Item5Disp="MIN(col) - Minimum value of column or column expression"
OpGrp5Item5Text=" MIN(\r) \n"
OpGrp5Item6Disp="SUM(col) - Sum of column or column expression"
OpGrp5Item6Text=" SUM(\r) \n"
;FnListType=1
FnGrpCount=1
FnGrp1Count=1
FnGrp1Title="String functions:"
FnGrp1Item1Disp="CONVERT(col,data type) - Conversion of column into specified data type"
FnGrp1Item1Text=" {fn CONVERT(\r,\n)}"

[Paradox Files (*.db )]
IsLocal=1
CountStarSupport=1
SQLExecReturnsQualifiedNames=0
OpListType=1
OpGrpDCount=3
OpGrpWCount=2
OpGrp1Title="Comparison operators:"
OpGrp1Count=2
OpGrp1Item1Disp="x IN (a, b, c, ...)"
OpGrp1Item1Text=" IN (\r) \n"
OpGrp1Item2Disp="x NOT IN (a, b, c, ...)"
OpGrp1Item2Text=" NOT IN (\r) \n"
OpGrp2Title="Patterns, ranges and lists:"
OpGrp2Count=2
OpGrp2Item1Disp="x BETWEEN y AND z"
OpGrp2Item1Text=" BETWEEN \n AND "
OpGrp2Item2Disp="x NOT BETWEEN y AND z"
OpGrp2Item2Text=" NOT BETWEEN \n AND "
OpGrp3Title="Constants:"
OpGrp3Count=1
OpGrp3Item1Disp="'YYYY-MM-DD' - date"
OpGrp3Item1Text=" '\n' "
OpGrp4Title="SQL statement keywords:"
OpGrp4Count=2
OpGrp4Item1Disp="GROUP BY colexp1, colexp2... - Group and summarize results"
OpGrp4Item1Text=" GROUP BY \n"
OpGrp4Item2Disp="HAVING expr - Additional selection criteria for groups"
OpGrp4Item2Text=" HAVING \n"
OpGrp5Title="Summary functions:"
OpGrp5Count=6
OpGrp5Item1Disp="AVG(col) - Average of column or column expression"
OpGrp5Item1Text=" AVG(\r) \n"
OpGrp5Item2Disp="COUNT(*) - Count of rows"
OpGrp5Item2Text=" COUNT(*) \n"
OpGrp5Item3Disp="COUNT(col) - Count of rows"
OpGrp5Item3Text=" COUNT(\r) \n"
OpGrp5Item4Disp="MAX(col) - Maximum value of column or column expression"
OpGrp5Item4Text=" MAX(\r) \n"
OpGrp5Item5Disp="MIN(col) - Minimum value of column or column expression"
OpGrp5Item5Text=" MIN(\r) \n"
OpGrp5Item6Disp="SUM(col) - Sum of column or column expression"
OpGrp5Item6Text=" SUM(\r) \n"
;FnListType=1
FnGrpCount=1
FnGrp1Count=1
FnGrp1Title="String functions:"
FnGrp1Item1Disp="CONVERT(col,data type) - Conversion of column into specified data type"
FnGrp1Item1Text=" {fn CONVERT(\r,\n)}"

[FoxPro Files (*.dbf)]
IsLocal=1
CountStarSupport=1
OpListType=1
OpGrpDCount=3
OpGrpWCount=2
OpGrp1Title="Comparison operators:"
OpGrp1Count=2
OpGrp1Item1Disp="x IN (a, b, c, ...)"
OpGrp1Item1Text=" IN (\r) \n"
OpGrp1Item2Disp="x NOT IN (a, b, c, ...)"
OpGrp1Item2Text=" NOT IN (\r) \n"
OpGrp2Title="Patterns, ranges and lists:"
OpGrp2Count=2
OpGrp2Item1Disp="x BETWEEN y AND z"
OpGrp2Item1Text=" BETWEEN \n AND "
OpGrp2Item2Disp="x NOT BETWEEN y AND z"
OpGrp2Item2Text=" NOT BETWEEN \n AND "
OpGrp3Title="Constants:"
OpGrp3Count=1
OpGrp3Item1Disp="'YYYY-MM-DD' - date"
OpGrp3Item1Text=" '\n' "
OpGrp4Title="SQL statement keywords:"
OpGrp4Count=2
OpGrp4Item1Disp="GROUP BY colexp1, colexp2... - Group and summarize results"
OpGrp4Item1Text=" GROUP BY \n"
OpGrp4Item2Disp="HAVING expr - Additional selection criteria for groups"
OpGrp4Item2Text=" HAVING \n"
OpGrp5Title="Summary functions:"
OpGrp5Count=6
OpGrp5Item1Disp="AVG(col) - Average of column or column expression"
OpGrp5Item1Text=" AVG(\r) \n"
OpGrp5Item2Disp="COUNT(*) - Count of rows"
OpGrp5Item2Text=" COUNT(*) \n"
OpGrp5Item3Disp="COUNT(col) - Count of rows"
OpGrp5Item3Text=" COUNT(\r) \n"
OpGrp5Item4Disp="MAX(col) - Maximum value of column or column expression"
OpGrp5Item4Text=" MAX(\r) \n"
OpGrp5Item5Disp="MIN(col) - Minimum value of column or column expression"
OpGrp5Item5Text=" MIN(\r) \n"
OpGrp5Item6Disp="SUM(col) - Sum of column or column expression"
OpGrp5Item6Text=" SUM(\r) \n"
;FnListType=1
FnGrpCount=1
FnGrp1Count=1
FnGrp1Title="String functions:"
FnGrp1Item1Disp="CONVERT(col,data type) - Conversion of column into specified data type"
FnGrp1Item1Text=" {fn CONVERT(\r,\n)}"

[WATCOM SQL]
FnListType=2
CountStarSupport=1
QuoteODBCOuterJoin=1
QuoteAlias=1

[ShowCase ODBC]
FnListType=2
CountStarSupport=1

[ShowCase ODBC - VISTA]
FnListType=2
CountStarSupport=1

[ShowCase ODBC - ReadOnly]
FnListType=2
CountStarSupport=1

[Q+E ParadoxFile]
IsLocal=1
CountStarSupport=1
SQLExecReturnsQualifiedNames=0
QuoteFromList=0
OuterJoinSyntax=1
OuterJoinText="*"
OuterJoinSupport="LRM"
QuoteAlias=1

[RDS]
HasOwners=0
CountStarSupport=1
OuterJoinSyntax=1
OuterJoinSupport="LR"
OuterJoinText="*"
;DBInFullColumnName=0
;SortExprSupport=0
;DateFormat=""date '"yyyy-mm-dd"'""
;TimeFormat=""time '"hh:mm:ss"'""

[Velocis Standalone]
HasOwners=0
CountStarSupport=1

[Velocis]
HasOwners=0
CountStarSupport=1

[Lotus Notes]
CountStarSupport=1
SQLExecReturnsQualifiedNames=0
TableTypes=

[Microsoft Btrieve Driver (file.ddf)]
QuoteFromList=0
IsLocal=1
HasDatabases=0
IDQuote=

[Microsoft Dbase Driver (*.dbf)]
IDQuote=

[Microsoft Excel Driver (*.xls)]
IDQuote=

[Microsoft FoxPro Driver (*.dbf)]
IDQuote=

[Microsoft Text Driver (*.txt; *.csv)]
QuoteFromList=0
IDQuote=

[Microsoft Access Driver (*.mdb)]
QuoteFromList=0
HasDatabases=0

[Microsoft Paradox Driver (*.db )]
QuoteFromList=0
SQLExecReturnsQualifiedNames=0
IDQuote=

[Microsoft Btrieve Driver (file.ddf) (32 bit)]
QuoteFromList=0
IsLocal=1
HasDatabases=0
IDQuote=

[Microsoft dBase Driver (*.dbf) (32 bit)]
IDQuote=

[Microsoft Excel Driver (*.xls) (32 bit)]
IDQuote=

[Microsoft FoxPro Driver (*.dbf) (32 bit)]
IDQuote=

[Microsoft Text Driver (*.txt; *.csv) (32 bit)]
QuoteFromList=0
IDQuote=

[Microsoft Access Driver (*.mdb) (32 bit)]
QuoteFromList=0
HasDatabases=0

[Microsoft Paradox Driver (*.db ) (32 bit)]
QuoteFromList=0
SQLExecReturnsQualifiedNames=0
IDQuote=
```

```ini:WINHELP.INI
[Files]
DELPHI.HLP=C:\WIN16\DELPHI\BIN
WINAPI.HLP=C:\WIN16\DELPHI\BIN
CWG.HLP=C:\WIN16\DELPHI\BIN
CWH.HLP=C:\WIN16\DELPHI\BIN
LOCALSQL.HLP=C:\WIN16\DELPHI\BIN
VQB.HLP=C:\WIN16\DELPHI\BIN
SQLREF.HLP=C:\WIN16\IBLOCAL\BIN
WISQL.HLP=C:\WIN16\IBLOCAL\BIN
BDECFG.HLP=C:\WIN16\IDAPI
RPTSMITH.HLP=C:\WIN16\RPTSMITH
RS_DD.HLP=C:\WIN16\RPTSMITH
SBL.HLP=C:\WIN16\RPTSMITH
RS_RUN.HLP=C:\WIN16\RPTSMITH
DBD.HLP=C:\WIN16\DBD
```

```ini:MULTIHLP.INI
[Index Path]
DELPHI.HLP=C:\WIN16\DELPHI\BIN
WINAPI.HLP=C:\WIN16\DELPHI\BIN
CWG.HLP=C:\WIN16\DELPHI\BIN
CWH.HLP=C:\WIN16\DELPHI\BIN
LOCALSQL.HLP=C:\WIN16\DELPHI\BIN
VQB.HLP=C:\WIN16\DELPHI\BIN
SQLREF.HLP=C:\WIN16\IBLOCAL\BIN
WISQL.HLP=C:\WIN16\IBLOCAL\BIN
BDECFG.HLP=C:\WIN16\IDAPI
RPTSMITH.HLP=C:\WIN16\RPTSMITH
RS_DD.HLP=C:\WIN16\RPTSMITH
SBL.HLP=C:\WIN16\RPTSMITH
RS_RUN.HLP=C:\WIN16\RPTSMITH
DBD.HLP=C:\WIN16\DBD
```

※ 設定はすべてデフォルトインストール時のものです (パス以外)。設定を変更したい場合には、VM の XP 等に Delphi 1.0 をインストールして、自分で環境設定ファイルを持ってくる必要があります。

## Windows 環境設定ファイルの編集

`C:\OTVDM\WINDOWS\WIN.INI` をテキストエディタで開き、以下を追記します（WIN.INI は空かもしれません）。

```ini:WIN.INI
[IDAPI]
DLLPATH=C:\WIN16\IDAPI
CONFIGFILE01=C:\WIN16\IDAPI\IDAPI.CFG
[Borland Language Drivers]
LDPath=C:\WIN16\IDAPI\LANGDRV
[BWCC]
BitmapLibrary=BWCC.DLL
[Interbase]
RootDirectory=C:\WIN16\IBLOCAL
[Paradox Engine]
UserName=PxEngine
NetNamePath=C:\WIN16
MaxTables=64
RecBufs=64
MaxLocks=64
MaxFiles=64
SwapSize=64
[DDE Servers]
DBD=C:\WIN16\DBD\DBD
[DBD]
WORKDIR=C:\WIN16\DBD
PRIVDIR=C:\WIN16\DBD\DBDPRIV
```

ここまでの作業を図にするとこうなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/d122a00e-9dd6-dd3a-c99c-66ff447c391f.png)

# 実行
Explorer で `C:\WIN16\DELPHI\BIN` を開き、`DELPHI.EXE` をダブルクリックすると **Delphi 1.0 Client/Server** が起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/676bed07-045e-4999-c3c3-d03672d6a19d.png)

DB 系のデモを読み込むためには `C:\WIN16\IDAPI` にある `BDECFG.EXE` を実行し、[Aliasses] タブの `DBDEMOS` と `IBLOCAL` のパスを正しいものにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f999067a-4ee1-4b96-c2b2-bb779be93a7d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/549e250c-8113-0b4f-1990-abe97f82aa69.png)

| Alias | Item | Value |
|:--|:--|:--|
| DBDEMOS  |PATH | C:\WIN16\DELPHI\DEMOS\DATA |
| IBLOCAL |SERVER NAME|  C:\WIN16\IBLOCAL\EXAMPLES\EMPLOYEE.GDB |

[Drivers] タブの `PARADOX` も書き換えておいたほうがいいでしょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/fc9fbc2f-dbb6-6026-c151-79046d656902.png)

| Driver Name | Item | Value |
|:--|:--|:--|
| PARADOX |NET DIR | C:\WIN16 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b7eaf582-449a-dd4a-ccf6-365ba4dc262e.png)

~~てゆーか、**当方の環境だとコンパイルすると落ちますね。**~~ dev1650 で落ちなくなりました (^o^)/

## DOSBox(-X) との併用
プロジェクトを **DOSBox** 上のコマンドラインコンパイラ (dcc.exe) でコンパイルし、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/192656db-695e-1238-cc15-aae79ef5be9c.png)

生成された EXE (16bit Windows アプリケーション) を (OTVDM で) 実行する事もできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/9b9d842a-19f9-4b85-77d1-8ff72127bbd3.png)

**See also:**

 - [DOSBox](https://www.dosbox.com/)
 - [DOSBox-X (GitHub)](https://github.com/joncampbell123/dosbox-x/releases)

## DCC.EXE (コマンドラインコンパイラ)
コマンドラインコンパイラ (DCC.EXE) は MS-DOS アプリケーションなので、**DOSBox(-X)** や **MS-DOS Player** で動作します。

コマンドラインコンパイラ を動作させるために最低限必要なのは、`$(SOURCE)\RUNIMAGE` の `LIB` フォルダ全部と、`BIN` フォルダの次のファイルです。

 - DCC.CFG
 - DCC.EXE
 - DELPHI.DMT
 - DELPHI.DSL
 - DLIB.EXE
 - DPMI16BI.OVL
 - RTM.EXE

`DCC.CFG` は、コマンドラインコンパイラ用の環境設定ファイルです。パスを次のように書き換える必要があります。

```DCC.CFG
/m
/cw
/rC:\WIN16\DELPHI\LIB
/uC:\WIN16\DELPHI\LIB
/iC:\WIN16\DELPHI\LIB
```

DCC.EXE を使ってコンパイルするには、引数にプロジェクトファイルを指定します。

```
DCC プロジェクトファイル
```

プロジェクトが単一のファイル (*.DPR のみ) で構成される場合には普通にコンパイルできますが、他にユニットが存在する場合にはプロジェクトファイルのある場所へカレントディレクトリを移動する必要があります。

```
CD プロジェクトファイルのあるディレクトリ
DCC プロジェクトファイル
```

生成された実行ファイルは Win16 アプリケーションなので、**OTVDM** をインストールしているか、16bit/32bit Windows 環境でないと実行できません。

# おわりに
Delphi 1.0 C/S をちゃんと試したいのなら、VM の XP とかで動作させる事をオススメします。

ただ、やりようによっては 64bit の Windows 10 (や Windows 11) で 16bit 版 Delphi を動かせるってのはちょっと魅力的ですね。他の 16bit Windows アプリも動かせますし、古い WinHelp も読めます。

**See also:**

 - [Delphi Configuration Files (Embarcadero Blogs)](https://community.idera.com/developer-tools/b/blog/posts/delphi-configuration-files)
 - [Turbo Pascal 1.0 を Windows 10 (64bit) / 11 にインストールしてみる (Qiita)](https://qiita.com/ht_deko/items/54cefe48e729742e818d#-turbo-pascal-302) 
 - [Turbo Pascal 3.02 を Windows 10 (64bit) / 11 にインストールしてみる (Qiita)](https://qiita.com/ht_deko/items/54cefe48e729742e818d#-turbo-pascal-302) 
 - [Turbo Pascal 5.5 を Windows 10 (64bit) / 11 にインストールしてみる (Qiita)](https://qiita.com/ht_deko/items/eb35e0480559f893a9b8) 
 - [Turbo C 2.01 を Windows 10 (64bit) / 11 にインストールしてみる (Qiita)](https://qiita.com/ht_deko/items/100bb258e4480aa7bdf3) 
 - [Turbo C++ 1.01 を Windows 10 (64bit) / 11 にインストールしてみる (Qiita)](https://qiita.com/ht_deko/items/7a0e5d84d258c3b1a795) 
 - [C++Builder 1.0 Client/Server を Windows 10 (64bit) / 11 にインストールしてみる (Qiita)](https://qiita.com/ht_deko/items/40b67a7572b1110bff69)