Touche supprimer sans timer [Résolu]

Signaler
Messages postés
259
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
22 novembre 2010
-
Messages postés
259
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
22 novembre 2010
-
Bonjour,


Voilà je cherche un moyen d'utiliser la touche "Suppr" (VK_DELETE) pour supprimer une ligne dans un TDBGrid qui contient une base de donnée.


J'ai trouvé le moyen de le faire avec un timer, mais malheureusement cela ne me plait pas beaucoup.


Voici mon code :


**************************************************************************************


procedure TFiche.Supprimer1Click(Sender: TObject);
var
  rep : integer;
begin
 rep:= MessageBox(Handle,'Etes-vous sûr de vouloir supprimer cet enregistrement ?','Avertissement',MB_OKCANCEL or MB_ICONSTOP ) ;
 if (rep =IDOK)
     //Si réponse OK Suppression de l'enregistrement
  then Table_emprunt.Delete;
end;


procedure TFiche.Timer1Timer(Sender: TObject);
begin
  if (GetKeyState(VK_DELETE) < 0) and (Suppr = 0) then
  begin
    Suppr := 1;
    Supprimer1Click(Sender);
    Suppr := 0;
    Timer1.Enabled := False;
  end;
end;


procedure TFiche.Fiche_empruntCellClick(Column: TColumn);
var
  rep: Integer;
begin
  Timer1.Enabled := True;
end;


**************************************************************************************


Ce code fonctionne parfaitement mais les problèmes sont les suivants :


 - Si je clique sur Annuler et que je fais à nouveau la touche Suppr rien ne se produit parceque la cellule est déjà sélectionnée. En effet comme vous pouvez le voir sur la source ci-dessus, je réenclenche le timer à chaque nouvelle sélection d'une cellule.
 - Si je clique sur Oui, j'ai le même problème que précédemment


 - Pourquoi utiliser un déclenchement du Timer ? Pour utiliser le moins possible de ressources


J'aimerais donc savoir s'il y'avait un autre moyen de le faire ?


J'ai beau chercher avec la procedure KeyPress je n'arrive pas à arriver à mes fins correctement.


Merci d'avance

7 réponses

Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
29
Salut,

L'évènement OnKeyPress est plus destiné à gérer les touches renvoyant un caractère.
Au lieu de cela, utilises les évènements OnKeyDown ou OnKeyUp pour gérer les touches ne renvoyant pas de caractère affichable :

procedure TForm1.DBGrid1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if Key =  VK_DELETE then
 if  MessageDlg('Etes-vous sûr de vouloir supprimer cet enregistrement ?',mtWarning, mbOKCANCEL, 0 )  = IdOK then
   //Table1.Delete;
   ShowMessage('Emprunt supprimé');
end;

et tu verras que tout ira mieux !

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
3874
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
7 novembre 2014
11
Je ne crois pas avoir tout compris... Tu veux donner la possibilité à
l'utilisateur de faire une opération qu'il appuie sur la touche suppr,
ou qu'il clique sur un bouton, c'est bien ça ?


Il existe des composants (TActionList, TActionManager sur une pro) qui
permet de centraliser les actions. Par exemple, on peut associer un
raccourcie clavier, un item de menu, et bouton de barre d'outil à la
même routine.


Pour savoir ton TDBGrid à le focus, tu peux tester sa propriété GotFocus.


Mais dans ton cas... Pourquoi ne pas simplement utiliser l'événement OnKeyPress du TDBGrid ?????
Messages postés
259
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
22 novembre 2010
2
J'utilise la version Entreprise de Delphi 7, donc je devrais logiquement trouver les composants que tu m'as cité.

Ensuite tu n'as pas du lire entièrement mon texte, car j'ai écrit ceci :

J'ai beau chercher avec la procedure KeyPress je n'arrive pas à arriver à mes fins correctement.

Donc si j'ai voulu le faire mais cela ne foncitonne pas, donc je ne sais pas comment faire voilà pouruqoi je demande votre aide.

Si vous avez d'autres idées s'ilv sou plait faites moi signe !

Je vous tiendrez au courant de mon avancé dans les composants cité ci-dessus et si je trouve une solution correcte.

@+
Messages postés
4202
Date d'inscription
samedi 16 octobre 2004
Statut
Modérateur
Dernière intervention
13 juin 2020
33
if windows.GetAsyncKeyState(VK_DELETE) < 0 then ...
Messages postés
259
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
22 novembre 2010
2
alors ca ca m'aide pas le moins du monde...

J'en fais quoi je le met ou, etc ?

Parceque là j'ai essayé de le mettre avec ma source un peu plus haut fonctionne pas, avec la procedure OnKeyPress, fonctione pas non plus donc bon...

Ensuite j'ai pas trouvé pour la propriété GotFocus ou GetFocus je n'ai pas trouvé, et pour le TAcionList je l'ai trouvé mais il ne m'arrange en rien du tout...
Messages postés
4297
Date d'inscription
samedi 19 janvier 2002
Statut
Modérateur
Dernière intervention
9 janvier 2013
29
Je reviens aussi sur une de tes phrases : "Pourquoi utiliser un déclenchement du Timer ? Pour utiliser le moins possible de ressources"
C'est précisément le contraire qui se passe. Souviens-toi de ce que je t'ai dit sur MSN, il n'y a pas très longtemps, sur un de tes projets. Oublie les TTimer, ce n'est ni  la panacée ni un moyen de régler tes problèmes de structuration du code. Ca ne t'amènera que des complications et des effets de bord inattendus.

May Delphi be with you !
<hr color="#008000" />
Pensez à cliquer sur Réponse acceptée lorsque la réponse vous convient.
Messages postés
259
Date d'inscription
samedi 13 décembre 2003
Statut
Membre
Dernière intervention
22 novembre 2010
2
Merci DelphiProg pour tes réponses !

En effet je viens de me rendre compte que j'ai oublier un mot, c'est justement à propos de cette conversation que ne souhaites plus utiliser (ou le moins possible) de Timer.

Ma question était donc en réalité "Pourquoi NE PAS utiliser un déclenchement du Timer ? Pour utiliser le moins possible de ressources".

Merci beaucoup pour ta réponse !