Avatar billede mbsnet Nybegynder
29. december 2008 - 03:17 Der er 5 kommentarer og
1 løsning

Alt-gr+noget key driller lidt i nedarvet komponent

Hej eksperter.

Roder med at lave et komponent som benytter sig af key-events, men kan ikke få det til at virke med ALTGR+noget. Hvis jeg eksempelvis skriver et dollar-tegn eller snabel-A, så modtager komponentet ikke noget. Alle andre tegn og bogstaver virker fint.

Det er et komponent som er nedarvet fra TCustomControl (visuelt). Modtager keypress ved at override:

protected
  procedure keyDown(var key:word;shift:tShiftState);override;
  procedure keyUp(var key:word;shift:tShiftState);override;
  procedure keyPress(var key:char);override;

Har prøvet at rode med ControlStyle property'en, men den vil ikke. Kan det måske være relateret til noget med genvejstaster?

//mbs
Avatar billede borrisholt Novice
29. december 2008 - 17:51 #1
Jeg har lige prøvet det følgende kode i Delphi 2009 :

unit Unit13;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, menus;

type
  TMyComponent = class(TPanel)
  protected
    procedure keyDown(var key: word; shift: tShiftState); override;
    procedure keyUp(var key: word; shift: tShiftState); override;
    procedure keyPress(var key: char); override;

  end;
  TForm13 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    Panel1: TMyComponent;
  public
    { Public declarations }
  end;

var
  Form13: TForm13;

implementation

{$R *.dfm}

{ TMyComponent }

procedure TMyComponent.keyDown(var key: word; shift: tShiftState);
begin
  inherited;
  Caption := IntToStr(Key);
end;

procedure TMyComponent.keyPress(var key: char);
begin
  inherited;
end;

procedure TMyComponent.keyUp(var key: word; shift: tShiftState);
begin
  inherited;

end;

procedure TForm13.FormCreate(Sender: TObject);
begin
  Panel1 := TMyComponent.Create(Self);
  with Panel1 do
  begin
    Name := 'Panel1';
    Parent := Self;
    Left := 128;
    Top := 144;
    Width := 185;
    Height := 41;
    Caption := 'Panel1';
    TabOrder := 0;
    SetFocus;
  end;
end;

end.


Det kører fint :D
Avatar billede mbsnet Nybegynder
30. december 2008 - 00:54 #2
Hej JB du har ret, tak - så det virker det også i min delphi7.

Jeg havde en boolean "ctrlIsDown", som blev sat af "keyUp" og "keyDown", og under "keyPress" en "exit" hvis den var "true".
Den åd åbenbart både "ctrl" og "alt-gr", så det var en F40-fejl fra min side :)

Du får points hvis du svarer,
//mbs

- "godt nytår i øvrigt".
Avatar billede borrisholt Novice
31. december 2008 - 09:28 #3
Tak skal du have ...

Bemærk ...

function IsAltGRPressed: boolean; VIRKER IKKE på et dansk keyborad. skal du lave noget advanceret keyboard styring skal du bruge GetKeyState til at finde ud af om feks ctrl er nede .. Ellers kan ALT løses med et keyboardhook :D

Hvis du er i tvivl om noget så spørg :D
Avatar billede borrisholt Novice
31. december 2008 - 09:30 #4
Jeg har en gang været ved at skrive noget runtime flyt/resize of komponenter, således hvis man holdte ctrl nede så kunne man flytte og hvis du holdt shift nede så kunne man resize, det blev styret således :

  case Msg.Message of
    WM_KEYUP, WM_SYSKEYUP, WM_KEYDOWN, WM_SYSKEYDOWN:
      begin
        FAllowMove := GetKeyState(VK_CONTROL) < -1;
        FAllowSize := GetKeyState(VK_SHIFT) < -1;

        if FAllowMove then
          FAllowSize := false;

        if FAllowSize then
          FAllowMove := false;
      end;
Jens B
Avatar billede mbsnet Nybegynder
31. december 2008 - 10:01 #5
Det ligner næsten noget jeg rodede med for lidt siden i forbindelse med caps,num,scroll lock. fandt ud af, at der også er forskel på om man skriver til NT eller 9x windows versionerne.

Det kan være jeg spørger mere til emnet igen, men indtil videre virker det fint :)
//mbs
Avatar billede mbsnet Nybegynder
10. marts 2009 - 09:35 #6
function keyIsDown(aKey:byte):boolean;
begin result:=getKeyState(aKey)<0 end;

function keyState(aKey:byte):boolean;
begin result:=getKeyState(aKey)=1 end;
//--
function mButLisDn:boolean;begin result:=keyIsDown(VK_LBUTTON) end;
function mButRisDn:boolean;begin result:=keyIsDown(VK_RBUTTON) end;
function mButMisDn:boolean;begin result:=keyIsDown(VK_MBUTTON) end;
function altIsDn:boolean;begin result:=keyIsDown(VK_MENU) end;
function ctrlIsDn:boolean;begin result:=keyIsDown(VK_CONTROL) end;
function shiftIsDn:boolean;begin result:=keyIsDown(VK_SHIFT) end;
function altGrIsDn:boolean;begin result:=keyIsDown(VK_RMENU) end;
function winLisDn:boolean;begin result:=keyIsDown(VK_LWIN) end;
function winRisDn:boolean;begin result:=keyIsDown(VK_RWIN) end;
function isCapsLocked:boolean;begin result:=keyState(VK_CAPITAL) end;
function isNumLocked:boolean;begin result:=keyState(VK_NUMLOCK) end;
function isScrollLocked:boolean;begin result:=keyState(VK_SCROLL) end;
function mousePos:tPoint;begin getCursorPos(result) end;
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Politiets Efterretningstjeneste

CNE-specialist til PET`s indhentningsafdeling

Politiets Efterretningstjeneste

AI/ML udvikler i PET

Netcompany A/S

IT Consultant

Capgemini Danmark A/S

Finance Lead (SAP)