cs_grandvizir
Messages postés1106Date d'inscriptionsamedi 8 novembre 2003StatutMembreDernière intervention 3 septembre 200622 3 nov. 2004 à 10:46
Ca serait pas mal que [yvemoreau] ne parle pas uniquement en langage Delphi dans ses commentaires, ne sachant pas si ce qu'il propose est une répétition, une correction ou un bouleversement...
Sinon les informations fournies par ce programme sont très intéressantes. On peut de plus être sûr que ça fonctionne puisque quand on quitte sans avoir rien touché, ça surprend.
N'y a-t-il pas un risque de rester définitivement en écran noir si la résolution n'est pas supportée ? Ca m'était déjà arrivé manuellement.
lucn
Messages postés3Date d'inscriptionvendredi 4 juillet 2003StatutMembreDernière intervention13 février 2006 16 juin 2004 à 07:42
Je suis satisfait de la technique proposée.
Cependant j'ai un message de violation (77D676B1 dans le module user32.dll 008... (une suite de lettre et chiffre variant selon les essais) - ce qui n'empêche pas le changement de résolution.
J'ai un autre souci: à chaque changement de résolution, mon écran se trouve renverser à 180 degrés ou 90 degrés vers la droite ou la gauche (heuresement que je sais comment le remettre en place).
Je ne vois pas pourquoi ces phénomènes.
en tout cas encore merci
Lucien N°2
yvemoreau
Messages postés308Date d'inscriptionmardi 11 juin 2002StatutMembreDernière intervention26 septembre 2008 3 févr. 2003 à 02:34
dmDisplayFrequency :=0 ou 1 ;//spécifier la valeur par défaut du système(celle qui est utilisé donc pas d'erreur possibles).
cs_lucien
Messages postés82Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention 3 juin 2007 2 févr. 2003 à 19:42
Cette fois-ci ce sera bonsoir, :-)
Merci encore pour la richesse d'enseignement que contient le code proposé par Yves Moreau, du moins pour un vieux néophyte comme moi! Vieux, parce que retraité et néophyte parce que pratiquant Delphi depuis quelques mois...
Reste un pb! (quelle exigeance!)
GetDeviceCaps ne semble pas «savoir» reconnaître la fréquence de l'écran...si bien que l'analyse de EnumDisplaySettings a le choix entre 7 possibilités ( 60,65,70,72,75,100,120) proposées sous Win2K.
L'utilisateur peut ignorer les possibilités de son écran, aussi me suis-je retrouvé plusieurs fois devant un écran noir, à rebouter à froid...heureusement qu'il y a la possibilité de la dernière configuration valable!!!
Voilà où j'en suis: en bon chemin mais devant un pavé...
Merci d'avance à qui connaît la réponse
Lucien
cs_lucien
Messages postés82Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention 3 juin 2007 2 févr. 2003 à 10:50
Bonjour Yves,
J'ai trouvé ton message en arrivant sur le site, c'est avec une grande joie que je remercie les gens formidables comme toi, qui unissent l'humain et la technique.
Un grand merci
Lucien
ps: ce message sera peut-être un doublon, je pense m'être embrouillé quelque part...:)
yvemoreau
Messages postés308Date d'inscriptionmardi 11 juin 2002StatutMembreDernière intervention26 septembre 2008 2 févr. 2003 à 08:47
TForm1.FormCreate(Sender: TObject);
var
DevModeInfo: ^TDevMode;
valeur:PDeviceMode;
ModeChange: Longint;
begin
//ajouter au début si splash screen (l'écran tourne au noir le temps du changement) et le splash pas utilisé ?
try
ChangeSetting:=false;
DevModeCount := 0;
GetMem(DevModeInfo, SizeOf(TDevMode));
while EnumDisplaySettings(NIL, DevModeCount, DevModeInfo^) do
begin
Inc(DevModeCount);
if ( GetDeviceCaps(Canvas.Handle, HORZRES) =Trunc(DevModeInfo^.dmPelsWidth) )and
( GetDeviceCaps(Canvas.Handle, VERTRES) =Trunc(DevModeInfo^.dmPelsHeight) )and
( GetDeviceCaps(Canvas.Handle, BITSPIXEL)=Trunc(DevModeInfo^.dmBitsPerPel) )then
begin
DevModeActuel:=PDeviceModeA(DevModeInfo);
end;
GetMem(DevModeInfo, SizeOf(TDevMode));
end;
FreeMem(DevModeInfo, SizeOf(TDevMode));
NEW(valeur);
// valeur souhaiter
valeur^.dmFields :=DM_PELSWIDTH or DM_PELSHEIGHT;
valeur^.dmBitsPerPel :=32 ;//DWord 16 bit ,32 bit
valeur^.dmPelsWidth :=800;//DWord Largeur 800,1024
valeur^.dmPelsHeight :=600; ;//DWord Hauteur 600,768
valeur^.dmDisplayFlags :=0 ;//DWord
valeur^.dmDisplayFrequency :=60 ;//DWord 60 hertz //taux de rafr 60,75,100
valeur^.dmSize :=SizeOf(TDeviceMode); //Word
// si les valeurs DevModeActuel ne correspondent pas aux valeurs souhaiter
if ( GetDeviceCaps(Canvas.Handle, HORZRES)=Trunc(valeur^.dmPelsWidth) )and
( GetDeviceCaps(Canvas.Handle, VERTRES)=Trunc(valeur^.dmPelsHeight) )and
( GetDeviceCaps(Canvas.Handle, BITSPIXEL)=Trunc(valeur^.dmBitsPerPel) )then
else
begin
ChangeSetting:=true;// mémorise que l'on a changer pour On close
ModeChange:=ChangeDisplaySettings(valeur,CDS_TEST);
// si TEST pas réussi
if NOT ModeChange=DISP_CHANGE_SUCCESSFUL then
else ChangeDisplaySettings(valeur,CDS_UPDATEREGISTRY);
end;
except ;
end;
TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
ModeChange:Longint;
begin
if ChangeSetting=true then
begin
ModeChange:=ChangeDisplaySettings(Unit1.DevModeActuel,CDS_UPDATEREGISTRY);
if NOT ModeChange=DISP_CHANGE_SUCCESSFUL then
// au moins avertir l'utilisateur que l'on a assayer de rétablir ses résolutions !
application.MessageBox('Impossible de rétablir la résolution d''origine !','Erreur',mb_OK);
end;
end;
cs_lucien
Messages postés82Date d'inscriptionvendredi 27 décembre 2002StatutMembreDernière intervention 3 juin 2007 1 févr. 2003 à 19:28
Je viens de tester cette technique: elle me paraît intéressante voire
utile dans certains cas, pourtant, il manque deux éléments que je ne sais pas faire.
Le premier, mettre l'inddex de la liste sur la résolution détectée de l'utilisateur plutôt que sur zéro.
Le second, effectuer une vérification de faisabilité: je me suis retrouvé deux fois avec un écran noir! Seul un redémarrage à froid m'a permis de sortir de la situation. J'ai relu SDK, tenté la solution avec CDS_TEST
au lieu de CDS_UPDATEREGISTRY dans la fonction ChangeDisplaySettings, malheureusement, elle semble tester W et non le matériel.
Amicalement,
Lucien
3 nov. 2004 à 10:46
Sinon les informations fournies par ce programme sont très intéressantes. On peut de plus être sûr que ça fonctionne puisque quand on quitte sans avoir rien touché, ça surprend.
N'y a-t-il pas un risque de rester définitivement en écran noir si la résolution n'est pas supportée ? Ca m'était déjà arrivé manuellement.
16 juin 2004 à 07:42
Cependant j'ai un message de violation (77D676B1 dans le module user32.dll 008... (une suite de lettre et chiffre variant selon les essais) - ce qui n'empêche pas le changement de résolution.
J'ai un autre souci: à chaque changement de résolution, mon écran se trouve renverser à 180 degrés ou 90 degrés vers la droite ou la gauche (heuresement que je sais comment le remettre en place).
Je ne vois pas pourquoi ces phénomènes.
en tout cas encore merci
Lucien N°2
3 févr. 2003 à 02:34
2 févr. 2003 à 19:42
Merci encore pour la richesse d'enseignement que contient le code proposé par Yves Moreau, du moins pour un vieux néophyte comme moi! Vieux, parce que retraité et néophyte parce que pratiquant Delphi depuis quelques mois...
Reste un pb! (quelle exigeance!)
GetDeviceCaps ne semble pas «savoir» reconnaître la fréquence de l'écran...si bien que l'analyse de EnumDisplaySettings a le choix entre 7 possibilités ( 60,65,70,72,75,100,120) proposées sous Win2K.
L'utilisateur peut ignorer les possibilités de son écran, aussi me suis-je retrouvé plusieurs fois devant un écran noir, à rebouter à froid...heureusement qu'il y a la possibilité de la dernière configuration valable!!!
Voilà où j'en suis: en bon chemin mais devant un pavé...
Merci d'avance à qui connaît la réponse
Lucien
2 févr. 2003 à 10:50
J'ai trouvé ton message en arrivant sur le site, c'est avec une grande joie que je remercie les gens formidables comme toi, qui unissent l'humain et la technique.
Un grand merci
Lucien
ps: ce message sera peut-être un doublon, je pense m'être embrouillé quelque part...:)
2 févr. 2003 à 08:47
var
DevModeInfo: ^TDevMode;
valeur:PDeviceMode;
ModeChange: Longint;
begin
//ajouter au début si splash screen (l'écran tourne au noir le temps du changement) et le splash pas utilisé ?
try
ChangeSetting:=false;
DevModeCount := 0;
GetMem(DevModeInfo, SizeOf(TDevMode));
while EnumDisplaySettings(NIL, DevModeCount, DevModeInfo^) do
begin
Inc(DevModeCount);
if ( GetDeviceCaps(Canvas.Handle, HORZRES) =Trunc(DevModeInfo^.dmPelsWidth) )and
( GetDeviceCaps(Canvas.Handle, VERTRES) =Trunc(DevModeInfo^.dmPelsHeight) )and
( GetDeviceCaps(Canvas.Handle, BITSPIXEL)=Trunc(DevModeInfo^.dmBitsPerPel) )then
begin
DevModeActuel:=PDeviceModeA(DevModeInfo);
end;
GetMem(DevModeInfo, SizeOf(TDevMode));
end;
FreeMem(DevModeInfo, SizeOf(TDevMode));
NEW(valeur);
// valeur souhaiter
valeur^.dmFields :=DM_PELSWIDTH or DM_PELSHEIGHT;
valeur^.dmBitsPerPel :=32 ;//DWord 16 bit ,32 bit
valeur^.dmPelsWidth :=800;//DWord Largeur 800,1024
valeur^.dmPelsHeight :=600; ;//DWord Hauteur 600,768
valeur^.dmDisplayFlags :=0 ;//DWord
valeur^.dmDisplayFrequency :=60 ;//DWord 60 hertz //taux de rafr 60,75,100
valeur^.dmSize :=SizeOf(TDeviceMode); //Word
// si les valeurs DevModeActuel ne correspondent pas aux valeurs souhaiter
if ( GetDeviceCaps(Canvas.Handle, HORZRES)=Trunc(valeur^.dmPelsWidth) )and
( GetDeviceCaps(Canvas.Handle, VERTRES)=Trunc(valeur^.dmPelsHeight) )and
( GetDeviceCaps(Canvas.Handle, BITSPIXEL)=Trunc(valeur^.dmBitsPerPel) )then
else
begin
ChangeSetting:=true;// mémorise que l'on a changer pour On close
ModeChange:=ChangeDisplaySettings(valeur,CDS_TEST);
// si TEST pas réussi
if NOT ModeChange=DISP_CHANGE_SUCCESSFUL then
else ChangeDisplaySettings(valeur,CDS_UPDATEREGISTRY);
end;
except ;
end;
TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
ModeChange:Longint;
begin
if ChangeSetting=true then
begin
ModeChange:=ChangeDisplaySettings(Unit1.DevModeActuel,CDS_UPDATEREGISTRY);
if NOT ModeChange=DISP_CHANGE_SUCCESSFUL then
// au moins avertir l'utilisateur que l'on a assayer de rétablir ses résolutions !
application.MessageBox('Impossible de rétablir la résolution d''origine !','Erreur',mb_OK);
end;
end;
1 févr. 2003 à 19:28
utile dans certains cas, pourtant, il manque deux éléments que je ne sais pas faire.
Le premier, mettre l'inddex de la liste sur la résolution détectée de l'utilisateur plutôt que sur zéro.
Le second, effectuer une vérification de faisabilité: je me suis retrouvé deux fois avec un écran noir! Seul un redémarrage à froid m'a permis de sortir de la situation. J'ai relu SDK, tenté la solution avec CDS_TEST
au lieu de CDS_UPDATEREGISTRY dans la fonction ChangeDisplaySettings, malheureusement, elle semble tester W et non le matériel.
Amicalement,
Lucien