maxabbey
Messages postés11Date d'inscriptionsamedi 22 février 2003StatutMembreDernière intervention28 août 20031 14 juil. 2003 à 14:23
Salut à tous
Je travaille sous XP avec Delphi 7 Perso.
Chez moi le code ne fonctionne pas si je ne configure pas le fichier EXE compilé en mode compatibilité Windows 98 (option propre à XP pour faire tourner certains anciens programmes lorsqu'ils ne fonctionnent pas en temps normal sous cet OS)....
Si aucun mode de compatibilité n'est activé sous XP, le programme m'affiche un message d'erreur : "Runtime error 218 at 004033DB"... je n'ai jamais su comment décoder ce genre de messages :-
Par contre si le mode compatibilité est activé, ça fonctionne sans aucun problème. Pour le clignotement des LEDs du pavé numérique en tout cas, parce que mon lecteur de disquette ne s'allume pas du tout, lui, avec ou sans disquette.
A mon avis donc, ta source ne fonctionnera pas sous NT ou 2000... Car si un programme requiert le mode de compatibilité d'XP pour fonctionner, c'est qu'il ne fonctionne pas nativement sur les versions de Windows basées sur le noyau NT, à savoir NT, 2000 et XP...
J'espère que ces quelques renseignements vous seront utiles
Amicalement,
Maxime
------------------------------------------------------
Le site de mes logiciels gratuits et de mes musiques : http://www.arachnosoft.com Mon site 100% dédié à l'acteur Louis de Funès : http://www.fufuworld.fr.st
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 10 juil. 2003 à 02:12
l'adresse $60, c'est celle du gestionnaire d'entrée des touches du keyboard, j'ais mis "ESC" mais on peut ce servir de cette fonction avec toutes les touches genre "ESPACE" ==> VK_SPACE, en principe c'est compatible Win95/98/98SE pour XP je ne sais pas, mais comme XP possède je crois une protection NT... donc il faut tester.
BenXbox
Messages postés210Date d'inscriptionmercredi 5 juin 2002StatutMembreDernière intervention14 août 2007 9 juil. 2003 à 19:57
Vous pouvez pas mettre la source parce que je compile sa me dit : 1.exe introuvable sachant que le dpr je les nomer 1.dpr merci d'avance.
TheWhiteShadow
Messages postés135Date d'inscriptionmercredi 15 janvier 2003StatutMembreDernière intervention 7 avril 2006 9 juil. 2003 à 17:43
oui j'y ai pensé à SetKeyboardState(KeyState); malheureuseument cette procedure ne fonctionne que pour win95-98-98se. D'ailleurs i vous êtes sur un autre windows, essayez et dites nous...
Par contre la fonction pour le ESC est interessante... puorquoi $60 ? est-ce que ça marche partout dans windows ?
bgk: ah ouais j'connaissais pas while true do... c'est cool :)
cs_shining
Messages postés304Date d'inscriptionlundi 30 décembre 2002StatutMembreDernière intervention10 mars 2012 9 juil. 2003 à 12:10
program lights;
uses Windows;
type
TRegState=record
Capital,NumLock,ScrollLock,Disquette:Integer;
end;
loop = 0..1;
state = 1..4; //4 états possibles
const
DisqueCtrl = $03F2; //byte d'état du lecteur disquette
anim : array[1..4] of array[1..3] of boolean = (
(true,false,false), //animation des dels
(false,true,false), //Num, Caps et Lock du clavier
(false,false,true), //4 états possibles
(false,true,false));
var
i : loop;
keybd : state = 1;
RegS:TRegState;
KeyState : TKeyboardState;// statue des boutons
Stop:Boolean;
//{$APPTYPE CONSOLE}
//lecture
function PortIn(addr : word) : byte;
asm
mov dx,addr; //registre du CPU dx = adresse d'état du port
in al,dx; //on récupère l'état du registre et on le renvoi sur result soit INP=valeur du registre al
mov result,al; //la variable result recupère la valeur du registre al
end;
//écriture
procedure PortOut(addr : word; value : SmallInt);
asm
mov dx,addr; //registre dx = port
mov ax,value; //registre ax = la valeur à envoyer
out dx,al;
end;
procedure SaveStatue;
begin
// 0 = minuscule/Dévérouillé
// 1 = majuscule/Vérouillé
GetKeyBoardState(KeyState);// Lecture des états des Touches
RegS.Capital:=KeyState[VK_CAPITAL];//Touche Caps Lock
RegS.NumLock:=KeyState[VK_NUMLOCK];//Touche NumLock
RegS.ScrollLock:=KeyState[VK_SCROLL];//Touche Scroll Lock
end;
procedure ResetStatue;
begin
KeyState[VK_CAPITAL]:=0;
KeyState[VK_NUMLOCK]:=0;
KeyState[VK_SCROLL] :=0;
SetKeyBoardState(KeyState);
PortOut(DisqueCtrl,0);
end;
function GetKeyStop:Boolean;
begin
result:=(PortIn($60) and VK_ESCAPE=1);// TOUCHE ESC
end;
procedure Activate(Key: Integer; Active:Boolean);// NE MODIFIE QUE L'ETAT DE LA LED
begin
KeyState[Key]:=Integer(Active);
SetKeyboardState(KeyState);
end;
procedure Led(key : integer; activated : boolean);
begin
GetKeyBoardState(KeyState); //on lit l'état des touches
if (KeyState[key] = 1) <> activated then //si l'état actuel
begin //n'est pas comme celui voulu
keybd_event(key,0,0,0); //on appuie sur la touche
keybd_event(key,0,keyeventf_keyup,0); //pour le changer
end;
end;
begin
SaveStatue;
ResetStatue;
while GetKeyStop<>TRUE do
begin
PortOut(DisqueCtrl,(PortIn(DisqueCtrl) xor 16 ));
// LED du lecteur de Disquette initialisée à zero avec ResetStatue
//0 XOR 16=16
//16 XOR 16=0
Activate(VK_NUMLOCK,anim[keybd,1]); //clavier
Activate(VK_CAPITAL,anim[keybd,2]);
Activate(VK_SCROLL ,anim[keybd,3]);
inc(keybd); //on avance l'animation
if (keybd = 5) then keybd := 1; //rester dans 1..4
Sleep(300); //on attend 300 milisecondes
end;
RestoreStatue;// restaure l'ancien statue des touches(uniquement l'état des LEDs, dans cette exemple)
end.
PS: pour quitter il suffit de presser la touche "ESC"
cs_bgK
Messages postés131Date d'inscriptionvendredi 7 juin 2002StatutMembreDernière intervention19 janvier 2004 9 juil. 2003 à 08:41
Euh pour faire une boucle infinie, on a While True do , qui le fait aussi bien ...
14 juil. 2003 à 14:23
Je travaille sous XP avec Delphi 7 Perso.
Chez moi le code ne fonctionne pas si je ne configure pas le fichier EXE compilé en mode compatibilité Windows 98 (option propre à XP pour faire tourner certains anciens programmes lorsqu'ils ne fonctionnent pas en temps normal sous cet OS)....
Si aucun mode de compatibilité n'est activé sous XP, le programme m'affiche un message d'erreur : "Runtime error 218 at 004033DB"... je n'ai jamais su comment décoder ce genre de messages :-
Par contre si le mode compatibilité est activé, ça fonctionne sans aucun problème. Pour le clignotement des LEDs du pavé numérique en tout cas, parce que mon lecteur de disquette ne s'allume pas du tout, lui, avec ou sans disquette.
A mon avis donc, ta source ne fonctionnera pas sous NT ou 2000... Car si un programme requiert le mode de compatibilité d'XP pour fonctionner, c'est qu'il ne fonctionne pas nativement sur les versions de Windows basées sur le noyau NT, à savoir NT, 2000 et XP...
J'espère que ces quelques renseignements vous seront utiles
Amicalement,
Maxime
------------------------------------------------------
Le site de mes logiciels gratuits et de mes musiques : http://www.arachnosoft.com
Mon site 100% dédié à l'acteur Louis de Funès : http://www.fufuworld.fr.st
10 juil. 2003 à 02:12
9 juil. 2003 à 19:57
9 juil. 2003 à 17:43
Par contre la fonction pour le ESC est interessante... puorquoi $60 ? est-ce que ça marche partout dans windows ?
bgk: ah ouais j'connaissais pas while true do... c'est cool :)
9 juil. 2003 à 12:10
uses Windows;
type
TRegState=record
Capital,NumLock,ScrollLock,Disquette:Integer;
end;
loop = 0..1;
state = 1..4; //4 états possibles
const
DisqueCtrl = $03F2; //byte d'état du lecteur disquette
anim : array[1..4] of array[1..3] of boolean = (
(true,false,false), //animation des dels
(false,true,false), //Num, Caps et Lock du clavier
(false,false,true), //4 états possibles
(false,true,false));
var
i : loop;
keybd : state = 1;
RegS:TRegState;
KeyState : TKeyboardState;// statue des boutons
Stop:Boolean;
//{$APPTYPE CONSOLE}
//lecture
function PortIn(addr : word) : byte;
asm
mov dx,addr; //registre du CPU dx = adresse d'état du port
in al,dx; //on récupère l'état du registre et on le renvoi sur result soit INP=valeur du registre al
mov result,al; //la variable result recupère la valeur du registre al
end;
//écriture
procedure PortOut(addr : word; value : SmallInt);
asm
mov dx,addr; //registre dx = port
mov ax,value; //registre ax = la valeur à envoyer
out dx,al;
end;
procedure SaveStatue;
begin
// 0 = minuscule/Dévérouillé
// 1 = majuscule/Vérouillé
GetKeyBoardState(KeyState);// Lecture des états des Touches
RegS.Capital:=KeyState[VK_CAPITAL];//Touche Caps Lock
RegS.NumLock:=KeyState[VK_NUMLOCK];//Touche NumLock
RegS.ScrollLock:=KeyState[VK_SCROLL];//Touche Scroll Lock
end;
procedure RestoreStatue;
begin
// 0 = minuscule/Dévérouillé
// 1 = majuscule/Vérouillé
KeyState[VK_CAPITAL]:=RegS.Capital;
KeyState[VK_NUMLOCK]:=RegS.NumLock;
KeyState[VK_SCROLL] :=RegS.ScrollLock;
SetKeyboardState(KeyState);
PortOut(DisqueCtrl,0);
end;
procedure ResetStatue;
begin
KeyState[VK_CAPITAL]:=0;
KeyState[VK_NUMLOCK]:=0;
KeyState[VK_SCROLL] :=0;
SetKeyBoardState(KeyState);
PortOut(DisqueCtrl,0);
end;
function GetKeyStop:Boolean;
begin
result:=(PortIn($60) and VK_ESCAPE=1);// TOUCHE ESC
end;
procedure Activate(Key: Integer; Active:Boolean);// NE MODIFIE QUE L'ETAT DE LA LED
begin
KeyState[Key]:=Integer(Active);
SetKeyboardState(KeyState);
end;
procedure Led(key : integer; activated : boolean);
begin
GetKeyBoardState(KeyState); //on lit l'état des touches
if (KeyState[key] = 1) <> activated then //si l'état actuel
begin //n'est pas comme celui voulu
keybd_event(key,0,0,0); //on appuie sur la touche
keybd_event(key,0,keyeventf_keyup,0); //pour le changer
end;
end;
begin
SaveStatue;
ResetStatue;
while GetKeyStop<>TRUE do
begin
PortOut(DisqueCtrl,(PortIn(DisqueCtrl) xor 16 ));
// LED du lecteur de Disquette initialisée à zero avec ResetStatue
//0 XOR 16=16
//16 XOR 16=0
Activate(VK_NUMLOCK,anim[keybd,1]); //clavier
Activate(VK_CAPITAL,anim[keybd,2]);
Activate(VK_SCROLL ,anim[keybd,3]);
inc(keybd); //on avance l'animation
if (keybd = 5) then keybd := 1; //rester dans 1..4
Sleep(300); //on attend 300 milisecondes
end;
RestoreStatue;// restaure l'ancien statue des touches(uniquement l'état des LEDs, dans cette exemple)
end.
PS: pour quitter il suffit de presser la touche "ESC"
9 juil. 2003 à 08:41