Dynamisches Form, wieso kommt bei KeyDown immer 255

Rund um die LCL und andere Komponenten
Antworten
Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Dynamisches Form, wieso kommt bei KeyDown immer 255

Beitrag von Mathias »

Bei folgendem Miniprogramm, kommt bei KeyDown immer 255.
KeyPress funktioniert wie erwartet.
Probiert mit Linux.

Code: Alles auswählen

program Project1;
uses
  Interfaces, Forms, Controls, Classes;

type
  TApp = class(TObject)
  private
    Form: TForm;
    procedure KeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
    procedure KeyPress(Sender: TObject; var Key: char);
  public
    constructor Create;
    destructor Destroy; override;
    procedure Run;
  end;

  procedure TApp.KeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
  begin
    WriteLn(Key);
  end;

  procedure TApp.KeyPress(Sender: TObject; var Key: char);
  begin
    WriteLn(Key);
  end;

  constructor TApp.Create;
  begin
    inherited Create;
    Form := TForm.Create(nil);
    Form.OnKeyDown := @KeyDown;
    Form.OnKeyPress := @KeyPress;
  end;

  destructor TApp.Destroy;
  begin
    Form.Free;
    inherited Destroy;
  end;

  procedure TApp.Run;
  begin
    Form.ShowModal;
  end;

var
  App: TApp;
begin
  App := TApp.Create;
  App.Run;
  App.Free;
end.
Folgende Methoden funktionieren auch ohne Fehler:

Code: Alles auswählen

  Form.OnPaint := @FormPaint;
  Form.OnResize := @FormResize;
  Form.OnKeyPress := @FormKeyPress;
  Form.OnMouseDown := @FormMouseDown;
  Form.OnMouseMove := @FormMouseMove;
  Form.OnMouseUp := @FormMouseUp;   
Dateianhänge
test.zip
(104.34 KiB) 89-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Dynamisches Form, wieso kommt bei KeyDown immer 255

Beitrag von Winni »

Hi!

Ganz einfach: Deine App gründet auf TObject und nicht auf TForm.

TObject hat keine KeyDown/KeyUp/KeyPress event.
Im Ggs zur TForm.

Die KeyXXX events werden erst in der TWinControl eingeführt.

Entweder die Klasse wechseln .
Oder die Key events selber implementieren .

Dein Project war nicht zu öffnen.
Irgendwo muss man das Kompatibitäts-Bit setzen hab ich mal irgendwo diagonal gelesen.

Winni

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Dynamisches Form, wieso kommt bei KeyDown immer 255

Beitrag von Mathias »

Oder die Key events selber implementieren .
Das wäre die besze Lösung, aber ich habe keinen Ansatz, wie das geht.
Dein Project war nicht zu öffnen.
Irgendwo muss man das Kompatibitäts-Bit setzen hab ich mal irgendwo diagonal gelesen.
Lazarus trunk und stable sind nicht kompatibel.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Dynamisches Form, wieso kommt bei KeyDown immer 255

Beitrag von sstvmaster »

Winni hat geschrieben:
Fr 23. Okt 2020, 18:56
Dein Project war nicht zu öffnen.
Irgendwo muss man das Kompatibitäts-Bit setzen hab ich mal irgendwo diagonal gelesen.

Winni
Kann man hier im Trunk einstellen: viewtopic.php?p=117246#p117246
Damit läuft dann auch ein Trunk Projekt mit älteren Versionen.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Dynamisches Form, wieso kommt bei KeyDown immer 255

Beitrag von Mathias »

Ich habe es mal mit einer direkten Vererbung von TForm probiert, dabei kommt bei Key immer noch 255. :roll:

Code: Alles auswählen

uses {$IFDEF UNIX} {$IFDEF UseCThreads}
  cthreads, {$ENDIF} {$ENDIF}
  Interfaces, Classes, SysUtils, Forms, Controls, Graphics, Dialogs, ExtCtrls, StdCtrls;

type
  TMyForm = class(TForm)
  private
    procedure FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
    procedure FormKeyPress(Sender: TObject; var Key: char);
  public
    constructor Create(TheOwner: TComponent); override;
  end;

  { TMyForm }

  procedure TMyForm.FormKeyDown(Sender: TObject; var Key: word; Shift: TShiftState);
  begin
    WriteLn(Key);  // kommt immer 255
  end;

  procedure TMyForm.FormKeyPress(Sender: TObject; var Key: char);
  begin
    WriteLn(Key);  // geht
  end;

  constructor TMyForm.Create(TheOwner: TComponent);
  begin
    inherited Create(TheOwner);
    OnKeyDown := @FormKeyDown;
    OnKeyPress := @FormKeyPress;
  end;

var
  App: TMyForm;

begin
  App := TMyForm.Create(nil);
  App.ShowModal;
  App.Free;
end.
Dateianhänge
Fensterverwaltung_xxx.zip
(3.9 KiB) 97-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Dynamisches Form, wieso kommt bei KeyDown immer 255

Beitrag von Winni »

Hi!

Auf jeden Fall mss mal KeyPreview der Form auf true gestellt werden.
Default ist false;

Winni

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Dynamisches Form, wieso kommt bei KeyDown immer 255

Beitrag von Mathias »

Danke für die Info, habe unterdessen den Fehler selbst gefunden.

Mit "Application.Initialize" geht es, wieso auch immer.

Code: Alles auswählen

var
  App: TMyForm;

begin
  Application.Initialize; // Muss eingefügt werden.
  App := TMyForm.Create(nil);
  App.ShowModal;
  App.Free;
end.  
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
Winni
Beiträge: 1577
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Dynamisches Form, wieso kommt bei KeyDown immer 255

Beitrag von Winni »

Hi!

Dann guck Dir doch mal an, wie eine "normale" lpr Datei aussieht, z.B.:

Code: Alles auswählen

program CssValues;
{$mode objfpc}{$H+}

uses
   {$IFDEF UNIX}{$IFDEF UseCThreads}
   cthreads,
   {$ENDIF}{$ENDIF}
   Interfaces, // this includes the LCL widgetset
   Forms,
   { you can add units after this }
   CssValues1;

{$R *.res}

begin
   RequireDerivedFormResource:=True;
   Application.Scaled:=True;
   Application.Initialize;
   Application.CreateForm(TForm1, Form1);
   Application.Run;
end.    
Immer in dieser Reihenfolge:

Code: Alles auswählen

Application.Initialize;
Application.CreateForm;
Application.Run;
Winni

Mathias
Beiträge: 6193
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Dynamisches Form, wieso kommt bei KeyDown immer 255

Beitrag von Mathias »

Genau dort hatte ich es gefunden 😉.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten