[Delphi] Hoe toetsen uitschakelen van een control?

Pagina: 1
Acties:

  • Mr_Blobby
  • Registratie: Mei 2000
  • Laatst online: 13-09 12:53
Hoe kan ik voor een control op een form bepaalde toetsen opvangen en uitschakelen,
zodat ze geen effect hebben op het control?

en zij zagen niet hoe spot in mij worstelde met verdriet


  • cimbom
  • Registratie: Juni 2001
  • Laatst online: 26-04-2024

cimbom

Just Kidding

OnKeyDown event gebruiken...
Daar kijk je welke toets ingedrukt is. Kun je ervoor zorgen dat er niks gebeurt

  • BM
  • Registratie: September 2001
  • Laatst online: 20:46

BM

Admin Softe Goederen
code:
1
2
3
4
5
procedure TForm1.Edit1KeyPress(Sender: TObject;
  var Key: Char);
begin
  if (Key<'0') or (Key > '9')then Key:=Chr(0);
end;

OnKeyPress werkt volgens mij ook... Hij accepteerd nu iig alleen nog maar nummertjes :)

Xbox
Even the dark has a silver lining


Verwijderd

Op woensdag 19 december 2001 18:20 schreef SpeedAddict het volgende:
code:
1
2
3
4
5
procedure TForm1.Edit1KeyPress(Sender: TObject;
  var Key: Char);
begin
  if (Key<'0') or (Key > '9')then Key:=Chr(0);
end;

OnKeyPress werkt volgens mij ook... Hij accepteerd nu iig alleen nog maar nummertjes :)
Bij de OnKeyDown kun je heel veel toetsen afvangen (incl. delete/home/page down etc.) Wil je bijvoorbeeld dat er alleen nummertjes (0..9, - en . of ,) worden ingevoerd en dat gewoon kan worden genavigeerd en verwijderd dan kun je beter reageren op de OnKeyPress event. Deze geeft alleen ASCII-characters mee. Je zou de volgende code kunnen proberen om het verschil tussen OnKeyDown en OnKeyPress te zien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if (Key=VK_F5) or ((Key=VK_RETURN) and (ssCtrl in Shift)) then
    Form2.ShowModal;
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
  if not (Key in ['0'..'9', '-', DecimalSeparator, #8]) then
    Key:=#0;
end;

Suc6

  • Mr_Blobby
  • Registratie: Mei 2000
  • Laatst online: 13-09 12:53
Dank voor de suggesties, maar helaas zit de oplossing er niet bij.

Ik probeer nu via het KeyDown event de control toets uit te schakelen, maar de Shift parameter die wordt meegegeven met dit event is geen variabele en kan ik dus niet aanpassen.

Iemand nog een idee?

en zij zagen niet hoe spot in mij worstelde met verdriet


Verwijderd

Op vrijdag 21 december 2001 10:06 schreef Mr_Blobby het volgende:
Dank voor de suggesties, maar helaas zit de oplossing er niet bij.

Ik probeer nu via het KeyDown event de control toets uit te schakelen, maar de Shift parameter die wordt meegegeven met dit event is geen variabele en kan ik dus niet aanpassen.

Iemand nog een idee?
CTRL toets is idd. niet af te vangen op die manier, 'k ga ff zoeken. Gevonden:
code:
1
2
3
4
   if Odd(GetKeyState(VK_CAPITAL)) then
    ShowMessage('CAPS LOCK ON')
   else
    ShowMessage('CAPS LOCK OFF');

Dit voorbeeld werkt met de CAPS en kan bijv. in een timer gebruikt worden (VK_CAPTIAL vervangen door zoiets als VK_CONTROL/VK_CTRL o.i.d.).

Als je timers niet mooi vindt gebruik dan bijv. actionupdate als met Delphi 4 of hoger werkt.

Of Application.OnIdle (vanaf Delphi 5). Pas wel op met het implementeren van deze eventhandler!

Suc6

Verwijderd

Op vrijdag 21 december 2001 12:37 schreef hvdberg het volgende:

[..]

CTRL toets is idd. niet af te vangen op die manier, 'k ga ff zoeken. Gevonden:
code:
1
2
3
4
   if Odd(GetKeyState(VK_CAPITAL)) then
    ShowMessage('CAPS LOCK ON')
   else
    ShowMessage('CAPS LOCK OFF');

Dit voorbeeld werkt met de CAPS en kan bijv. in een timer gebruikt worden (VK_CAPTIAL vervangen door zoiets als VK_CONTROL/VK_CTRL o.i.d.).

Als je timers niet mooi vindt gebruik dan bijv. actionupdate als met Delphi 4 of hoger werkt.

Of Application.OnIdle (vanaf Delphi 5). Pas wel op met het implementeren van deze eventhandler!

Suc6
Als ik alles goed begrepen heb is dit volgende voorbeeld precies wat je bedoeld:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    procedure AppIdle(Sender: TObject; var Done: Boolean);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.AppIdle(Sender: TObject; var Done: Boolean);
var
  KS: TKeyboardState;
begin
  if Odd(GetAsyncKeyState(VK_CONTROL)) then
  begin
    Caption := 'Control key down; SetAsyncKeyState';
    FillChar(KS, 256, #0);
    SetKeyboardState(KS);
    if not (Odd(GetAsyncKeyState(VK_CONTROL))) then
    ShowMessage('It worked');
  end else
    Caption := 'Control key up';
  Done:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.OnIdle := AppIdle;
end;

end.

Als de Button1 éénmaal ingedrukt is zal het formulier 'reageren' op de CTRL-toets.

  • Mr_Blobby
  • Registratie: Mei 2000
  • Laatst online: 13-09 12:53
Als ik de code zo lees zou het moeten werken.
Ik ga het thuis uitproberen.

Bedankt!

en zij zagen niet hoe spot in mij worstelde met verdriet

Pagina: 1