ABCDEFGHIJKLMNOPQRSTUVWXYZ

cs_bgK Messages postés 131 Date d'inscription vendredi 7 juin 2002 Statut Membre Dernière intervention 19 janvier 2004 - 9 juil. 2003 à 08:41
maxabbey Messages postés 11 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 28 août 2003 - 14 juil. 2003 à 14:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/12646-abcdefghijklmnopqrstuvwxyz

maxabbey Messages postés 11 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 28 août 2003 1
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és 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 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és 210 Date d'inscription mercredi 5 juin 2002 Statut Membre Dernière intervention 14 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és 135 Date d'inscription mercredi 15 janvier 2003 Statut Membre Derniè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és 304 Date d'inscription lundi 30 décembre 2002 Statut Membre Dernière intervention 10 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 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"
cs_bgK Messages postés 131 Date d'inscription vendredi 7 juin 2002 Statut Membre Dernière intervention 19 janvier 2004
9 juil. 2003 à 08:41
Euh pour faire une boucle infinie, on a While True do , qui le fait aussi bien ...
Rejoignez-nous