Delphi 2007をインストールします。
メディアはDVD1枚になっています。DVDをドライブに入れ、AutoRunが起動すると下図のダイアログが表示されます。
Delphi 2007 for Win32のインストールをクリックします。言語を選択するダイアログが表示されます。デフォルトで選択されているJapaneseを選択してOKを押します。
使用許諾に同意します。
使用者名とライセンスキーを入力します。
インストールオプションを選択します。デフォルトではすべてインストールされるようになっていますので、そのまま次に進みます。
インストールオプションは下図のとおりです。
インストールするフォルダを選択します。デフォルトでは c:\Program files\CodeGear\RAD Studio\5.0にインストールされます。
拡張子の関連付けの設定です。デフォルトではすべて選択されています。このまま次に進みます。
スタートメニューの設定です。スタートメニューの名前もデフォルトのまま利用するのでこのまま次に進みます。
[インストールする準備ができました]画面が表示されます。インストールの準備が完了しました。
インストールが開始されます。
ヘルプファイルのマージなどもインストール中に実行されます。
インストールが完了すると下図の画面が表示されます。
Delphi 2007はソフトウェア保守などで新しいOS環境にインストールする場合もあるため、Windows 10 32ビット 版へのインストール手順も紹介します。
64ビットOSでも動作しますが、Delphi 2007は32ビットコンパイラのため、32ビット版のOSにインストールしたほうが良いです。
2023年時点では、Windows 10 22H2 32ビット版が最新の32ビット版Windowsとなるため、こちらのマシンを準備します。
今回は、Hyper-Vの仮想マシンを準備しています。Windows 10 32ビット版のインストールはこちらの記事を参照してください。
インストールした32ビット版の Windows 10 に.NET Framewrok 2.0をインストールします。
インストールの手順はこちらの記事を参照してください。
インストールしない場合下図のセットアップエラーが発生するため、あらかじめインストールしておきます。
インストールメディアを開きます。
インストールメディアの自動起動を選択するか、メディアのルートディレクトリのInstall.exeを実行します。
下図のウィンドウが表示されます。[Delphi 2007 for Win32 のインストール]のタイルをクリックします。
[Select Setup Language]ダイアログが表示されます。[Japanese]を選択し[OK]ボタンをクリックします。
[RAD Studio に必要なソフトウェア]の一覧が表示されます。[次へ]ボタンをクリックします。
セットアップが始まります。
「InstallAwareウィザードへようこそ」画面が表示されます。[次へ]ボタンをクリックします。
使用許諾契約の同意画面が表示されます。
契約文面の下部の[使用許諾契約に同意する]のチェックをクリックしてチェックをつけます。チェック後[次へ]ボタンをクリックします。
[製品登録]画面が表示されます。ユーザー名、会社名、プロダクトライセンスキーを入力します。入力後[次へ]ボタンをクリックします。
[機能の選択]画面が表示されます。今回はデフォルトのままとします。[次へ]ボタンをクリックします。
[インスト-ル先フォルダ]の画面が表示されます。今回はデフォルトのままとします。[次へ]ボタンをクリックします。
[ファイル関連付け更新]画面が表示されます。こちらもデフォルトのままとします。[次へ]ボタンをクリックします。
[ [スタート]メニュー ]画面が表示されます。こちらもデフォルトのままとします。[次へ]ボタンをクリックします。
[インストールする準備ができました]画面が表示されます。[次へ]ボタンをクリックします。
インストールが始まります。
オンラインドキュメンテーションのファイルのインストールも実行されます。
インストールが完了すると下図の画面が表示されます。[完了]ボタンをクリックしインストーラーを終了します。
Delphi 2007には複数のアップデートが提供されていますので、インストールをします。
Update 3をインストールします。Update 1,2の内容を含んでいるため、Update3をインストールすればUpdate1,2は適用されるようです。
Update 3を展開したディレクトリのSetup.exeを実行してインストールします。
June 08 Linker Hotfix for CodeGear RAD Studio 2007 をインストールします。ZIPファイルを展開し、ilink32.exe を
デフォルトのインストール先の場合は、C:\Program Files\CodeGear\RAD Studio\5.0\bin
にコピーしてilink32.exeを上書きします。
CodeGear RAD Studio 2007 December updateをインストールします。
April 08 Hotfix for CodeGear RAD Studio 2007 をインストールします。
GIF and JPG source files for CodeGear RAD Studio 2007をインストールします。
ZIPファイルを展開し、展開されたファイルをC:\Program Files\CodeGear\RAD Studio\5.0\source
に配置します。
CodeGear RAD Studio May08 Help update (Help Update 4)をインストールします。ファイルを展開しHelp_Setup.exe を実行します。
以下のコードを修正します。
C:\Program Files\CodeGear\RAD Studio\5.0\source\Win32\vcl\Graphics.pas
を別のフォルダにコピーしたのち開きます。
以下のコードを修正したのち、C:\Program Files\CodeGear\RAD Studio\5.0\source\Win32\vcl\Graphics.pas
に上書きします。
変更箇所は以下の3カ所となります。
function PaletteFromDIBColorTable(DIBHandle: THandle; ColorTable: Pointer;
ColorCount: Integer): HPalette;
var
DC: HDC;
Save: THandle;
Pal: TMaxLogPalette;
begin
Result := 0;
Pal.palVersion := $300;
if DIBHandle <> 0 then
begin
DC := CreateCompatibleDC(0);
Save := SelectObject(DC, DIBHandle);
Pal.palNumEntries := GetDIBColorTable(DC, 0, 256, Pal.palPalEntry);
SelectObject(DC, Save);
DeleteDC(DC);
end
else
begin
Pal.palNumEntries := ColorCount;
Move(ColorTable^, Pal.palPalEntry, ColorCount * 4);
end;
if Pal.palNumEntries = 0 then Exit;
if (Pal.palNumEntries <> 16) or not SystemPaletteOverride(Pal) then
ByteSwapColors(Pal.palPalEntry, Pal.palNumEntries);
Result := CreatePalette(PLogPalette(@Pal)^);
end;
function PaletteFromDIBColorTable(DIBHandle: THandle; ColorTable: Pointer;
ColorCount: Integer): HPalette;
var
DC: HDC;
Save: THandle;
Pal: TMaxLogPalette;
begin
Result := 0;
Pal.palVersion := $300;
if DIBHandle <> 0 then
begin
DC := CreateCompatibleDC(0);
Save := SelectObject(DC, DIBHandle);
Pal.palNumEntries := GetDIBColorTable(DC, 0, 256, Pal.palPalEntry);
SelectObject(DC, Save);
DeleteDC(DC);
end
else
begin
if ColorCount > 256 then //追加
InvalidGraphic({$IFNDEF CLR}@{$ENDIF}SInvalidBitmap); //追加
Pal.palNumEntries := ColorCount;
Move(ColorTable^, Pal.palPalEntry, ColorCount * 4);
end;
if Pal.palNumEntries = 0 then Exit;
if (Pal.palNumEntries <> 16) or not SystemPaletteOverride(Pal) then
ByteSwapColors(Pal.palPalEntry, Pal.palNumEntries);
Result := CreatePalette(PLogPalette(@Pal)^);
end;
procedure TMetafile.ReadEMFStream(Stream: TStream);
var
EnhHeader: TEnhMetaheader;
Buf: PChar;
begin
NewImage;
Stream.ReadBuffer(EnhHeader, Sizeof(EnhHeader));
if EnhHeader.dSignature <> ENHMETA_SIGNATURE then InvalidMetafile;
GetMem(Buf, EnhHeader.nBytes);
with FImage do
try
Move(EnhHeader, Buf^, Sizeof(EnhHeader));
Stream.ReadBuffer(PChar(Buf + Sizeof(EnhHeader))^,
EnhHeader.nBytes - Sizeof(EnhHeader));
FHandle := SetEnhMetafileBits(EnhHeader.nBytes, Buf);
if FHandle = 0 then InvalidMetafile;
FInch := 0;
with EnhHeader.rclFrame do
begin
FWidth := Right - Left; { in 0.01 mm units }
FHeight := Bottom - Top;
end;
Enhanced := True;
finally
FreeMem(Buf, EnhHeader.nBytes);
end;
end;
procedure TMetafile.ReadEMFStream(Stream: TStream);
var
EnhHeader: TEnhMetaheader;
Buf: PChar;
begin
NewImage;
Stream.ReadBuffer(EnhHeader, Sizeof(EnhHeader));
if EnhHeader.dSignature <> ENHMETA_SIGNATURE then InvalidMetafile;
if EnhHeader.nBytes < Sizeof(EnhHeader) then //追加
InvalidMetafile; //追加
GetMem(Buf, EnhHeader.nBytes);
with FImage do
try
Move(EnhHeader, Buf^, Sizeof(EnhHeader));
Stream.ReadBuffer(PChar(Buf + Sizeof(EnhHeader))^,
EnhHeader.nBytes - Sizeof(EnhHeader));
FHandle := SetEnhMetafileBits(EnhHeader.nBytes, Buf);
if FHandle = 0 then InvalidMetafile;
FInch := 0;
with EnhHeader.rclFrame do
begin
FWidth := Right - Left; { in 0.01 mm units }
FHeight := Bottom - Top;
end;
Enhanced := True;
finally
FreeMem(Buf, EnhHeader.nBytes);
end;
end;
procedure TBitmap.ReadDIB(Stream: TStream; ImageSize: LongWord; bmf: PBitmapFileHeader);
const
DIBPalSizes: array [Boolean] of Byte = (sizeof(TRGBQuad), sizeof(TRGBTriple));
var
DC, MemDC: HDC;
BitsMem: Pointer;
OS2Header: TBitmapCoreHeader;
BitmapInfo: PBitmapInfo;
ColorTable: Pointer;
HeaderSize: Integer;
OS2Format: Boolean;
BMHandle, OldBMP: HBITMAP;
DIB: TDIBSection;
Pal, OldPal: HPalette;
RLEStream: TStream;
vbmf: TBitmapFileHeader;
{$IFDEF LINUX}
I: Integer;
{$ENDIF}
begin
Pal := 0;
BMHandle := 0;
RLEStream := nil;
Stream.Read(HeaderSize, sizeof(HeaderSize));
OS2Format := HeaderSize = sizeof(OS2Header);
if OS2Format then HeaderSize := sizeof(TBitmapInfoHeader);
GetMem(BitmapInfo, HeaderSize + 12 + 256 * sizeof(TRGBQuad));
with BitmapInfo^ do
try
try
if OS2Format then // convert OS2 DIB to Win DIB
begin
Stream.Read(Pointer(Longint(@OS2Header) + sizeof(HeaderSize))^,
sizeof(OS2Header) - sizeof(HeaderSize));
FillChar(bmiHeader, sizeof(bmiHeader), 0);
with bmiHeader, OS2Header do
begin
biWidth := bcWidth;
biHeight := bcHeight;
biPlanes := bcPlanes;
biBitCount := bcBitCount;
end;
Dec(ImageSize, sizeof(OS2Header));
end
else
begin // support bitmap headers larger than TBitmapInfoHeader
Stream.Read(Pointer(Longint(BitmapInfo) + sizeof(HeaderSize))^,
HeaderSize - sizeof(HeaderSize));
Dec(ImageSize, HeaderSize);
if (bmiHeader.biCompression <> BI_BITFIELDS) and
(bmiHeader.biCompression <> BI_RGB) then
begin // Preserve funky non-DIB data (like RLE) until modified
RLEStream := TMemoryStream.Create;
// source stream could be unidirectional. don't reverse seek
if bmf = nil then
begin
FillChar(vbmf, sizeof(vbmf), 0);
vbmf.bfType := $4D42;
vbmf.bfSize := ImageSize + Cardinal(HeaderSize);
bmf := @vbmf;
end;
RLEStream.Write(bmf^, sizeof(bmf^));
RLEStream.Write(HeaderSize, sizeof(HeaderSize));
RLEStream.Write(Pointer(Longint(BitmapInfo) + sizeof(HeaderSize))^,
HeaderSize - sizeof(HeaderSize));
RLEStream.CopyFrom(Stream, ImageSize);
{ Cast ImageSize (long word) to integer to avoid integer overflow when negating. }
RLEStream.Seek(-Integer(ImageSize), soFromEnd);
Stream := RLEStream; // the rest of the proc reads from RLEStream
end;
end;
with bmiHeader do
begin
biSize := HeaderSize;
ColorTable := Pointer(Longint(BitmapInfo) + HeaderSize);
{ check number of planes. DIBs must be 1 color plane (packed pixels) }
if biPlanes <> 1 then InvalidBitmap;
// 3 DWORD color element bit masks (ie 888 or 565) can precede colors
// TBitmapInfoHeader sucessors include these masks in the headersize
if (HeaderSize = sizeof(TBitmapInfoHeader)) and
((biBitCount = 16) or (biBitCount = 32)) and
(biCompression = BI_BITFIELDS) then
begin
Stream.ReadBuffer(ColorTable^, 3 * sizeof(DWORD));
Inc(Longint(ColorTable), 3 * sizeof(DWORD));
Dec(ImageSize, 3 * sizeof(DWORD));
end;
// Read the color palette
if biClrUsed = 0 then
biClrUsed := GetDInColors(biBitCount);
Stream.ReadBuffer(ColorTable^, biClrUsed * DIBPalSizes[OS2Format]);
Dec(ImageSize, biClrUsed * DIBPalSizes[OS2Format]);
// biSizeImage can be zero. If zero or RGB, compute the size.
if (biSizeImage = 0) or (biCompression = BI_RGB) then // top-down DIBs have negative height
biSizeImage := BytesPerScanLine(biWidth, biBitCount, 32) * Abs(biHeight);
if biSizeImage < ImageSize then ImageSize := biSizeImage;
end;
{ 以下略 }
end;
procedure TBitmap.ReadDIB(Stream: TStream; ImageSize: LongWord; bmf: PBitmapFileHeader);
const
DIBPalSizes: array [Boolean] of Byte = (sizeof(TRGBQuad), sizeof(TRGBTriple));
var
DC, MemDC: HDC;
BitsMem: Pointer;
OS2Header: TBitmapCoreHeader;
BitmapInfo: PBitmapInfo;
ColorTable: Pointer;
HeaderSize: Integer;
OS2Format: Boolean;
BMHandle, OldBMP: HBITMAP;
DIB: TDIBSection;
Pal, OldPal: HPalette;
RLEStream: TStream;
vbmf: TBitmapFileHeader;
{$IFDEF LINUX}
I: Integer;
{$ENDIF}
begin
Pal := 0;
BMHandle := 0;
RLEStream := nil;
Stream.Read(HeaderSize, sizeof(HeaderSize));
OS2Format := HeaderSize = sizeof(OS2Header);
if OS2Format then HeaderSize := sizeof(TBitmapInfoHeader);
GetMem(BitmapInfo, HeaderSize + 12 + 256 * sizeof(TRGBQuad));
with BitmapInfo^ do
try
try
if OS2Format then // convert OS2 DIB to Win DIB
begin
Stream.Read(Pointer(Longint(@OS2Header) + sizeof(HeaderSize))^,
sizeof(OS2Header) - sizeof(HeaderSize));
FillChar(bmiHeader, sizeof(bmiHeader), 0);
with bmiHeader, OS2Header do
begin
biWidth := bcWidth;
biHeight := bcHeight;
biPlanes := bcPlanes;
biBitCount := bcBitCount;
end;
Dec(ImageSize, sizeof(OS2Header));
end
else
begin // support bitmap headers larger than TBitmapInfoHeader
Stream.Read(Pointer(Longint(BitmapInfo) + sizeof(HeaderSize))^,
HeaderSize - sizeof(HeaderSize));
Dec(ImageSize, HeaderSize);
if (bmiHeader.biCompression <> BI_BITFIELDS) and
(bmiHeader.biCompression <> BI_RGB) then
begin // Preserve funky non-DIB data (like RLE) until modified
RLEStream := TMemoryStream.Create;
// source stream could be unidirectional. don't reverse seek
if bmf = nil then
begin
FillChar(vbmf, sizeof(vbmf), 0);
vbmf.bfType := $4D42;
vbmf.bfSize := ImageSize + Cardinal(HeaderSize);
bmf := @vbmf;
end;
RLEStream.Write(bmf^, sizeof(bmf^));
RLEStream.Write(HeaderSize, sizeof(HeaderSize));
RLEStream.Write(Pointer(Longint(BitmapInfo) + sizeof(HeaderSize))^,
HeaderSize - sizeof(HeaderSize));
RLEStream.CopyFrom(Stream, ImageSize);
{ Cast ImageSize (long word) to integer to avoid integer overflow when negating. }
RLEStream.Seek(-Integer(ImageSize), soFromEnd);
Stream := RLEStream; // the rest of the proc reads from RLEStream
end;
end;
with bmiHeader do
begin
biSize := HeaderSize;
ColorTable := Pointer(Longint(BitmapInfo) + HeaderSize);
{ check number of planes. DIBs must be 1 color plane (packed pixels) }
if biPlanes <> 1 then InvalidBitmap;
// 3 DWORD color element bit masks (ie 888 or 565) can precede colors
// TBitmapInfoHeader sucessors include these masks in the headersize
if (HeaderSize = sizeof(TBitmapInfoHeader)) and
((biBitCount = 16) or (biBitCount = 32)) and
(biCompression = BI_BITFIELDS) then
begin
Stream.ReadBuffer(ColorTable^, 3 * sizeof(DWORD));
Inc(Longint(ColorTable), 3 * sizeof(DWORD));
Dec(ImageSize, 3 * sizeof(DWORD));
end;
// Read the color palette
if biClrUsed = 0 then
biClrUsed := GetDInColors(biBitCount);
if (biClrUsed * DIBPalSizes[OS2Format]) > (256 * SizeOf(TRGBQuad)) then //追加
InvalidGraphic({$IFNDEF CLR}@{$ENDIF}SInvalidBitmap); //追加
Stream.ReadBuffer(ColorTable^, biClrUsed * DIBPalSizes[OS2Format]);
Dec(ImageSize, biClrUsed * DIBPalSizes[OS2Format]);
// biSizeImage can be zero. If zero or RGB, compute the size.
if (biSizeImage = 0) or (biCompression = BI_RGB) then // top-down DIBs have negative height
biSizeImage := BytesPerScanLine(biWidth, biBitCount, 32) * Abs(biHeight);
if biSizeImage < ImageSize then ImageSize := biSizeImage;
end;
{ 以下略 }
end;