AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Tastatureingabe KeyDown Firemonkey - Android
Thema durchsuchen
Ansicht
Themen-Optionen

Tastatureingabe KeyDown Firemonkey - Android

Ein Thema von Tinko · begonnen am 18. Nov 2016 · letzter Beitrag vom 18. Nov 2016
Antwort Antwort
Tinko

Registriert seit: 23. Jan 2014
6 Beiträge
 
Delphi 10.1 Berlin Professional
 
#1

Tastatureingabe KeyDown Firemonkey - Android

  Alt 18. Nov 2016, 18:48
Gibt es einen Weg in einem TEdit oder TMemo in Firemonkey (Berlin - Update2) -> Android die Tastaturanschläge des Virtual Keyboards auszuwerten?

So möchte ich z.B. Satzzeichen ignorieren können oder per RETURN-Taste den Focus auf das nächste Control setzen.

Vermutlich müsste ein Listener implementiert werden, aber man findet darüber fast nichts im Netz.

Geändert von Tinko (18. Nov 2016 um 18:53 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Tastatureingabe KeyDown Firemonkey - Android

  Alt 18. Nov 2016, 19:12
Ich weiß nicht, ob es einen eleganteren Weg gibt, aber ich untersuche den Text immer im OnChangeTracking-Event und lösche dann ggf. ungültige Zeichen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Tinko

Registriert seit: 23. Jan 2014
6 Beiträge
 
Delphi 10.1 Berlin Professional
 
#3

AW: Tastatureingabe KeyDown Firemonkey - Android

  Alt 18. Nov 2016, 23:34
Vielen Dank. OK, das sieht dann etwa so aus:

Delphi-Quellcode:
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.Controls.Presentation, FMX.Edit, FMX.ScrollBox, FMX.Memo, FMX.StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
    procedure Edit1ChangeTracking(Sender: TObject);
    procedure Memo1ChangeTracking(Sender: TObject);
    procedure Memo1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
    procedure HandleKeyEvent(Sender: TObject);
    procedure Edit1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
  private
    { Private-Deklarationen }

  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.FMX}

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  // HardKeys abrufen
  // Key := 0;
  // KeyChar := #0;
end;

procedure TForm1.Edit1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  // Return-key pressed
  if (Key = 13) or (Key = 10) then
    showmessage('KeyDownEvent Key=' + inttostr(Key) + ', KeyChar=' + KeyChar);
end;

procedure TForm1.Edit1ChangeTracking(Sender: TObject);
begin
  HandleKeyEvent(Sender); // or define in object inspector + code in onKeyDown-Event!!!
  // ... other code
end;

procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word; var KeyChar: Char; Shift: TShiftState);
begin
  // Return-key pressed
  if (Key = 13) or (Key = 10) then
    showmessage('KeyDownEvent Key=' + inttostr(Key) + ', KeyChar=' + KeyChar);
end;

procedure TForm1.Memo1ChangeTracking(Sender: TObject);
begin
  HandleKeyEvent(Sender);
  // ... other code
end;

procedure TForm1.HandleKeyEvent(Sender: TObject);
var
  i: integer;
  t: string;
  tempText: string;
  Key: Word;
  KeyChar: Char;
begin

{$IFDEF Android}
  // Detect #10 and #13 line breaks
  Key := 0;
  KeyChar := #0;

  if (Sender is TEdit) then
    t := (Sender as TEdit).Text;
  if (Sender is TMemo) then
    t := (Sender as TMemo).Text;

  // Detect line breaks #10 or #13
  tempText := '';
  if Length(t) > 0 then
  begin
    i := Low(t);
    while i <= High(t) do
    begin
      if (t[i] = #13) or (t[i] = #10) then
      begin
        Key := ord(t[i]); // 13 or 10
        KeyChar := t[i]; // #13 or #10
      end
      else
        tempText := tempText + t[i];
      inc(i);
    end;

    if (Key <> 0) then
    begin
      if (Sender is TEdit) then
      begin
        (Sender as TEdit).Text := tempText;
        if assigned((Sender as TEdit).OnKeyDown) then
          (Sender as TEdit).OnKeyDown(Sender, Key, KeyChar, []);
      end;
      if (Sender is TMemo) then
      begin
        (Sender as TMemo).Text := tempText;
        if assigned((Sender as TMemo).OnKeyDown) then
          (Sender as TMemo).OnKeyDown(Sender, Key, KeyChar, []);
      end;
    end;
  end;
{$ENDIF}
end;

end.
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz