「プログラミング」カテゴリーアーカイブ

Delphi6 のバグ

いまだに Delphi6 を使っているのですが、Screen 変数の MonitorCount プロパティでバグを見つけました。ということでその対処方法を自分用にメモ。

Delphi6 で作ったアプリケーションの実行中にシングルモニタからデュアルモニタ、またはその逆に切り替えても、Screen.MonitorCount プロパティはアプリケーション起動時のモニタの数しか返しません。すなわちシングルモニタ時にアプリケーションを起動し、デュアルモニタに切り替えた後に Screen.MonitorCount を参照しても 1 のままなのですよね。

では Forms.pas を編集。

これがオリジナル

function TScreen.GetMonitorCount: Integer;
begin
if FMonitors.Count = 0 then
Result := GetSystemMetrics(SM_CMONITORS)
else
Result := FMonitors.Count;
end;

これを以下のように変更

function TScreen.GetMonitorCount: Integer;
var
i: Integer;
begin
if FMonitors.Count <> GetSystemMetrics(SM_CMONITORS) then
begin
for i:=0 to FMonitors.Count-1 do
TMonitor(FMonitors[i]).Free;
FMonitors.Clear;
EnumDisplayMonitors(0, nil, @EnumMonitorsProc, LongInt(FMonitors));
end;
Result := FMonitors.Count;
end;

dcc32 -R”C:\Program Files\Borland\Delphi6\Lib” Forms.pas でコンパイルして、出来上がった Forms.dcu を以下のフォルダにコピー。(オリジナルのDCUは保存しておく)

C:\Program Files\Borland\Delphi6\Lib
C:\Program Files\Borland\Delphi6\Lib\Debug