How to change video modes

unit VidMode;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ComCtrls;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Run: TButton;
    Test: TButton;
    Label2: TLabel;
    ComboBox1: TComboBox;
    procedure RunClick(Sender: TObject);
    procedure TestClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1   : TForm1;
  Modes   : Array[0..255] of TDevMode;
implementation
{$R *.DFM}
procedure TForm1.RunClick(Sender: TObject);
var
 DC      : THandle;  //
 Bits    : Integer;  //
 HRes    : Integer;  //
 VRes    : Integer;  //
 DM      : TDevMode; //
 ModeNum : LongInt;  //
 Ok      : Bool;
 I       : Byte;
begin
//
 DC    := Canvas.Handle;
 Bits  := GetDeviceCaps(DC, BITSPIXEL);
 HRes  := GetDeviceCaps(DC, HORZRES);
 VRes  := GetDeviceCaps(DC, VERTRES);
 Edit1.Text := Format('%d x %d, %d bits',[HRes, VRes, Bits]);
 ModeNum := 0;
 EnumDisplaySettings(Nil, ModeNum, DM);
 Modes[ModeNum] := DM; // Add to array
 Ok := True;
 While Ok do
  Begin
   Inc(ModeNum);
   Ok := EnumDisplaySettings(Nil, ModeNum, DM);
   Modes[ModeNum] := DM; // Add to array
  End;
// Now ModeNum contains # of supported modes
 For I := 0 to ModeNum-1 do
  Begin
    ComboBox1.Items.Add(Format('%d x %d, %d bits',
    [TDevMode(Modes[I]).dmPelsWidth,
     TDevMode(Modes[I]).dmPelsHeight,
     TDevMode(Modes[I]).dmBitsPerPel]));
    ComboBox1.ItemIndex := 0;
  End;
 end;
procedure TForm1.TestClick(Sender: TObject);
var
 NewMode  : TDevMode;
 ChResult : LongInt;
 Msg      : String;
// Mode is TDevMode(Modes[ListBox1.ItemIndex])
begin
 NewMode := TDevMode(Modes[ComboBox1.ItemIndex]);
 NewMode.dmDisplayFrequency := 0;
 NewMode.dmDisplayFlags :=
  DM_BITSPERPEL AND
  DM_PELSWIDTH  AND
  DM_PELSHEIGHT AND
  DM_DISPLAYFLAGS;
// In Win95 we should use CDS_UPDATEREGISTRY to change
// number of bits per pixel and resolution. Also we need
// to restart the computer to take effect of new settigs
 ChResult := ChangeDisplaySettings(NewMode, CDS_UPDATEREGISTRY);
 Msg := '';
 Case ChResult of
  DISP_CHANGE_SUCCESSFUL : Msg := 'Success';
  DISP_CHANGE_RESTART    : Msg := 'Restart';
  DISP_CHANGE_BADFLAGS   : Msg := 'Bad Flags';
  DISP_CHANGE_FAILED     : Msg := 'Failed';
  DISP_CHANGE_BADMODE    : Msg := 'Bad Mode';
  DISP_CHANGE_NOTUPDATED : Msg := 'Not updated';
 End;
 ShowMessage(Msg);
end;
end.