Rund um die LCL und andere Komponenten
Mathias
Beiträge: 6918 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Fr 23. Okt 2020, 16:47
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) 99-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
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
Beitrag
von Winni » Fr 23. Okt 2020, 18:56
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: 6918 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » Fr 23. Okt 2020, 19:29
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: 582 Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 3.8
CPU-Target: 32+64bit
Wohnort: Dresden
Beitrag
von sstvmaster » Fr 23. Okt 2020, 21:01
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 3.8 (stable) + fpc 3.2.2 (stable)
- Lazarus 4.99 (trunk) + fpc 3.3.1 (main/trunk)
Mathias
Beiträge: 6918 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » So 25. Okt 2020, 15:17
Ich habe es mal mit einer direkten Vererbung von TForm probiert, dabei kommt bei Key immer noch 255.
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) 109-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
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
Beitrag
von Winni » So 25. Okt 2020, 15:57
Hi!
Auf jeden Fall mss mal KeyPreview der Form auf true gestellt werden.
Default ist false;
Winni
Mathias
Beiträge: 6918 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » So 25. Okt 2020, 16:46
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
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
Beitrag
von Winni » So 25. Okt 2020, 20:07
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: 6918 Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz
Beitrag
von Mathias » So 25. Okt 2020, 20:37
Genau dort hatte ich es gefunden
.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot