Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разрешение экрана [D6, Win95/98]


France ©   (2003-03-04 10:03:00) 

Всем привет! У меня такая ситуация. Мне нужно в процессе работы приложения поменять разрешение экрана. Нашел такую функцию:

function SetResolution(Width,Height,Color:integer):Boolean;
var
DeviceMode : TDevMode;
begin
with DeviceMode do
begin
dmSize:=SizeOf(DeviceMode);
dmBitsPerPel:=Color;
dmPelsWidth:=Width;
dmPelsHeight:=Height;
dmFields:=DM_BITSPERPEL or DM_PELSWIDTH or DM_PELSHEIGHT;
Result:=False;
if ChangeDisplaySettings(DeviceMode,CDS_TEST or CDS_FULLSCREEN) <> DISP_CHANGE_SUCCESSFUL
then Exit;
Result:=ChangeDisplaySettings(DeviceMode,CDS_FULLSCREEN) = DISP_CHANGE_SUCCESSFUL;
end;
end;

Она работает нормально. Но вернуть прежнее разрешение экрана процедурой
procedure RestoreDefaultResolution;
var
W : TDevMode absolute 0;
begin
ChangeDisplaySettings( W, CDS_FULLSCREEN);
end;

никак не получается. Выдает ошибку в строке W : TDevMode absolute 0; "Variable name expected".

Может, кто советом каким поможет...

P.S. В D3 работало нормально. А в D6 не работает.


theodor_iv   (2003-03-04 18:34:00) [1]

А что это все так прицепились к этому absolute? Вы передаете функции ChangeDisplaySettings указатель на ноль, а документация к WinAPI говорит, что ей нужен указатель = nil.

Вот два более простых и корректных способа решения этой проблемы:

1-й способ:

//немножко асма...
procedure RestoreDefaultResolution;
asm
push CDS_FULLSCREEN
push 0
call ChangeDisplaySettings
end;


2-й способ:

// объявим функцию по-человечески
function ChangeDisplaySettings(lpDevMode: PDeviceMode; dwFlags: DWORD): Longint; stdcall; external user32 name "ChangeDisplaySettingsA";
// и все дела!
procedure RestoreDefaultResolution;
begin
ChangeDisplaySettings(nil, CDS_FULLSCREEN);
end;


DarkGreen   (2003-03-04 13:15:00) [2]

2 France (04.03.03 11:27)
> Вот что я делал:
> procedure RestoreDefaultResolution;
> const
> k = 0;
> var

:-) А разве К - переменная?


cobalt   (2003-03-04 12:13:00) [3]

Гы.
If lpDevMode is NULL, all the values currently in the registry will be used for the display setting. Passing NULL for the lpDevMode parameter is the easiest way to return to the default mode after a dynamic mode change.


France   (2003-03-04 11:33:00) [4]

УРА!!!!!! ЗАРАБОТАЛО!!!!!!!!!!
Вообщем так, кому надо, берите на заметку:

var
Form1: TForm1;
k : integer = 0; // <--- в этом месте объявляем переменную

implementation

{$R *.dfm}

procedure RestoreDefaultResolution;
//восстанавливаем прежнее разрешение
var
W : TDevMode absolute k;
begin
ChangeDisplaySettings( W, CDS_FULLSCREEN);
end;


France   (2003-03-04 11:27:00) [5]

2DarkGreen © (04.03.03 11:16)
> Почитай хелп по absolute
> В 6 делфях директива absolute работает только с переменными

Читал и помощь и переменные объявлял... Может не так объявлял?
Вот что я делал:
procedure RestoreDefaultResolution;
const
k = 0;
var
W : TDevMode absolute k;
begin
ChangeDisplaySettings( W, CDS_FULLSCREEN);
end;

Не помогло...


DarkGreen   (2003-03-04 11:16:00) [6]

2 France (04.03.03 10:03)
Почитай хелп по absolute
В 6 делфях директива absolute работает только с переменными


France   (2003-03-04 10:21:00) [7]

2Style (04.03.03 10:15)
> А можеть это из-за типа данных Absolute

Может... А лечить-то чем? :(( Хотелось бы услышать владельцев D6. Что они скажут?


Style   (2003-03-04 10:15:00) [8]

В D5 работает! может у тебя какой глюк?
А можеть это из-за типа данных Absolute

W : TDevMode absolute 0;


Наверх

Титульная страница Поиск, карта сайта Написать письмо